summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Fischer <joeljfischer@gmail.com>2021-10-27 08:44:32 -0700
committerGitHub <noreply@github.com>2021-10-27 08:44:32 -0700
commite180db39aeac6d44df0c063fd6753316197184a9 (patch)
tree651dad6c40c3ef13780ce8a7b65451e468a5d46a
parente05d6132205b926d14e574b2a5118161c60588d7 (diff)
parent53b0da2b58de52ce46f777d5acb4ecada4158ad2 (diff)
downloadsdl_ios-e180db39aeac6d44df0c063fd6753316197184a9.tar.gz
Merge pull request #2046 from smartdevicelink/develop7.3.0
v7.3.0 Release
-rw-r--r--.github/workflows/test.yml2
-rw-r--r--CHANGELOG.md48
-rw-r--r--Cartfile.private2
-rw-r--r--Example Apps/Example ObjC/Base.lproj/ConnectionIAPTableViewController.storyboard65
-rw-r--r--Example Apps/Example ObjC/Base.lproj/ConnectionTCPTableViewController.storyboard128
-rw-r--r--Example Apps/Example ObjC/Base.lproj/Main.storyboard246
-rw-r--r--Example Apps/Example ObjC/ConnectionAnimatedTransition.h12
-rw-r--r--Example Apps/Example ObjC/ConnectionAnimatedTransition.m43
-rw-r--r--Example Apps/Example ObjC/ConnectionContainerViewController.h9
-rw-r--r--Example Apps/Example ObjC/ConnectionContainerViewController.m122
-rw-r--r--Example Apps/Example ObjC/ConnectionIAPTableViewController.m5
-rw-r--r--Example Apps/Example ObjC/ConnectionTCPTableViewController.m4
-rw-r--r--Example Apps/Example ObjC/ConnectionTabBarController.h17
-rw-r--r--Example Apps/Example ObjC/ConnectionTabBarController.m31
-rw-r--r--Example Apps/Example ObjC/ConnectionTransitionContext.h25
-rw-r--r--Example Apps/Example ObjC/ConnectionTransitionContext.m112
-rw-r--r--Example Apps/Example Swift/AppUserDefaults.swift4
-rw-r--r--Example Apps/Example Swift/ConnectionContainerViewController.swift84
-rw-r--r--Example Apps/Example Swift/ConnectionIAPTableViewController.storyboard66
-rw-r--r--Example Apps/Example Swift/ConnectionIAPTableViewController.swift46
-rw-r--r--Example Apps/Example Swift/ConnectionTCPTableViewController.storyboard131
-rw-r--r--Example Apps/Example Swift/ConnectionTCPTableViewController.swift63
-rw-r--r--Example Apps/Example Swift/ConnectionTabBarController.swift26
-rw-r--r--Example Apps/Example Swift/Main.storyboard253
-rw-r--r--Example Apps/Shared/Images.xcassets/Contents.json6
-rw-r--r--Example Apps/Shared/Images.xcassets/dot.radiowaves.right.imageset/Contents.json21
-rw-r--r--Example Apps/Shared/Images.xcassets/dot.radiowaves.right.imageset/dot.radiowaves.right@2x.pngbin0 -> 1194 bytes
-rw-r--r--Example Apps/Shared/dot.radiowaves.right@2x.pngbin0 -> 1194 bytes
-rw-r--r--SmartDeviceLink-iOS.podspec2
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/project.pbxproj360
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-ObjC.xcscheme2
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-Swift.xcscheme78
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme2
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLinkSwift.xcscheme2
-rw-r--r--SmartDeviceLink.podspec2
-rw-r--r--SmartDeviceLink/private/SDLCheckChoiceVROptionalOperation.h4
-rw-r--r--SmartDeviceLink/private/SDLCheckChoiceVROptionalOperation.m17
-rw-r--r--SmartDeviceLink/private/SDLChoiceSetManager.m454
-rw-r--r--SmartDeviceLink/private/SDLDeleteChoicesOperation.h7
-rw-r--r--SmartDeviceLink/private/SDLDeleteChoicesOperation.m61
-rw-r--r--SmartDeviceLink/private/SDLDeleteFileOperation.h40
-rw-r--r--SmartDeviceLink/private/SDLDeleteFileOperation.m29
-rw-r--r--SmartDeviceLink/private/SDLDynamicMenuUpdateAlgorithm.h19
-rw-r--r--SmartDeviceLink/private/SDLDynamicMenuUpdateAlgorithm.m61
-rw-r--r--SmartDeviceLink/private/SDLDynamicMenuUpdateRunScore.h7
-rw-r--r--SmartDeviceLink/private/SDLDynamicMenuUpdateRunScore.m25
-rw-r--r--SmartDeviceLink/private/SDLError.h19
-rw-r--r--SmartDeviceLink/private/SDLError.m110
-rw-r--r--SmartDeviceLink/private/SDLFileWrapper.m4
-rw-r--r--SmartDeviceLink/private/SDLGlobals.m4
-rw-r--r--SmartDeviceLink/private/SDLIAPDataSession.m4
-rw-r--r--SmartDeviceLink/private/SDLLifecycleManager.m3
-rw-r--r--SmartDeviceLink/private/SDLListFilesOperation.m4
-rw-r--r--SmartDeviceLink/private/SDLLogFileModuleMap.m4
-rw-r--r--SmartDeviceLink/private/SDLMenuConfigurationUpdateOperation.h26
-rw-r--r--SmartDeviceLink/private/SDLMenuConfigurationUpdateOperation.m99
-rw-r--r--SmartDeviceLink/private/SDLMenuManager.h4
-rw-r--r--SmartDeviceLink/private/SDLMenuManager.m792
-rw-r--r--SmartDeviceLink/private/SDLMenuManagerPrivateConstants.h15
-rw-r--r--SmartDeviceLink/private/SDLMenuManagerPrivateConstants.m15
-rw-r--r--SmartDeviceLink/private/SDLMenuReplaceOperation.h36
-rw-r--r--SmartDeviceLink/private/SDLMenuReplaceOperation.m455
-rw-r--r--SmartDeviceLink/private/SDLMenuReplaceUtilities.h87
-rw-r--r--SmartDeviceLink/private/SDLMenuReplaceUtilities.m344
-rw-r--r--SmartDeviceLink/private/SDLMenuShowOperation.h25
-rw-r--r--SmartDeviceLink/private/SDLMenuShowOperation.m108
-rw-r--r--SmartDeviceLink/private/SDLPreloadChoicesOperation.h43
-rw-r--r--SmartDeviceLink/private/SDLPreloadChoicesOperation.m243
-rw-r--r--SmartDeviceLink/private/SDLPreloadPresentChoicesOperation.h41
-rw-r--r--SmartDeviceLink/private/SDLPreloadPresentChoicesOperation.m632
-rw-r--r--SmartDeviceLink/private/SDLPreloadPresentChoicesOperationUtilities.h32
-rw-r--r--SmartDeviceLink/private/SDLPreloadPresentChoicesOperationUtilities.m233
-rw-r--r--SmartDeviceLink/private/SDLPresentChoiceSetOperation.h62
-rw-r--r--SmartDeviceLink/private/SDLPresentChoiceSetOperation.m348
-rw-r--r--SmartDeviceLink/private/SDLProtocol.m58
-rw-r--r--SmartDeviceLink/private/SDLProtocolMessageAssembler.m2
-rw-r--r--SmartDeviceLink/private/SDLSecurityQueryErrorCode.h63
-rw-r--r--SmartDeviceLink/private/SDLSecurityQueryErrorCode.m48
-rw-r--r--SmartDeviceLink/private/SDLSecurityQueryPayload.h83
-rw-r--r--SmartDeviceLink/private/SDLSecurityQueryPayload.m166
-rw-r--r--SmartDeviceLink/private/SDLSequentialRPCRequestOperation.m7
-rw-r--r--SmartDeviceLink/private/SDLTextAndGraphicManager.m13
-rw-r--r--SmartDeviceLink/private/SDLUploadFileOperation.h14
-rw-r--r--SmartDeviceLink/private/SDLUploadFileOperation.m89
-rw-r--r--SmartDeviceLink/private/SDLVoiceCommandManager.m6
-rw-r--r--SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.m10
-rw-r--r--SmartDeviceLink/public/SDLAlertAudioData.h2
-rw-r--r--SmartDeviceLink/public/SDLAlertView.h2
-rw-r--r--SmartDeviceLink/public/SDLAppCapabilityType.h1
-rw-r--r--SmartDeviceLink/public/SDLAudioData.h2
-rw-r--r--SmartDeviceLink/public/SDLBodyInformation.h1
-rw-r--r--SmartDeviceLink/public/SDLChoiceCell.m23
-rw-r--r--SmartDeviceLink/public/SDLChoiceSet.m2
-rw-r--r--SmartDeviceLink/public/SDLCreateWindow.h2
-rw-r--r--SmartDeviceLink/public/SDLDoorStatus.h4
-rw-r--r--SmartDeviceLink/public/SDLDoorStatusType.h4
-rw-r--r--SmartDeviceLink/public/SDLErrorConstants.h50
-rw-r--r--SmartDeviceLink/public/SDLErrorConstants.m1
-rw-r--r--SmartDeviceLink/public/SDLFile.m23
-rw-r--r--SmartDeviceLink/public/SDLFileManager.h4
-rw-r--r--SmartDeviceLink/public/SDLFileManager.m58
-rw-r--r--SmartDeviceLink/public/SDLGateStatus.h2
-rw-r--r--SmartDeviceLink/public/SDLKeyboardInputMask.h3
-rw-r--r--SmartDeviceLink/public/SDLKeyboardLayoutCapability.h1
-rw-r--r--SmartDeviceLink/public/SDLMenuCell.m55
-rw-r--r--SmartDeviceLink/public/SDLMenuConfiguration.m20
-rw-r--r--SmartDeviceLink/public/SDLMenuManagerConstants.h15
-rw-r--r--SmartDeviceLink/public/SDLRoofStatus.h3
-rw-r--r--SmartDeviceLink/public/SDLScreenManager.h2
-rw-r--r--SmartDeviceLink/public/SDLScreenManager.m4
-rw-r--r--SmartDeviceLink/public/SDLSeatControlCapabilities.h2
-rw-r--r--SmartDeviceLink/public/SDLSeatStatus.h2
-rw-r--r--SmartDeviceLink/public/SDLSeekIndicatorType.h3
-rw-r--r--SmartDeviceLink/public/SDLSeekStreamingIndicator.h1
-rw-r--r--SmartDeviceLink/public/SDLStreamingMediaConfiguration.h2
-rw-r--r--SmartDeviceLink/public/SDLStreamingVideoDelegate.h3
-rw-r--r--SmartDeviceLink/public/SDLSystemCapabilityManager.m96
-rw-r--r--SmartDeviceLink/public/SDLSystemInfo.h1
-rw-r--r--SmartDeviceLink/public/SDLTireStatus.m75
-rw-r--r--SmartDeviceLink/public/SDLVideoStreamingRange.h1
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLCheckChoiceVROptionalOperationSpec.m18
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m733
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLDeleteChoicesOperationSpec.m25
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLDeleteFileOperationSpec.m122
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m133
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m39
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuConfigurationUpdateOperationSpec.m174
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m887
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceOperationSpec.m745
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpec.m532
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.h22
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.m70
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuShowOperationSpec.m167
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m417
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPreloadPresentChoicesOperationSpec.m1070
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPreloadPresentChoicesOperationUtilitiesSpec.m504
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m549
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m199
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/PayloadSpecs/SDLSecurityQueryPayloadSpec.m80
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTireStatusSpec.m80
-rw-r--r--SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m21
-rw-r--r--SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m8
-rw-r--r--docs/Classes.html181
-rw-r--r--docs/Classes/SDLAlertAudioData.html6
-rw-r--r--docs/Classes/SDLAlertView.html6
-rw-r--r--docs/Classes/SDLAudioData.html6
-rw-r--r--docs/Classes/SDLBodyInformation.html2
-rw-r--r--docs/Classes/SDLCreateWindow.html2
-rw-r--r--docs/Classes/SDLDoorStatus.html8
-rw-r--r--docs/Classes/SDLFileManager.html22
-rw-r--r--docs/Classes/SDLGateStatus.html8
-rw-r--r--docs/Classes/SDLKeyboardLayoutCapability.html4
-rw-r--r--docs/Classes/SDLManager.html4
-rw-r--r--docs/Classes/SDLPermissionManager.html2
-rw-r--r--docs/Classes/SDLRoofStatus.html12
-rw-r--r--docs/Classes/SDLScreenManager.html14
-rw-r--r--docs/Classes/SDLSeatControlCapabilities.html2
-rw-r--r--docs/Classes/SDLSeatStatus.html8
-rw-r--r--docs/Classes/SDLSeekStreamingIndicator.html4
-rw-r--r--docs/Classes/SDLStreamingMediaConfiguration.html2
-rw-r--r--docs/Classes/SDLSystemCapabilityManager.html2
-rw-r--r--docs/Classes/SDLSystemInfo.html2
-rw-r--r--docs/Classes/SDLVideoStreamingRange.html2
-rw-r--r--docs/Constants.html59
-rw-r--r--docs/Enums.html42
-rw-r--r--docs/Enums/MenuCellState.html73
-rw-r--r--docs/Enums/SDLChoiceSetManagerError.html50
-rw-r--r--docs/Enums/SDLMenuManagerError.html78
-rw-r--r--docs/Enums/SDLSystemCapabilityManagerError.html19
-rw-r--r--docs/Enums/SDLSystemError.html33
-rw-r--r--docs/Enums/SDLTextAndGraphicManagerError.html38
-rw-r--r--docs/Protocols.html8
-rw-r--r--docs/Protocols/SDLKeyboardDelegate.html2
-rw-r--r--docs/Protocols/SDLSecurityType.html2
-rw-r--r--docs/Protocols/SDLStreamingVideoDelegate.html11
-rw-r--r--docs/badge.svg16
-rw-r--r--docs/index.html6
-rw-r--r--docs/search.json2
-rw-r--r--docs/undocumented.json227
m---------generator/rpc_spec0
180 files changed, 8807 insertions, 6317 deletions
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 45d857d1b..f6b4895da 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -1,7 +1,7 @@
name: SmartDeviceLink Tests
# This workflow is triggered on a push or pull request.
-on: [push, pull_request]
+on: [push, pull_request, workflow_dispatch]
env:
PROJECT: 'SmartDeviceLink-iOS.xcodeproj'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fd4fb8ca3..8b7ff2945 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,52 @@
# Changelog
+## 7.3.0 (Since RC 1)
+* Supports [SDL RPC Spec 8.0.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/8.0.0) and [SDL Protocol Spec 5.4.1](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.4.1).
+
+### Testing
+* Xcode 13.0 / 13.1
+* iOS 15.0 / 15.1
+* Core:
+ * Manticore (Core v7.1.1, Generic HMI v0.10.0)
+ * Ford Sync 3.4 (19353_DEVTEST)
+ * Ford Sync 3.0 (17276_DEVTEST)
+ * Ford Sync 4.0 (20016_DEVTEST)
+ * Core v8.0.0-RC with sdl_hmi v5.6.0-RC and generic_hmi v0.11.0-RC
+
+### Bug Fixes
+* Fix `SDLMenuCell.submenuLayout` not being copied to new cells (https://github.com/smartdevicelink/sdl_ios/issues/2048)
+
+## 7.3.0 RC 1
+* Supports [SDL RPC Spec 8.0.0](https://github.com/smartdevicelink/rpc_spec/tree/09520e4b2cd5dd09d475bec306e611bdda1187b0) and [SDL Protocol Spec 5.4.1](https://github.com/smartdevicelink/protocol_spec/pull/42).
+
+### Testing
+* Xcode 13.0
+* iOS 15.0
+* Core:
+ * Manticore (Core v7.1.1, Generic HMI v0.10.0)
+ * Ford Sync 3.4 (19353_DEVTEST)
+ * Ford Sync 3.0 (17276_DEVTEST)
+ * Ford Sync 4.0 (20016_DEVTEST)
+ * Core v8.0.0-RC with sdl_hmi v5.6.0-RC and generic_hmi v0.11.0-RC
+
+### Bug Fixes
+* Fix a mismatch in TireStatus vehicle data (https://github.com/smartdevicelink/sdl_ios/issues/1297)
+* Fix menu updates fail if updates are queues (https://github.com/smartdevicelink/sdl_ios/issues/1957)
+* Fix Choice Set Manager back to back choice sets can fail (https://github.com/smartdevicelink/sdl_ios/issues/2018)
+* Fix Choice Set Manager not handling order of operations correctly (https://github.com/smartdevicelink/sdl_ios/issues/2020)
+* Fix Security handshake doesn't handle errors correctly (https://github.com/smartdevicelink/sdl_ios/issues/2024)
+* Fix Choice Set Manager loaded cells are not taken into account for uniqueness (https://github.com/smartdevicelink/sdl_ios/issues/2025)
+* Fix swapping menu items with unique identifiers causes incorrect unique identifiers (https://github.com/smartdevicelink/sdl_ios/issues/2027)
+* Fix delete / add submenu cells doesn't work properly (https://github.com/smartdevicelink/sdl_ios/issues/2028)
+* Fix System Capability Manager crashes when removing capabilities (https://github.com/smartdevicelink/sdl_ios/issues/2033, https://github.com/smartdevicelink/sdl_ios/issues/2036)
+* Fix file manager can upload the same file multiple times (https://github.com/smartdevicelink/sdl_ios/issues/2034)
+* Fix rare cases when a completion handler would not be called (https://github.com/smartdevicelink/sdl_ios/issues/2044)
+
+### Other
+* Add ability to manually run CI tests (https://github.com/smartdevicelink/sdl_ios/issues/2016)
+* Fix code documentation spelling & grammar (https://github.com/smartdevicelink/sdl_ios/issues/2021)
+* Fix code documentation of capabilities (https://github.com/smartdevicelink/sdl_ios/issues/2031)
+* Fix example app iOS 15 appearance (https://github.com/smartdevicelink/sdl_ios/issues/2042)
+
## 7.2.0 (Since RC 1)
* Supports [SDL RPC Spec 7.1.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/7.1.0) and [SDL Protocol Spec 5.4.0](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.4.0).
diff --git a/Cartfile.private b/Cartfile.private
index cedbbe1a3..a261ab097 100644
--- a/Cartfile.private
+++ b/Cartfile.private
@@ -1,3 +1,3 @@
github "Quick/Quick" ~> 3.0
-github "Quick/Nimble" ~> 9.0.0
+github "Quick/Nimble" ~> 9.0
github "erikdoe/ocmock" ~> 3.7
diff --git a/Example Apps/Example ObjC/Base.lproj/ConnectionIAPTableViewController.storyboard b/Example Apps/Example ObjC/Base.lproj/ConnectionIAPTableViewController.storyboard
deleted file mode 100644
index ec5eba61f..000000000
--- a/Example Apps/Example ObjC/Base.lproj/ConnectionIAPTableViewController.storyboard
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="J12-ul-Tx1">
- <device id="retina4_7" orientation="portrait" appearance="light"/>
- <dependencies>
- <deployment identifier="iOS"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
- <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
- </dependencies>
- <scenes>
- <!--ConnectionIAP Table View Controller-->
- <scene sceneID="kGx-OZ-JDF">
- <objects>
- <tableViewController id="J12-ul-Tx1" customClass="ConnectionIAPTableViewController" sceneMemberID="viewController">
- <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="MzB-GZ-Ook">
- <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
- <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
- <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
- <sections>
- <tableViewSection id="Qz3-D9-j37">
- <cells>
- <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="2sd-U1-9xV">
- <rect key="frame" x="0.0" y="10" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="2sd-U1-9xV" id="EhZ-2E-WQ5">
- <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <subviews>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="rjq-vZ-OjB">
- <rect key="frame" x="16" y="0.0" width="343" height="44"/>
- <fontDescription key="fontDescription" type="system" pointSize="23"/>
- <state key="normal" title="Connect">
- <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
- </state>
- <connections>
- <action selector="connectButtonWasPressed:" destination="J12-ul-Tx1" eventType="touchUpInside" id="95T-fc-kXs"/>
- </connections>
- </button>
- </subviews>
- <constraints>
- <constraint firstItem="rjq-vZ-OjB" firstAttribute="top" secondItem="EhZ-2E-WQ5" secondAttribute="top" id="8GY-v0-41a"/>
- <constraint firstAttribute="bottom" secondItem="rjq-vZ-OjB" secondAttribute="bottom" id="FKB-JG-o5G"/>
- <constraint firstAttribute="trailingMargin" secondItem="rjq-vZ-OjB" secondAttribute="trailing" id="ISQ-6b-S34"/>
- <constraint firstItem="rjq-vZ-OjB" firstAttribute="leading" secondItem="EhZ-2E-WQ5" secondAttribute="leadingMargin" id="PiJ-h3-NOR"/>
- </constraints>
- </tableViewCellContentView>
- </tableViewCell>
- </cells>
- </tableViewSection>
- </sections>
- <connections>
- <outlet property="dataSource" destination="J12-ul-Tx1" id="l6L-3i-WxG"/>
- <outlet property="delegate" destination="J12-ul-Tx1" id="b7F-oB-vbR"/>
- </connections>
- </tableView>
- <connections>
- <outlet property="connectButton" destination="rjq-vZ-OjB" id="Sz8-r7-ddN"/>
- <outlet property="connectTableViewCell" destination="2sd-U1-9xV" id="UME-sB-vsD"/>
- </connections>
- </tableViewController>
- <placeholder placeholderIdentifier="IBFirstResponder" id="N5a-E0-fOt" userLabel="First Responder" sceneMemberID="firstResponder"/>
- </objects>
- <point key="canvasLocation" x="898" y="630"/>
- </scene>
- </scenes>
-</document>
diff --git a/Example Apps/Example ObjC/Base.lproj/ConnectionTCPTableViewController.storyboard b/Example Apps/Example ObjC/Base.lproj/ConnectionTCPTableViewController.storyboard
deleted file mode 100644
index e1b51b744..000000000
--- a/Example Apps/Example ObjC/Base.lproj/ConnectionTCPTableViewController.storyboard
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="l5Q-ZP-1BO">
- <device id="retina4_7" orientation="portrait" appearance="light"/>
- <dependencies>
- <deployment identifier="iOS"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
- <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
- </dependencies>
- <scenes>
- <!--ConnectionTCP Table View Controller-->
- <scene sceneID="geJ-kX-PTm">
- <objects>
- <tableViewController id="l5Q-ZP-1BO" customClass="ConnectionTCPTableViewController" sceneMemberID="viewController">
- <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="7ZH-AV-Zyf">
- <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
- <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
- <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
- <sections>
- <tableViewSection headerTitle="TCP Server" id="bF6-yi-Ial">
- <cells>
- <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="pbJ-oz-jNt">
- <rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="pbJ-oz-jNt" id="B7X-yY-lwJ">
- <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <subviews>
- <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="IP Address" clearsOnBeginEditing="YES" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="xqM-s4-9RV">
- <rect key="frame" x="16" y="0.0" width="343" height="44"/>
- <constraints>
- <constraint firstAttribute="height" constant="44" id="5Pw-mh-x83"/>
- </constraints>
- <fontDescription key="fontDescription" type="system" pointSize="17"/>
- <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="URL"/>
- </textField>
- </subviews>
- <constraints>
- <constraint firstAttribute="centerY" secondItem="xqM-s4-9RV" secondAttribute="centerY" id="PcX-lz-oQo"/>
- <constraint firstItem="xqM-s4-9RV" firstAttribute="trailing" secondItem="B7X-yY-lwJ" secondAttribute="trailingMargin" id="YF9-Uh-Yqm"/>
- <constraint firstItem="xqM-s4-9RV" firstAttribute="leading" secondItem="B7X-yY-lwJ" secondAttribute="leadingMargin" id="pBt-SK-tuZ"/>
- </constraints>
- </tableViewCellContentView>
- </tableViewCell>
- <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="C5b-fS-v3d">
- <rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="C5b-fS-v3d" id="ZD4-xA-og5">
- <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <subviews>
- <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Port" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="hsI-ld-8xY">
- <rect key="frame" x="16" y="0.0" width="343" height="44"/>
- <constraints>
- <constraint firstAttribute="height" constant="44" id="FpG-5e-MHT"/>
- </constraints>
- <fontDescription key="fontDescription" type="system" pointSize="17"/>
- <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="numberPad"/>
- </textField>
- </subviews>
- <constraints>
- <constraint firstAttribute="centerY" secondItem="hsI-ld-8xY" secondAttribute="centerY" id="X1e-g3-RJN"/>
- <constraint firstItem="hsI-ld-8xY" firstAttribute="leading" secondItem="ZD4-xA-og5" secondAttribute="leadingMargin" id="oeB-5U-tOl"/>
- <constraint firstItem="hsI-ld-8xY" firstAttribute="trailing" secondItem="ZD4-xA-og5" secondAttribute="trailingMargin" id="wXl-bK-7vU"/>
- </constraints>
- </tableViewCellContentView>
- </tableViewCell>
- </cells>
- </tableViewSection>
- <tableViewSection headerTitle="" id="rgl-Lm-uDH">
- <cells>
- <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="ybX-Eh-Hbx">
- <rect key="frame" x="0.0" y="175.5" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ybX-Eh-Hbx" id="uI9-fK-205">
- <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <subviews>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="t37-4W-6F4">
- <rect key="frame" x="16" y="0.0" width="343" height="44"/>
- <fontDescription key="fontDescription" type="system" pointSize="23"/>
- <state key="normal" title="Connect">
- <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
- </state>
- <connections>
- <action selector="connectButtonWasPressed:" destination="l5Q-ZP-1BO" eventType="touchUpInside" id="tgb-10-M4m"/>
- </connections>
- </button>
- </subviews>
- <constraints>
- <constraint firstItem="t37-4W-6F4" firstAttribute="top" secondItem="uI9-fK-205" secondAttribute="top" id="IfU-4k-EXx"/>
- <constraint firstItem="t37-4W-6F4" firstAttribute="leading" secondItem="uI9-fK-205" secondAttribute="leadingMargin" id="cc3-uk-9fL"/>
- <constraint firstAttribute="bottom" secondItem="t37-4W-6F4" secondAttribute="bottom" id="hnD-4g-xvT"/>
- <constraint firstAttribute="trailingMargin" secondItem="t37-4W-6F4" secondAttribute="trailing" id="j4p-fi-0LP"/>
- </constraints>
- </tableViewCellContentView>
- </tableViewCell>
- </cells>
- </tableViewSection>
- </sections>
- <connections>
- <outlet property="dataSource" destination="l5Q-ZP-1BO" id="kIY-aI-9y3"/>
- <outlet property="delegate" destination="l5Q-ZP-1BO" id="nhW-OL-xIC"/>
- </connections>
- </tableView>
- <navigationItem key="navigationItem" id="JNL-hN-wDm">
- <nil key="title"/>
- <segmentedControl key="titleView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="rXi-EW-KGG">
- <rect key="frame" x="180" y="7" width="240" height="30"/>
- <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
- <segments>
- <segment title="TCP Debug"/>
- <segment title="iAP"/>
- </segments>
- </segmentedControl>
- </navigationItem>
- <connections>
- <outlet property="connectButton" destination="t37-4W-6F4" id="f6v-Q4-ggs"/>
- <outlet property="connectTableViewCell" destination="ybX-Eh-Hbx" id="hyh-CW-oXx"/>
- <outlet property="ipAddressTextField" destination="xqM-s4-9RV" id="daz-uN-Rxa"/>
- <outlet property="portTextField" destination="hsI-ld-8xY" id="5pF-XP-Xh3"/>
- </connections>
- </tableViewController>
- <placeholder placeholderIdentifier="IBFirstResponder" id="0fm-wO-kFd" userLabel="First Responder" sceneMemberID="firstResponder"/>
- </objects>
- <point key="canvasLocation" x="688" y="499"/>
- </scene>
- </scenes>
-</document>
diff --git a/Example Apps/Example ObjC/Base.lproj/Main.storyboard b/Example Apps/Example ObjC/Base.lproj/Main.storyboard
index 8097692ff..d8339f5cb 100644
--- a/Example Apps/Example ObjC/Base.lproj/Main.storyboard
+++ b/Example Apps/Example ObjC/Base.lproj/Main.storyboard
@@ -1,64 +1,238 @@
<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="mM3-m6-I5t">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19162" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="cVb-pX-Ls9">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19144"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
- <!--Navigation Controller-->
- <scene sceneID="Tfy-dw-box">
+ <!--Connection Tab Bar Controller-->
+ <scene sceneID="Gr3-mM-wyL">
<objects>
- <navigationController automaticallyAdjustsScrollViewInsets="NO" id="mM3-m6-I5t" sceneMemberID="viewController">
+ <tabBarController id="cVb-pX-Ls9" customClass="ConnectionTabBarController" sceneMemberID="viewController">
+ <tabBar key="tabBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="eLA-bh-hG8">
+ <rect key="frame" x="0.0" y="0.0" width="414" height="49"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </tabBar>
+ <connections>
+ <segue destination="dgV-HC-hDe" kind="relationship" relationship="viewControllers" id="q22-Sb-3o4"/>
+ <segue destination="8vf-eo-JUi" kind="relationship" relationship="viewControllers" id="FFB-PE-HX1"/>
+ </connections>
+ </tabBarController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="x0V-el-PXQ" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="65" y="547"/>
+ </scene>
+ <!--ConnectionIAP Table View Controller-->
+ <scene sceneID="pfi-BU-jC5">
+ <objects>
+ <tableViewController id="j3O-gM-kPh" customClass="ConnectionIAPTableViewController" sceneMemberID="viewController">
+ <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="nK2-Le-mQF">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
+ <sections>
+ <tableViewSection id="58k-19-nbu">
+ <cells>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="gMR-Wm-MEe">
+ <rect key="frame" x="0.0" y="10" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="gMR-Wm-MEe" id="cwq-6n-iHz">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="j3z-U1-Uqd">
+ <rect key="frame" x="16" y="0.0" width="343" height="44"/>
+ <fontDescription key="fontDescription" type="system" pointSize="23"/>
+ <state key="normal" title="Connect">
+ <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </state>
+ <connections>
+ <action selector="connectButtonWasPressed:" destination="j3O-gM-kPh" eventType="touchUpInside" id="f9B-xj-OdO"/>
+ </connections>
+ </button>
+ </subviews>
+ <constraints>
+ <constraint firstItem="j3z-U1-Uqd" firstAttribute="top" secondItem="cwq-6n-iHz" secondAttribute="top" id="47a-Zn-veA"/>
+ <constraint firstItem="j3z-U1-Uqd" firstAttribute="leading" secondItem="cwq-6n-iHz" secondAttribute="leadingMargin" id="6CQ-wt-6sH"/>
+ <constraint firstAttribute="trailingMargin" secondItem="j3z-U1-Uqd" secondAttribute="trailing" id="wcW-8C-DO2"/>
+ <constraint firstAttribute="bottom" secondItem="j3z-U1-Uqd" secondAttribute="bottom" id="xfA-tS-iv0"/>
+ </constraints>
+ </tableViewCellContentView>
+ </tableViewCell>
+ </cells>
+ </tableViewSection>
+ </sections>
+ <connections>
+ <outlet property="dataSource" destination="j3O-gM-kPh" id="ZgX-Du-Frj"/>
+ <outlet property="delegate" destination="j3O-gM-kPh" id="dSq-pP-sKs"/>
+ </connections>
+ </tableView>
+ <navigationItem key="navigationItem" id="sH2-qP-QUi"/>
+ <connections>
+ <outlet property="connectButton" destination="j3z-U1-Uqd" id="BZ7-9U-lNO"/>
+ <outlet property="connectTableViewCell" destination="gMR-Wm-MEe" id="Wr1-iE-mfy"/>
+ </connections>
+ </tableViewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="wMG-AM-dTq" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="1703" y="927"/>
+ </scene>
+ <!--iAP-->
+ <scene sceneID="yPB-aB-hYg">
+ <objects>
+ <navigationController automaticallyAdjustsScrollViewInsets="NO" id="8vf-eo-JUi" sceneMemberID="viewController">
+ <tabBarItem key="tabBarItem" title="iAP" image="car" catalog="system" id="fHY-Z2-s8b"/>
<toolbarItems/>
- <navigationBar key="navigationBar" contentMode="scaleToFill" id="eMh-g9-C8T">
- <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" largeTitles="YES" id="xC4-Pp-tH2">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="96"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
- <segue destination="cXb-Co-0MA" kind="relationship" relationship="rootViewController" id="tbn-vJ-YS8"/>
+ <segue destination="j3O-gM-kPh" kind="relationship" relationship="rootViewController" id="lnA-QL-KSx"/>
</connections>
</navigationController>
- <placeholder placeholderIdentifier="IBFirstResponder" id="eXu-Zc-53v" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="GF4-rg-NH1" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
- <point key="canvasLocation" x="896" y="527"/>
+ <point key="canvasLocation" x="984.79999999999995" y="926.98650674662679"/>
</scene>
- <!--Connection Container View Controller-->
- <scene sceneID="vG9-Hv-OW2">
+ <!--ConnectionTCP Table View Controller-->
+ <scene sceneID="yx6-3n-U3u">
<objects>
- <viewController id="cXb-Co-0MA" customClass="ConnectionContainerViewController" sceneMemberID="viewController">
- <layoutGuides>
- <viewControllerLayoutGuide type="top" id="bfp-O0-sxl"/>
- <viewControllerLayoutGuide type="bottom" id="fet-m3-F1O"/>
- </layoutGuides>
- <view key="view" contentMode="scaleToFill" id="jkb-9Y-Hwh">
+ <tableViewController id="1Fv-Kz-xtS" customClass="ConnectionTCPTableViewController" sceneMemberID="viewController">
+ <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="UTK-Fg-VBI">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
- <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
- </view>
- <navigationItem key="navigationItem" id="t1a-s2-nn6">
+ <color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
+ <sections>
+ <tableViewSection headerTitle="TCP Server" id="g4H-Th-Ib7">
+ <cells>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="Bob-nW-ksw">
+ <rect key="frame" x="0.0" y="32" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Bob-nW-ksw" id="sFi-G5-84d">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="IP Address" clearsOnBeginEditing="YES" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="fCb-gB-HDY">
+ <rect key="frame" x="16" y="0.0" width="343" height="44"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="44" id="kSa-Ff-ucg"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="URL"/>
+ </textField>
+ </subviews>
+ <constraints>
+ <constraint firstItem="fCb-gB-HDY" firstAttribute="leading" secondItem="sFi-G5-84d" secondAttribute="leadingMargin" id="WSR-91-qNM"/>
+ <constraint firstAttribute="centerY" secondItem="fCb-gB-HDY" secondAttribute="centerY" id="Zgh-CX-HkN"/>
+ <constraint firstItem="fCb-gB-HDY" firstAttribute="trailing" secondItem="sFi-G5-84d" secondAttribute="trailingMargin" id="sOd-7M-RJP"/>
+ </constraints>
+ </tableViewCellContentView>
+ </tableViewCell>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="e8E-w6-ADp">
+ <rect key="frame" x="0.0" y="76" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="e8E-w6-ADp" id="w5S-O2-EX3">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Port" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="DTy-Ue-hZ4">
+ <rect key="frame" x="16" y="0.0" width="343" height="44"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="44" id="Uqa-cU-CHd"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="numberPad"/>
+ </textField>
+ </subviews>
+ <constraints>
+ <constraint firstItem="DTy-Ue-hZ4" firstAttribute="leading" secondItem="w5S-O2-EX3" secondAttribute="leadingMargin" id="GMn-sS-O0i"/>
+ <constraint firstAttribute="centerY" secondItem="DTy-Ue-hZ4" secondAttribute="centerY" id="VBc-V3-9MW"/>
+ <constraint firstItem="DTy-Ue-hZ4" firstAttribute="trailing" secondItem="w5S-O2-EX3" secondAttribute="trailingMargin" id="sRh-fO-Bu0"/>
+ </constraints>
+ </tableViewCellContentView>
+ </tableViewCell>
+ </cells>
+ </tableViewSection>
+ <tableViewSection headerTitle="" id="H3B-ZR-Hts">
+ <cells>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="Afr-pc-H4S">
+ <rect key="frame" x="0.0" y="147.5" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Afr-pc-H4S" id="CuH-mB-abh">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="GMb-ms-Ezz">
+ <rect key="frame" x="16" y="0.0" width="343" height="44"/>
+ <fontDescription key="fontDescription" type="system" pointSize="23"/>
+ <state key="normal" title="Connect">
+ <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </state>
+ <connections>
+ <action selector="connectButtonWasPressed:" destination="1Fv-Kz-xtS" eventType="touchUpInside" id="3em-mS-uS3"/>
+ </connections>
+ </button>
+ </subviews>
+ <constraints>
+ <constraint firstAttribute="bottom" secondItem="GMb-ms-Ezz" secondAttribute="bottom" id="5T8-7I-Ryl"/>
+ <constraint firstItem="GMb-ms-Ezz" firstAttribute="top" secondItem="CuH-mB-abh" secondAttribute="top" id="TgD-UM-BIE"/>
+ <constraint firstItem="GMb-ms-Ezz" firstAttribute="leading" secondItem="CuH-mB-abh" secondAttribute="leadingMargin" id="k3V-Yz-mT2"/>
+ <constraint firstAttribute="trailingMargin" secondItem="GMb-ms-Ezz" secondAttribute="trailing" id="xIH-18-F5y"/>
+ </constraints>
+ </tableViewCellContentView>
+ </tableViewCell>
+ </cells>
+ </tableViewSection>
+ </sections>
+ <connections>
+ <outlet property="dataSource" destination="1Fv-Kz-xtS" id="a1J-VB-eG9"/>
+ <outlet property="delegate" destination="1Fv-Kz-xtS" id="5nf-D2-Y2G"/>
+ </connections>
+ </tableView>
+ <navigationItem key="navigationItem" id="yyD-H2-RJ8">
<nil key="title"/>
- <segmentedControl key="titleView" opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="RYa-fE-Qek">
- <rect key="frame" x="67.5" y="6" width="240" height="32"/>
- <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
- <segments>
- <segment title="TCP Debug"/>
- <segment title="iAP"/>
- </segments>
- <connections>
- <action selector="connectionTypeSegmentedControlSelectedIndexDidChange:" destination="cXb-Co-0MA" eventType="valueChanged" id="i3j-Ux-1be"/>
- </connections>
- </segmentedControl>
</navigationItem>
<connections>
- <outlet property="connectionTypeSegmentedControl" destination="RYa-fE-Qek" id="uda-9c-u0v"/>
+ <outlet property="connectButton" destination="GMb-ms-Ezz" id="7s3-Sk-fuh"/>
+ <outlet property="connectTableViewCell" destination="Afr-pc-H4S" id="WLC-c3-4ee"/>
+ <outlet property="ipAddressTextField" destination="fCb-gB-HDY" id="ncs-pN-e1m"/>
+ <outlet property="portTextField" destination="DTy-Ue-hZ4" id="7yx-Ke-mKZ"/>
</connections>
- </viewController>
- <placeholder placeholderIdentifier="IBFirstResponder" id="ETn-uq-A6g" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </tableViewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="S9j-DZ-c95" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="1702" y="257"/>
+ </scene>
+ <!--TCP-->
+ <scene sceneID="bqP-uY-fAM">
+ <objects>
+ <navigationController automaticallyAdjustsScrollViewInsets="NO" id="dgV-HC-hDe" sceneMemberID="viewController">
+ <tabBarItem key="tabBarItem" title="TCP" image="dot.radiowaves.right" catalog="system" id="I9b-qZ-UOd"/>
+ <toolbarItems/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" largeTitles="YES" id="nMB-2t-t58">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="96"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </navigationBar>
+ <nil name="viewControllers"/>
+ <connections>
+ <segue destination="1Fv-Kz-xtS" kind="relationship" relationship="rootViewController" id="iY0-sx-yuu"/>
+ </connections>
+ </navigationController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="Q34-E8-7pr" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
- <point key="canvasLocation" x="1576" y="527"/>
+ <point key="canvasLocation" x="984.79999999999995" y="256.82158920539734"/>
</scene>
</scenes>
+ <resources>
+ <image name="car" catalog="system" width="128" height="93"/>
+ <image name="dot.radiowaves.right" catalog="system" width="117" height="128"/>
+ <systemColor name="groupTableViewBackgroundColor">
+ <color red="0.94901960780000005" green="0.94901960780000005" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </systemColor>
+ </resources>
</document>
diff --git a/Example Apps/Example ObjC/ConnectionAnimatedTransition.h b/Example Apps/Example ObjC/ConnectionAnimatedTransition.h
deleted file mode 100644
index a09f1fa77..000000000
--- a/Example Apps/Example ObjC/ConnectionAnimatedTransition.h
+++ /dev/null
@@ -1,12 +0,0 @@
-//
-// ConnectionAnimatedTransition.h
-// SmartDeviceLink-iOS
-
-#import <Foundation/Foundation.h>
-
-#import <UIKit/UIKit.h>
-
-
-@interface ConnectionAnimatedTransition : NSObject <UIViewControllerAnimatedTransitioning>
-
-@end
diff --git a/Example Apps/Example ObjC/ConnectionAnimatedTransition.m b/Example Apps/Example ObjC/ConnectionAnimatedTransition.m
deleted file mode 100644
index 1a4d4d141..000000000
--- a/Example Apps/Example ObjC/ConnectionAnimatedTransition.m
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// ConnectionAnimatedTransition.m
-// SmartDeviceLink-iOS
-
-#import "ConnectionAnimatedTransition.h"
-
-
-static CGFloat const ChildViewPadding = 16;
-static CGFloat const DampingFactor = 0.8;
-static CGFloat const InitialSpringVelocity = 0.6;
-
-
-@implementation ConnectionAnimatedTransition
-
-- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
- return 0.4;
-}
-
-- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
- UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
- UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
-
- BOOL goingRight = ([transitionContext initialFrameForViewController:toViewController].origin.x < [transitionContext finalFrameForViewController:toViewController].origin.x);
- CGFloat travelDistance = [transitionContext containerView].bounds.size.width + ChildViewPadding;
- CGAffineTransform travel = CGAffineTransformMakeTranslation((goingRight ? travelDistance : -travelDistance), 0);
-
- [[transitionContext containerView] addSubview:toViewController.view];
- toViewController.view.alpha = 0;
- toViewController.view.transform = CGAffineTransformInvert(travel);
-
- [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 usingSpringWithDamping:DampingFactor initialSpringVelocity:InitialSpringVelocity options:kNilOptions animations:^{
- fromViewController.view.transform = travel;
- fromViewController.view.alpha = 0;
-
- toViewController.view.transform = [transitionContext targetTransform];
- toViewController.view.alpha = 1;
- } completion:^(BOOL finished) {
- fromViewController.view.transform = [transitionContext targetTransform];
- [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
- }];
-}
-
-@end
diff --git a/Example Apps/Example ObjC/ConnectionContainerViewController.h b/Example Apps/Example ObjC/ConnectionContainerViewController.h
deleted file mode 100644
index 4e2d1ea32..000000000
--- a/Example Apps/Example ObjC/ConnectionContainerViewController.h
+++ /dev/null
@@ -1,9 +0,0 @@
-//
-// ConnectionContainerViewController.h
-// SmartDeviceLink-iOS
-
-#import <UIKit/UIKit.h>
-
-@interface ConnectionContainerViewController : UIViewController
-
-@end
diff --git a/Example Apps/Example ObjC/ConnectionContainerViewController.m b/Example Apps/Example ObjC/ConnectionContainerViewController.m
deleted file mode 100644
index 6075ccc8b..000000000
--- a/Example Apps/Example ObjC/ConnectionContainerViewController.m
+++ /dev/null
@@ -1,122 +0,0 @@
-//
-// ConnectionContainerViewController.m
-// SmartDeviceLink-iOS
-
-#import "ConnectionContainerViewController.h"
-
-#import "ConnectionTCPTableViewController.h"
-#import "ConnectionIAPTableViewController.h"
-#import "ConnectionTransitionContext.h"
-#import "ConnectionAnimatedTransition.h"
-#import "Preferences.h"
-
-
-@interface ConnectionContainerViewController ()
-
-@property (weak, nonatomic) IBOutlet UISegmentedControl *connectionTypeSegmentedControl;
-@property (strong, nonatomic) NSArray<UIViewController *> *viewControllers;
-@property (strong, nonatomic) UIViewController *currentViewController;
-
-@property (strong, nonatomic) UIPanGestureRecognizer *panGestureRecognizer;
-
-@end
-
-
-
-@implementation ConnectionContainerViewController
-
-- (void)viewDidLoad {
- [super viewDidLoad];
-
- self.navigationController.navigationBar.translucent = NO;
-
- // Setup the child VCs
- UIStoryboard *tcpControllerStoryboard = [UIStoryboard storyboardWithName:@"ConnectionTCPTableViewController" bundle:[NSBundle mainBundle]];
- UIStoryboard *iapControllerStoryboard = [UIStoryboard storyboardWithName:@"ConnectionIAPTableViewController" bundle:[NSBundle mainBundle]];
- ConnectionTCPTableViewController *tcpController = [tcpControllerStoryboard instantiateInitialViewController];
- ConnectionIAPTableViewController *iapController = [iapControllerStoryboard instantiateInitialViewController];
- self.viewControllers = @[tcpController, iapController];
-
- // Setup the pan gesture
- self.panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureRecognizerDidFire:)];
- [self.view addGestureRecognizer:self.panGestureRecognizer];
-
- // Setup initial view controller state
- self.connectionTypeSegmentedControl.selectedSegmentIndex = [Preferences sharedPreferences].lastUsedSegment;
- [self loadInitialChildViewController];
-}
-
-- (void)loadInitialChildViewController {
- // On the initial load, we just add the new child VC with no animation
- UIViewController *initialViewController = self.viewControllers[[Preferences sharedPreferences].lastUsedSegment];
- [self addChildViewController:initialViewController];
- [self.view addSubview:initialViewController.view];
- [initialViewController didMoveToParentViewController:self];
-
- self.currentViewController = initialViewController;
-}
-
-
-#pragma mark - IBActions
-
-- (IBAction)connectionTypeSegmentedControlSelectedIndexDidChange:(UISegmentedControl *)sender {
- [Preferences sharedPreferences].lastUsedSegment = sender.selectedSegmentIndex;
- [self transitionToViewControllerForSelectedIndex:sender.selectedSegmentIndex];
-}
-
-
-#pragma mark - Gestures
-
-- (void)panGestureRecognizerDidFire:(UIPanGestureRecognizer *)gesture {
- BOOL goingRight = ([gesture velocityInView:gesture.view].x < 0.0f);
-
- NSUInteger currentSegmentIndex = self.connectionTypeSegmentedControl.selectedSegmentIndex;
- if (goingRight && (currentSegmentIndex != self.viewControllers.count - 1)) {
- // If we're swiping left (going right) and current segment is not all the way to the right
- NSUInteger nextIndex = currentSegmentIndex + 1;
- self.connectionTypeSegmentedControl.selectedSegmentIndex = nextIndex;
- [self transitionToViewControllerForSelectedIndex:nextIndex];
- } else if (!goingRight && (currentSegmentIndex > 0)) {
- // If we're swiping right (going left) and the current segment is not all the way to the left
- NSUInteger nextIndex = currentSegmentIndex - 1;
- self.connectionTypeSegmentedControl.selectedSegmentIndex = nextIndex;
- [self transitionToViewControllerForSelectedIndex:nextIndex];
- }
-}
-
-
-#pragma mark - Private API
-
-- (void)transitionToViewControllerForSelectedIndex:(NSInteger)selectedIndex {
- UIViewController *toViewController = self.viewControllers[selectedIndex];
-
- if (toViewController == nil || toViewController == self.currentViewController) {
- return;
- }
-
- [self.currentViewController willMoveToParentViewController:nil];
- [self addChildViewController:toViewController];
-
- id<UIViewControllerAnimatedTransitioning> animator = [[ConnectionAnimatedTransition alloc] init];
- NSUInteger fromIndex = [self.viewControllers indexOfObject:self.currentViewController];
-
- ConnectionTransitionContext *transitionContext = [[ConnectionTransitionContext alloc] initWithFromViewController:self.currentViewController toViewController:toViewController direction:((selectedIndex > fromIndex) ? ConnectionTransitionDirectionRight : ConnectionTransitionDirectionLeft) transitionComplete:^(BOOL didComplete) {
- [self.currentViewController.view removeFromSuperview];
- [self.currentViewController removeFromParentViewController];
- [toViewController didMoveToParentViewController:self];
-
- if ([animator respondsToSelector:@selector(animationEnded:)]) {
- [animator animationEnded:didComplete];
- }
-
- self.connectionTypeSegmentedControl.userInteractionEnabled = YES;
- self.currentViewController = toViewController;
- }];
- transitionContext.animated = YES;
- transitionContext.interactive = NO;
-
- self.connectionTypeSegmentedControl.userInteractionEnabled = NO;
- [animator animateTransition:transitionContext];
-}
-
-@end
diff --git a/Example Apps/Example ObjC/ConnectionIAPTableViewController.m b/Example Apps/Example ObjC/ConnectionIAPTableViewController.m
index b2d9b30b9..6364118f0 100644
--- a/Example Apps/Example ObjC/ConnectionIAPTableViewController.m
+++ b/Example Apps/Example ObjC/ConnectionIAPTableViewController.m
@@ -4,6 +4,7 @@
#import "ConnectionIAPTableViewController.h"
+#import "Preferences.h"
#import "ProxyManager.h"
@@ -23,6 +24,10 @@
[[ProxyManager sharedManager] addObserver:self forKeyPath:NSStringFromSelector(@selector(state)) options:(NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew) context:nil];
// Tableview setup
+ if (@available(iOS 11.0, *)) {
+ self.tableView.dragInteractionEnabled = NO;
+ }
+ self.title = @"iAP";
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
// Connect Button setup
diff --git a/Example Apps/Example ObjC/ConnectionTCPTableViewController.m b/Example Apps/Example ObjC/ConnectionTCPTableViewController.m
index 3ca9a78a0..7cd61d6af 100644
--- a/Example Apps/Example ObjC/ConnectionTCPTableViewController.m
+++ b/Example Apps/Example ObjC/ConnectionTCPTableViewController.m
@@ -32,6 +32,10 @@
[[ProxyManager sharedManager] addObserver:self forKeyPath:NSStringFromSelector(@selector(state)) options:(NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew) context:nil];
// Tableview setup
+ if (@available(iOS 11.0, *)) {
+ self.tableView.dragInteractionEnabled = NO;
+ }
+ self.title = @"TCP";
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.ipAddressTextField.text = [Preferences sharedPreferences].ipAddress;
self.portTextField.text = [@([Preferences sharedPreferences].port) stringValue];
diff --git a/Example Apps/Example ObjC/ConnectionTabBarController.h b/Example Apps/Example ObjC/ConnectionTabBarController.h
new file mode 100644
index 000000000..9b20f2fb1
--- /dev/null
+++ b/Example Apps/Example ObjC/ConnectionTabBarController.h
@@ -0,0 +1,17 @@
+//
+// ConnectionTabBarController.h
+// SmartDeviceLink-Example-ObjC
+//
+// Created by Joel Fischer on 9/23/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ConnectionTabBarController : UITabBarController
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Example Apps/Example ObjC/ConnectionTabBarController.m b/Example Apps/Example ObjC/ConnectionTabBarController.m
new file mode 100644
index 000000000..30f6329b2
--- /dev/null
+++ b/Example Apps/Example ObjC/ConnectionTabBarController.m
@@ -0,0 +1,31 @@
+//
+// ConnectionTabBarController.m
+// SmartDeviceLink-Example-ObjC
+//
+// Created by Joel Fischer on 9/23/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "ConnectionTabBarController.h"
+
+#import "Preferences.h"
+
+@interface ConnectionTabBarController () <UITabBarControllerDelegate>
+
+@end
+
+@implementation ConnectionTabBarController
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ self.delegate = self;
+}
+
+#pragma mark - UITabBarControllerDelegate
+
+- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item {
+ Preferences.sharedPreferences.lastUsedSegment = [tabBar.items indexOfObject:item];
+}
+
+@end
diff --git a/Example Apps/Example ObjC/ConnectionTransitionContext.h b/Example Apps/Example ObjC/ConnectionTransitionContext.h
deleted file mode 100644
index eda85adef..000000000
--- a/Example Apps/Example ObjC/ConnectionTransitionContext.h
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// ConnectionTransitionContext.h
-// SmartDeviceLink-iOS
-
-#import <Foundation/Foundation.h>
-
-#import <UIKit/UIKit.h>
-
-
-typedef NS_ENUM(NSUInteger, ConnectionTransitionDirection) {
- ConnectionTransitionDirectionLeft,
- ConnectionTransitionDirectionRight
-};
-
-typedef void (^TransitionCompleteBlock)(BOOL didComplete);
-
-
-@interface ConnectionTransitionContext : NSObject <UIViewControllerContextTransitioning>
-
-@property (assign, nonatomic, getter=isAnimated) BOOL animated;
-@property (assign, nonatomic, getter=isInteractive) BOOL interactive;
-
-- (instancetype)initWithFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController direction:(ConnectionTransitionDirection)direction transitionComplete:(TransitionCompleteBlock)completion;
-
-@end
diff --git a/Example Apps/Example ObjC/ConnectionTransitionContext.m b/Example Apps/Example ObjC/ConnectionTransitionContext.m
deleted file mode 100644
index 7275952c3..000000000
--- a/Example Apps/Example ObjC/ConnectionTransitionContext.m
+++ /dev/null
@@ -1,112 +0,0 @@
-//
-// ConnectionTransitionContext.m
-// SmartDeviceLink-iOS
-
-#import "ConnectionTransitionContext.h"
-
-
-
-@interface ConnectionTransitionContext ()
-
-@property (assign, nonatomic) UIModalPresentationStyle presentationStyle;
-
-@property (strong, nonatomic) UIView *containerView;
-@property (strong, nonatomic) NSDictionary *viewControllers;
-
-@property (assign, nonatomic) CGRect disappearingFromRect;
-@property (assign, nonatomic) CGRect disappearingToRect;
-@property (assign, nonatomic) CGRect appearingFromRect;
-@property (assign, nonatomic) CGRect appearingToRect;
-
-@property (copy, nonatomic) TransitionCompleteBlock block;
-
-@end
-
-
-
-@implementation ConnectionTransitionContext
-
-- (instancetype)initWithFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController direction:(ConnectionTransitionDirection)direction transitionComplete:(TransitionCompleteBlock)completion {
- NSAssert((fromViewController.isViewLoaded && fromViewController.view.superview), @"The fromViewController must reside in the container view when initializing the transition context");
-
- self = [super init];
- if (!self) {
- return nil;
- }
-
- self.presentationStyle = UIModalPresentationCustom;
- self.containerView = fromViewController.view.superview;
- self.viewControllers = @{
- UITransitionContextFromViewControllerKey: fromViewController,
- UITransitionContextToViewControllerKey: toViewController
- };
-
- CGFloat travelDistance = (direction == ConnectionTransitionDirectionRight) ? -self.containerView.bounds.size.width : self.containerView.bounds.size.width;
- self.disappearingFromRect = self.appearingToRect = self.containerView.bounds;
- self.disappearingToRect = CGRectOffset(self.containerView.bounds, travelDistance, 0);
- self.appearingFromRect = CGRectOffset(self.containerView.bounds, -travelDistance, 0);
-
- self.block = completion;
-
- return self;
-}
-
-
-#pragma mark - UIViewControllerContextTransitioning
-
-- (CGRect)initialFrameForViewController:(UIViewController *)vc {
- if (vc == [self viewControllerForKey:UITransitionContextFromViewControllerKey]) {
- return self.disappearingFromRect;
- } else {
- return self.appearingFromRect;
- }
-}
-
-- (CGRect)finalFrameForViewController:(UIViewController *)vc {
- if (vc == [self viewControllerForKey:UITransitionContextFromViewControllerKey]) {
- return self.disappearingToRect;
- } else {
- return self.appearingToRect;
- }
-}
-
-- (UIViewController *)viewControllerForKey:(NSString *)key {
- return self.viewControllers[key];
-}
-
-- (void)completeTransition:(BOOL)didComplete {
- if (self.block != NULL) {
- self.block(didComplete);
- }
-}
-
-- (BOOL)transitionWasCancelled {
- return NO;
-}
-
-- (UIView *)viewForKey:(NSString *)key {
- UIViewController *viewController = nil;
- if ([key isEqualToString:UITransitionContextFromViewControllerKey]) {
- viewController = [self viewControllerForKey:UITransitionContextFromViewControllerKey];
- } else {
- viewController = [self viewControllerForKey:UITransitionContextToViewControllerKey];
- }
-
- return viewController.view;
-}
-
-- (CGAffineTransform)targetTransform {
- return CGAffineTransformIdentity;
-}
-
-
-#pragma mark Interactive Transition
-
-- (void)updateInteractiveTransition:(CGFloat)percentComplete {}
-- (void)finishInteractiveTransition {}
-- (void)cancelInteractiveTransition {}
-- (void)pauseInteractiveTransition {}
-
-
-
-@end
diff --git a/Example Apps/Example Swift/AppUserDefaults.swift b/Example Apps/Example Swift/AppUserDefaults.swift
index 5fc63c437..9c12727cf 100644
--- a/Example Apps/Example Swift/AppUserDefaults.swift
+++ b/Example Apps/Example Swift/AppUserDefaults.swift
@@ -43,12 +43,12 @@ class AppUserDefaults {
}
}
- var lastUsedSegment: Int? {
+ var lastUsedSegment: Int {
get {
return UserDefaults.standard.integer(forKey: Keys.lastUsedSegment)
}
set {
- UserDefaults.standard.set(newValue!, forKey: Keys.lastUsedSegment)
+ UserDefaults.standard.set(newValue, forKey: Keys.lastUsedSegment)
}
}
}
diff --git a/Example Apps/Example Swift/ConnectionContainerViewController.swift b/Example Apps/Example Swift/ConnectionContainerViewController.swift
deleted file mode 100644
index 4e6dd3895..000000000
--- a/Example Apps/Example Swift/ConnectionContainerViewController.swift
+++ /dev/null
@@ -1,84 +0,0 @@
-//
-// ConnectionContainerViewController.swift
-// SmartDeviceLink-ExampleSwift
-//
-// Copyright © 2017 smartdevicelink. All rights reserved.
-//
-import UIKit
-
-class ConnectionContainerViewController: UIViewController {
- @IBOutlet weak var segmentedControl: UISegmentedControl!
- var viewControllers: [UIViewController] = []
- var currentViewController: UIViewController?
-
- override func viewDidLoad() {
- super.viewDidLoad()
-
- navigationController?.navigationBar.isTranslucent = false
- let tcpControllerStoryboard = UIStoryboard(name: "ConnectionTCPTableViewController", bundle: nil)
- let iapControllerStoryboard = UIStoryboard(name: "ConnectionIAPTableViewController", bundle: nil)
- let tcpController = tcpControllerStoryboard.instantiateViewController(withIdentifier :"ConnectionTCPTableViewController")
- let iapController = iapControllerStoryboard.instantiateViewController(withIdentifier :"ConnectionIAPTableViewController")
- viewControllers.append(tcpController)
- viewControllers.append(iapController)
-
- let defaultSegment = AppUserDefaults.shared.lastUsedSegment!
- segmentedControl.selectedSegmentIndex = defaultSegment
- loadChildViewController(index: defaultSegment)
-
- let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(slideToLeftWithGestureRecognizer(gestureRecognizer:)))
- let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(slideToRightWithGestureRecognizer(gestureRecognizer:)))
- leftSwipe.direction = .left
- rightSwipe.direction = .right
- view.addGestureRecognizer(leftSwipe)
- view.addGestureRecognizer(rightSwipe)
- }
-
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
-
- @IBAction func slideToLeftWithGestureRecognizer(gestureRecognizer: UISwipeGestureRecognizer) {
- if segmentedControl.selectedSegmentIndex == 0 {
- segmentedControl.selectedSegmentIndex = 1
- removeFromView()
- loadChildViewController(index: 1)
- }
- }
-
- @IBAction func slideToRightWithGestureRecognizer(gestureRecognizer: UISwipeGestureRecognizer) {
- if segmentedControl.selectedSegmentIndex == 1 {
- segmentedControl.selectedSegmentIndex = 0
- removeFromView()
- loadChildViewController(index: 0)
- }
- }
- // Grab changes in segmentedControl
- @IBAction func indexChanged(_ sender: AnyObject) {
- switch segmentedControl.selectedSegmentIndex {
- case 0:
- removeFromView()
- loadChildViewController(index: 0)
- case 1:
- removeFromView()
- loadChildViewController(index: 1)
- default:
- break
- }
- }
- // Mark: - View functions
- func removeFromView() {
- let vc = self.children.last
- vc?.view.removeFromSuperview()
- vc?.removeFromParent()
- }
-
- func loadChildViewController(index: Int?) {
- AppUserDefaults.shared.lastUsedSegment = index
- let initialViewController: UIViewController = viewControllers[index!]
- self.addChild(initialViewController)
- view.addSubview(initialViewController.view)
- initialViewController.didMove(toParent: self)
- }
-}
diff --git a/Example Apps/Example Swift/ConnectionIAPTableViewController.storyboard b/Example Apps/Example Swift/ConnectionIAPTableViewController.storyboard
deleted file mode 100644
index 736ebf493..000000000
--- a/Example Apps/Example Swift/ConnectionIAPTableViewController.storyboard
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="J12-ul-Tx1">
- <device id="retina4_7" orientation="portrait" appearance="light"/>
- <dependencies>
- <deployment identifier="iOS"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
- <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
- </dependencies>
- <scenes>
- <!--ConnectionIAP Table View Controller-->
- <scene sceneID="kGx-OZ-JDF">
- <objects>
- <tableViewController storyboardIdentifier="ConnectionIAPTableViewController" id="J12-ul-Tx1" customClass="ConnectionIAPTableViewController" customModule="SDL_Example_Swift" sceneMemberID="viewController">
- <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="MzB-GZ-Ook">
- <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
- <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
- <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
- <sections>
- <tableViewSection id="Qz3-D9-j37">
- <cells>
- <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="2sd-U1-9xV">
- <rect key="frame" x="0.0" y="10" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="2sd-U1-9xV" id="EhZ-2E-WQ5">
- <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <subviews>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="rjq-vZ-OjB">
- <rect key="frame" x="16" y="0.0" width="343" height="44"/>
- <fontDescription key="fontDescription" type="system" pointSize="23"/>
- <state key="normal" title="Connect">
- <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
- </state>
- <connections>
- <action selector="connectButtonWasPressed:" destination="J12-ul-Tx1" eventType="touchUpInside" id="OEM-Ca-Pms"/>
- </connections>
- </button>
- </subviews>
- <constraints>
- <constraint firstItem="rjq-vZ-OjB" firstAttribute="top" secondItem="EhZ-2E-WQ5" secondAttribute="top" id="8GY-v0-41a"/>
- <constraint firstAttribute="bottom" secondItem="rjq-vZ-OjB" secondAttribute="bottom" id="FKB-JG-o5G"/>
- <constraint firstAttribute="trailingMargin" secondItem="rjq-vZ-OjB" secondAttribute="trailing" id="ISQ-6b-S34"/>
- <constraint firstItem="rjq-vZ-OjB" firstAttribute="leading" secondItem="EhZ-2E-WQ5" secondAttribute="leadingMargin" id="PiJ-h3-NOR"/>
- </constraints>
- </tableViewCellContentView>
- </tableViewCell>
- </cells>
- </tableViewSection>
- </sections>
- <connections>
- <outlet property="dataSource" destination="J12-ul-Tx1" id="kTG-wP-6Fl"/>
- <outlet property="delegate" destination="J12-ul-Tx1" id="gKA-WB-R0A"/>
- </connections>
- </tableView>
- <connections>
- <outlet property="connectButton" destination="rjq-vZ-OjB" id="Sz8-r7-ddN"/>
- <outlet property="connectTableViewCell" destination="2sd-U1-9xV" id="UME-sB-vsD"/>
- <outlet property="table" destination="MzB-GZ-Ook" id="SME-OU-FAK"/>
- </connections>
- </tableViewController>
- <placeholder placeholderIdentifier="IBFirstResponder" id="N5a-E0-fOt" userLabel="First Responder" sceneMemberID="firstResponder"/>
- </objects>
- <point key="canvasLocation" x="898" y="630"/>
- </scene>
- </scenes>
-</document>
diff --git a/Example Apps/Example Swift/ConnectionIAPTableViewController.swift b/Example Apps/Example Swift/ConnectionIAPTableViewController.swift
index 3898c7a86..5a389b2d8 100644
--- a/Example Apps/Example Swift/ConnectionIAPTableViewController.swift
+++ b/Example Apps/Example Swift/ConnectionIAPTableViewController.swift
@@ -6,7 +6,7 @@
//
import UIKit
-class ConnectionIAPTableViewController: UITableViewController, ProxyManagerDelegate {
+class ConnectionIAPTableViewController: UITableViewController {
@IBOutlet weak var connectTableViewCell: UITableViewCell!
@IBOutlet weak var table: UITableView!
@IBOutlet weak var connectButton: UIButton!
@@ -16,32 +16,20 @@ class ConnectionIAPTableViewController: UITableViewController, ProxyManagerDeleg
override func viewDidLoad() {
super.viewDidLoad()
ProxyManager.sharedManager.delegate = self
+ title = "iAP"
table.keyboardDismissMode = .onDrag
table.isScrollEnabled = false
- initButton()
+ configureConnectButton()
}
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- }
-
- func initButton() {
+ private func configureConnectButton() {
self.connectTableViewCell.backgroundColor = UIColor.systemRed
self.connectButton.setTitle("Connect", for: .normal)
self.connectButton.setTitleColor(.white, for: .normal)
}
- // MARK: - IBActions
- @IBAction func connectButtonWasPressed(_ sender: UIButton) {
- switch proxyState {
- case .stopped:
- ProxyManager.sharedManager.start(with: .iap)
- case .searching:
- ProxyManager.sharedManager.stopConnection()
- case .connected:
- ProxyManager.sharedManager.stopConnection()
- }
- }
- // MARK: - Delegate Functions
+}
+
+extension ConnectionIAPTableViewController: ProxyManagerDelegate {
func didChangeProxyState(_ newState: ProxyState) {
proxyState = newState
var newColor: UIColor? = nil
@@ -49,13 +37,13 @@ class ConnectionIAPTableViewController: UITableViewController, ProxyManagerDeleg
switch newState {
case .stopped:
- newColor = UIColor.systemRed
+ newColor = .systemRed
newTitle = "Connect"
case .searching:
- newColor = UIColor.systemOrange
+ newColor = .systemOrange
newTitle = "Stop Searching"
case .connected:
- newColor = UIColor.systemGreen
+ newColor = .systemGreen
newTitle = "Disconnect"
}
@@ -68,3 +56,17 @@ class ConnectionIAPTableViewController: UITableViewController, ProxyManagerDeleg
}
}
}
+
+// MARK: - IBActions
+extension ConnectionIAPTableViewController {
+ @IBAction private func connectButtonWasPressed(_ sender: UIButton) {
+ switch proxyState {
+ case .stopped:
+ ProxyManager.sharedManager.start(with: .iap)
+ case .searching:
+ ProxyManager.sharedManager.stopConnection()
+ case .connected:
+ ProxyManager.sharedManager.stopConnection()
+ }
+ }
+}
diff --git a/Example Apps/Example Swift/ConnectionTCPTableViewController.storyboard b/Example Apps/Example Swift/ConnectionTCPTableViewController.storyboard
deleted file mode 100644
index 6cf589b73..000000000
--- a/Example Apps/Example Swift/ConnectionTCPTableViewController.storyboard
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="l5Q-ZP-1BO">
- <device id="retina4_7" orientation="portrait" appearance="light"/>
- <dependencies>
- <deployment identifier="iOS"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
- <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
- </dependencies>
- <scenes>
- <!--ConnectionTCP Table View Controller-->
- <scene sceneID="geJ-kX-PTm">
- <objects>
- <tableViewController storyboardIdentifier="ConnectionTCPTableViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="l5Q-ZP-1BO" customClass="ConnectionTCPTableViewController" customModule="SDL_Example_Swift" sceneMemberID="viewController">
- <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="7ZH-AV-Zyf">
- <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
- <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
- <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
- <sections>
- <tableViewSection headerTitle="TCP Server" id="bF6-yi-Ial">
- <cells>
- <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="pbJ-oz-jNt">
- <rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="pbJ-oz-jNt" id="B7X-yY-lwJ">
- <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <subviews>
- <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="IP Address" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="xqM-s4-9RV">
- <rect key="frame" x="16" y="0.0" width="343" height="44"/>
- <constraints>
- <constraint firstAttribute="height" constant="44" id="5Pw-mh-x83"/>
- </constraints>
- <fontDescription key="fontDescription" type="system" pointSize="17"/>
- <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="URL"/>
- </textField>
- </subviews>
- <constraints>
- <constraint firstAttribute="centerY" secondItem="xqM-s4-9RV" secondAttribute="centerY" id="PcX-lz-oQo"/>
- <constraint firstItem="xqM-s4-9RV" firstAttribute="trailing" secondItem="B7X-yY-lwJ" secondAttribute="trailingMargin" id="YF9-Uh-Yqm"/>
- <constraint firstItem="xqM-s4-9RV" firstAttribute="leading" secondItem="B7X-yY-lwJ" secondAttribute="leadingMargin" id="pBt-SK-tuZ"/>
- </constraints>
- </tableViewCellContentView>
- <color key="backgroundColor" cocoaTouchSystemColor="tableCellGroupedBackgroundColor"/>
- </tableViewCell>
- <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="C5b-fS-v3d">
- <rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="C5b-fS-v3d" id="ZD4-xA-og5">
- <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <subviews>
- <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Port" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="hsI-ld-8xY">
- <rect key="frame" x="16" y="0.0" width="343" height="44"/>
- <constraints>
- <constraint firstAttribute="height" constant="44" id="FpG-5e-MHT"/>
- </constraints>
- <fontDescription key="fontDescription" type="system" pointSize="17"/>
- <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="numberPad"/>
- </textField>
- </subviews>
- <constraints>
- <constraint firstAttribute="centerY" secondItem="hsI-ld-8xY" secondAttribute="centerY" id="X1e-g3-RJN"/>
- <constraint firstItem="hsI-ld-8xY" firstAttribute="leading" secondItem="ZD4-xA-og5" secondAttribute="leadingMargin" id="oeB-5U-tOl"/>
- <constraint firstItem="hsI-ld-8xY" firstAttribute="trailing" secondItem="ZD4-xA-og5" secondAttribute="trailingMargin" id="wXl-bK-7vU"/>
- </constraints>
- </tableViewCellContentView>
- <color key="backgroundColor" cocoaTouchSystemColor="tableCellGroupedBackgroundColor"/>
- </tableViewCell>
- </cells>
- </tableViewSection>
- <tableViewSection headerTitle="" id="rgl-Lm-uDH">
- <cells>
- <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="ybX-Eh-Hbx">
- <rect key="frame" x="0.0" y="175.5" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ybX-Eh-Hbx" id="uI9-fK-205">
- <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
- <autoresizingMask key="autoresizingMask"/>
- <subviews>
- <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="t37-4W-6F4">
- <rect key="frame" x="16" y="0.0" width="343" height="44"/>
- <fontDescription key="fontDescription" type="system" pointSize="23"/>
- <state key="normal" title="Connect">
- <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
- </state>
- <connections>
- <action selector="connectButtonWasPressed:" destination="l5Q-ZP-1BO" eventType="touchUpInside" id="4Kr-4D-O7b"/>
- </connections>
- </button>
- </subviews>
- <constraints>
- <constraint firstItem="t37-4W-6F4" firstAttribute="top" secondItem="uI9-fK-205" secondAttribute="top" id="IfU-4k-EXx"/>
- <constraint firstItem="t37-4W-6F4" firstAttribute="leading" secondItem="uI9-fK-205" secondAttribute="leadingMargin" id="cc3-uk-9fL"/>
- <constraint firstAttribute="bottom" secondItem="t37-4W-6F4" secondAttribute="bottom" id="hnD-4g-xvT"/>
- <constraint firstAttribute="trailingMargin" secondItem="t37-4W-6F4" secondAttribute="trailing" id="j4p-fi-0LP"/>
- </constraints>
- </tableViewCellContentView>
- </tableViewCell>
- </cells>
- </tableViewSection>
- </sections>
- <connections>
- <outlet property="dataSource" destination="l5Q-ZP-1BO" id="r5q-yg-LY6"/>
- <outlet property="delegate" destination="l5Q-ZP-1BO" id="xFj-yP-z0A"/>
- </connections>
- </tableView>
- <navigationItem key="navigationItem" id="JNL-hN-wDm">
- <nil key="title"/>
- <segmentedControl key="titleView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="rXi-EW-KGG">
- <rect key="frame" x="180" y="7" width="240" height="30"/>
- <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
- <segments>
- <segment title="TCP Debug"/>
- <segment title="iAP"/>
- </segments>
- </segmentedControl>
- </navigationItem>
- <connections>
- <outlet property="connectButton" destination="t37-4W-6F4" id="f6v-Q4-ggs"/>
- <outlet property="connectTableViewCell" destination="ybX-Eh-Hbx" id="hyh-CW-oXx"/>
- <outlet property="ipAddressTextField" destination="xqM-s4-9RV" id="daz-uN-Rxa"/>
- <outlet property="portTextField" destination="hsI-ld-8xY" id="5pF-XP-Xh3"/>
- <outlet property="table" destination="7ZH-AV-Zyf" id="4nR-6A-RzX"/>
- </connections>
- </tableViewController>
- <placeholder placeholderIdentifier="IBFirstResponder" id="0fm-wO-kFd" userLabel="First Responder" sceneMemberID="firstResponder"/>
- </objects>
- <point key="canvasLocation" x="688" y="499"/>
- </scene>
- </scenes>
-</document>
diff --git a/Example Apps/Example Swift/ConnectionTCPTableViewController.swift b/Example Apps/Example Swift/ConnectionTCPTableViewController.swift
index 5195ce462..e03c6dac5 100644
--- a/Example Apps/Example Swift/ConnectionTCPTableViewController.swift
+++ b/Example Apps/Example Swift/ConnectionTCPTableViewController.swift
@@ -6,7 +6,7 @@
//
import UIKit
-class ConnectionTCPTableViewController: UITableViewController, UINavigationControllerDelegate, ProxyManagerDelegate {
+class ConnectionTCPTableViewController: UITableViewController, UINavigationControllerDelegate {
@IBOutlet weak var ipAddressTextField: UITextField!
@IBOutlet weak var portTextField: UITextField!
@IBOutlet weak var connectTableViewCell: UITableViewCell!
@@ -18,46 +18,23 @@ class ConnectionTCPTableViewController: UITableViewController, UINavigationContr
override func viewDidLoad() {
super.viewDidLoad()
ProxyManager.sharedManager.delegate = self
+ title = "TCP"
table.keyboardDismissMode = .onDrag
table.isScrollEnabled = false
ipAddressTextField.text = AppUserDefaults.shared.ipAddress
portTextField.text = AppUserDefaults.shared.port
- initButton()
+ configureConnectButton()
}
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- }
-
- func initButton() {
+ private func configureConnectButton() {
self.connectTableViewCell.backgroundColor = UIColor.systemRed
self.connectButton.setTitle("Connect", for: .normal)
self.connectButton.setTitleColor(.white, for: .normal)
}
- // MARK: - IBActions
- @IBAction func connectButtonWasPressed(_ sender: UIButton) {
- let ipAddress = ipAddressTextField.text
- let port = portTextField.text
-
- if ipAddress != "" || port != "" {
- AppUserDefaults.shared.ipAddress = ipAddress
- AppUserDefaults.shared.port = port
+}
- switch proxyState {
- case .stopped:
- ProxyManager.sharedManager.start(with: .tcp)
- case .searching:
- ProxyManager.sharedManager.stopConnection()
- case .connected:
- ProxyManager.sharedManager.stopConnection()
- }
- } else {
- let alertMessage = UIAlertController(title: "Missing Info!", message: "Make sure to set your IP Address and Port", preferredStyle: .alert)
- alertMessage.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
- self.present(alertMessage, animated: true, completion: nil)
- }
- }
- // MARK: - Delegate Functions
+// MARK: - Delegate Functions
+extension ConnectionTCPTableViewController: ProxyManagerDelegate {
func didChangeProxyState(_ newState: ProxyState) {
proxyState = newState
var newColor: UIColor? = nil
@@ -84,3 +61,29 @@ class ConnectionTCPTableViewController: UITableViewController, UINavigationContr
}
}
}
+
+// MARK: - IBActions
+extension ConnectionTCPTableViewController {
+ @IBAction func connectButtonWasPressed(_ sender: UIButton) {
+ let ipAddress = ipAddressTextField.text
+ let port = portTextField.text
+
+ if ipAddress != "" || port != "" {
+ AppUserDefaults.shared.ipAddress = ipAddress
+ AppUserDefaults.shared.port = port
+
+ switch proxyState {
+ case .stopped:
+ ProxyManager.sharedManager.start(with: .tcp)
+ case .searching:
+ ProxyManager.sharedManager.stopConnection()
+ case .connected:
+ ProxyManager.sharedManager.stopConnection()
+ }
+ } else {
+ let alertMessage = UIAlertController(title: "Missing Info!", message: "Make sure to set your IP Address and Port", preferredStyle: .alert)
+ alertMessage.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
+ self.present(alertMessage, animated: true, completion: nil)
+ }
+ }
+}
diff --git a/Example Apps/Example Swift/ConnectionTabBarController.swift b/Example Apps/Example Swift/ConnectionTabBarController.swift
new file mode 100644
index 000000000..3486a2aff
--- /dev/null
+++ b/Example Apps/Example Swift/ConnectionTabBarController.swift
@@ -0,0 +1,26 @@
+//
+// ConnectionTabBarController.swift
+// SmartDeviceLink-Example-Swift
+//
+// Created by Joel Fischer on 9/23/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+import UIKit
+
+class ConnectionTabBarController: UITabBarController {
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ delegate = self
+ selectedIndex = AppUserDefaults.shared.lastUsedSegment
+ }
+}
+
+extension ConnectionTabBarController: UITabBarControllerDelegate {
+ override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
+ if let index = tabBar.items?.firstIndex(where: {$0 == item}) {
+ AppUserDefaults.shared.lastUsedSegment = index
+ }
+ }
+}
diff --git a/Example Apps/Example Swift/Main.storyboard b/Example Apps/Example Swift/Main.storyboard
index 3adca9d22..24cf6f50e 100644
--- a/Example Apps/Example Swift/Main.storyboard
+++ b/Example Apps/Example Swift/Main.storyboard
@@ -1,64 +1,245 @@
<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15400" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="mM3-m6-I5t">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19162" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="eYu-bD-AQx">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15404"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19144"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
- <!--Navigation Controller-->
- <scene sceneID="Tfy-dw-box">
+ <!--Connection Tab Bar Controller-->
+ <scene sceneID="nha-wC-GFn">
<objects>
- <navigationController automaticallyAdjustsScrollViewInsets="NO" id="mM3-m6-I5t" sceneMemberID="viewController">
+ <tabBarController id="eYu-bD-AQx" customClass="ConnectionTabBarController" customModule="SDL_Example_Swift" customModuleProvider="target" sceneMemberID="viewController">
+ <tabBar key="tabBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="1du-k9-Mo1">
+ <rect key="frame" x="0.0" y="0.0" width="414" height="49"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </tabBar>
+ <connections>
+ <segue destination="3c6-84-W1v" kind="relationship" relationship="viewControllers" id="4AX-6q-yOp"/>
+ <segue destination="Q0y-Gf-PPI" kind="relationship" relationship="viewControllers" id="SJZ-P9-mHI"/>
+ </connections>
+ </tabBarController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="PUz-pd-tt1" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="1607" y="533"/>
+ </scene>
+ <!--TCP-->
+ <scene sceneID="Dzi-kz-rh7">
+ <objects>
+ <navigationController automaticallyAdjustsScrollViewInsets="NO" id="3c6-84-W1v" sceneMemberID="viewController">
+ <tabBarItem key="tabBarItem" title="TCP" image="dot.radiowaves.right" catalog="system" id="CyN-Ke-69P"/>
<toolbarItems/>
- <navigationBar key="navigationBar" contentMode="scaleToFill" id="eMh-g9-C8T">
- <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" largeTitles="YES" id="Ai0-l3-zE7">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="96"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
- <segue destination="cXb-Co-0MA" kind="relationship" relationship="rootViewController" id="tbn-vJ-YS8"/>
+ <segue destination="S8J-13-JhS" kind="relationship" relationship="rootViewController" id="Tbo-rT-7Bb"/>
</connections>
</navigationController>
- <placeholder placeholderIdentifier="IBFirstResponder" id="eXu-Zc-53v" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="HQE-d2-yCj" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
- <point key="canvasLocation" x="896" y="527"/>
+ <point key="canvasLocation" x="2525.5999999999999" y="228.93553223388307"/>
</scene>
- <!--Connection Container View Controller-->
- <scene sceneID="vG9-Hv-OW2">
+ <!--iAP-->
+ <scene sceneID="DfT-0m-fCj">
<objects>
- <viewController id="cXb-Co-0MA" customClass="ConnectionContainerViewController" customModule="SDL_Example_Swift" sceneMemberID="viewController">
- <layoutGuides>
- <viewControllerLayoutGuide type="top" id="bfp-O0-sxl"/>
- <viewControllerLayoutGuide type="bottom" id="fet-m3-F1O"/>
- </layoutGuides>
- <view key="view" contentMode="scaleToFill" id="jkb-9Y-Hwh">
+ <navigationController automaticallyAdjustsScrollViewInsets="NO" id="Q0y-Gf-PPI" sceneMemberID="viewController">
+ <tabBarItem key="tabBarItem" title="iAP" image="car" catalog="system" id="UcM-qm-mVj"/>
+ <toolbarItems/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" largeTitles="YES" id="gnm-bX-s0x">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="96"/>
+ <autoresizingMask key="autoresizingMask"/>
+ </navigationBar>
+ <nil name="viewControllers"/>
+ <connections>
+ <segue destination="ccd-Lb-qlW" kind="relationship" relationship="rootViewController" id="Bho-ot-jCK"/>
+ </connections>
+ </navigationController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="TAk-se-TLo" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="2526" y="906"/>
+ </scene>
+ <!--ConnectionTCP Table View Controller-->
+ <scene sceneID="PT3-CO-2Fj">
+ <objects>
+ <tableViewController storyboardIdentifier="ConnectionTCPTableViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="S8J-13-JhS" customClass="ConnectionTCPTableViewController" customModule="SDL_Example_Swift" sceneMemberID="viewController">
+ <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="46o-kW-bdX">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
- <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
- </view>
- <navigationItem key="navigationItem" id="t1a-s2-nn6">
+ <color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
+ <sections>
+ <tableViewSection headerTitle="TCP Server" id="ywt-qG-svz">
+ <cells>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="Qnt-Cr-o9a">
+ <rect key="frame" x="0.0" y="32" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Qnt-Cr-o9a" id="IB7-jx-7fA">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="IP Address" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="b7h-uu-1mR">
+ <rect key="frame" x="16" y="0.0" width="343" height="44"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="44" id="sbI-uw-UFA"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="URL"/>
+ </textField>
+ </subviews>
+ <constraints>
+ <constraint firstItem="b7h-uu-1mR" firstAttribute="leading" secondItem="IB7-jx-7fA" secondAttribute="leadingMargin" id="7dE-j3-uvS"/>
+ <constraint firstAttribute="centerY" secondItem="b7h-uu-1mR" secondAttribute="centerY" id="aJm-Mz-t2g"/>
+ <constraint firstItem="b7h-uu-1mR" firstAttribute="trailing" secondItem="IB7-jx-7fA" secondAttribute="trailingMargin" id="cIV-e1-nZa"/>
+ </constraints>
+ </tableViewCellContentView>
+ <color key="backgroundColor" systemColor="tableCellGroupedBackgroundColor"/>
+ </tableViewCell>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="L2E-NM-Bd2">
+ <rect key="frame" x="0.0" y="76" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="L2E-NM-Bd2" id="NUS-jV-INS">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Port" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="yLC-iL-Joa">
+ <rect key="frame" x="16" y="0.0" width="343" height="44"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="44" id="lhP-dD-Uz7"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="numberPad"/>
+ </textField>
+ </subviews>
+ <constraints>
+ <constraint firstItem="yLC-iL-Joa" firstAttribute="leading" secondItem="NUS-jV-INS" secondAttribute="leadingMargin" id="0bP-7J-xZh"/>
+ <constraint firstAttribute="centerY" secondItem="yLC-iL-Joa" secondAttribute="centerY" id="Fdo-tB-6ID"/>
+ <constraint firstItem="yLC-iL-Joa" firstAttribute="trailing" secondItem="NUS-jV-INS" secondAttribute="trailingMargin" id="MHG-gS-JhY"/>
+ </constraints>
+ </tableViewCellContentView>
+ <color key="backgroundColor" systemColor="tableCellGroupedBackgroundColor"/>
+ </tableViewCell>
+ </cells>
+ </tableViewSection>
+ <tableViewSection headerTitle="" id="4vf-dA-rRm">
+ <cells>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="A2J-cL-Ha3">
+ <rect key="frame" x="0.0" y="147.5" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="A2J-cL-Ha3" id="lG9-iw-A3p">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="tailTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="96f-qb-2Sa">
+ <rect key="frame" x="16" y="0.0" width="343" height="44"/>
+ <fontDescription key="fontDescription" type="system" pointSize="23"/>
+ <state key="normal" title="Connect">
+ <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </state>
+ <connections>
+ <action selector="connectButtonWasPressed:" destination="S8J-13-JhS" eventType="touchUpInside" id="6DA-Z6-NYQ"/>
+ </connections>
+ </button>
+ </subviews>
+ <constraints>
+ <constraint firstAttribute="bottom" secondItem="96f-qb-2Sa" secondAttribute="bottom" id="CKa-pV-EY1"/>
+ <constraint firstItem="96f-qb-2Sa" firstAttribute="leading" secondItem="lG9-iw-A3p" secondAttribute="leadingMargin" id="GKy-km-YAW"/>
+ <constraint firstAttribute="trailingMargin" secondItem="96f-qb-2Sa" secondAttribute="trailing" id="eIk-Tr-M9z"/>
+ <constraint firstItem="96f-qb-2Sa" firstAttribute="top" secondItem="lG9-iw-A3p" secondAttribute="top" id="uc3-Gf-1FQ"/>
+ </constraints>
+ </tableViewCellContentView>
+ </tableViewCell>
+ </cells>
+ </tableViewSection>
+ </sections>
+ <connections>
+ <outlet property="dataSource" destination="S8J-13-JhS" id="nDj-x5-rp3"/>
+ <outlet property="delegate" destination="S8J-13-JhS" id="Wew-e6-3vW"/>
+ </connections>
+ </tableView>
+ <navigationItem key="navigationItem" id="NJc-xM-Wtz">
<nil key="title"/>
- <segmentedControl key="titleView" opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="0" id="RYa-fE-Qek">
- <rect key="frame" x="67.5" y="6" width="240" height="32"/>
- <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
- <segments>
- <segment title="TCP Debug"/>
- <segment title="iAP"/>
- </segments>
- <connections>
- <action selector="indexChanged:" destination="cXb-Co-0MA" eventType="valueChanged" id="VKA-yi-yYw"/>
- </connections>
- </segmentedControl>
</navigationItem>
<connections>
- <outlet property="segmentedControl" destination="RYa-fE-Qek" id="w1s-Cm-qxn"/>
+ <outlet property="connectButton" destination="96f-qb-2Sa" id="TSJ-lt-dUN"/>
+ <outlet property="connectTableViewCell" destination="A2J-cL-Ha3" id="GbU-WY-Kkr"/>
+ <outlet property="ipAddressTextField" destination="b7h-uu-1mR" id="tFt-ty-Fr8"/>
+ <outlet property="portTextField" destination="yLC-iL-Joa" id="R25-qT-On9"/>
+ <outlet property="table" destination="46o-kW-bdX" id="dj3-LW-4TM"/>
+ </connections>
+ </tableViewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="m47-Fd-A6E" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="3318" y="229"/>
+ </scene>
+ <!--ConnectionIAP Table View Controller-->
+ <scene sceneID="jwH-4w-VAc">
+ <objects>
+ <tableViewController storyboardIdentifier="ConnectionIAPTableViewController" id="ccd-Lb-qlW" customClass="ConnectionIAPTableViewController" customModule="SDL_Example_Swift" sceneMemberID="viewController">
+ <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="none" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="nDU-Sx-iwg">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
+ <sections>
+ <tableViewSection id="dhw-a6-tO6">
+ <cells>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="Cgm-3J-LII">
+ <rect key="frame" x="0.0" y="10" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Cgm-3J-LII" id="cRo-ox-IzT">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="PdA-3h-dSa">
+ <rect key="frame" x="16" y="0.0" width="343" height="44"/>
+ <fontDescription key="fontDescription" type="system" pointSize="23"/>
+ <state key="normal" title="Connect">
+ <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </state>
+ <connections>
+ <action selector="connectButtonWasPressed:" destination="ccd-Lb-qlW" eventType="touchUpInside" id="Tde-fn-o40"/>
+ </connections>
+ </button>
+ </subviews>
+ <constraints>
+ <constraint firstAttribute="bottom" secondItem="PdA-3h-dSa" secondAttribute="bottom" id="92e-PW-VC2"/>
+ <constraint firstItem="PdA-3h-dSa" firstAttribute="top" secondItem="cRo-ox-IzT" secondAttribute="top" id="TTS-Zu-Aib"/>
+ <constraint firstItem="PdA-3h-dSa" firstAttribute="leading" secondItem="cRo-ox-IzT" secondAttribute="leadingMargin" id="eeX-wg-dmk"/>
+ <constraint firstAttribute="trailingMargin" secondItem="PdA-3h-dSa" secondAttribute="trailing" id="tIj-Xo-jcQ"/>
+ </constraints>
+ </tableViewCellContentView>
+ </tableViewCell>
+ </cells>
+ </tableViewSection>
+ </sections>
+ <connections>
+ <outlet property="dataSource" destination="ccd-Lb-qlW" id="fNO-hh-HjX"/>
+ <outlet property="delegate" destination="ccd-Lb-qlW" id="UkS-JU-b6I"/>
+ </connections>
+ </tableView>
+ <navigationItem key="navigationItem" id="y5U-GZ-gzX"/>
+ <connections>
+ <outlet property="connectButton" destination="PdA-3h-dSa" id="iSb-JV-iUg"/>
+ <outlet property="connectTableViewCell" destination="Cgm-3J-LII" id="qXv-i4-omk"/>
+ <outlet property="table" destination="nDU-Sx-iwg" id="5X0-VE-2Zs"/>
</connections>
- </viewController>
- <placeholder placeholderIdentifier="IBFirstResponder" id="ETn-uq-A6g" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </tableViewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iAo-Ms-Mov" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
- <point key="canvasLocation" x="1576" y="527"/>
+ <point key="canvasLocation" x="3318" y="905"/>
</scene>
</scenes>
+ <resources>
+ <image name="car" catalog="system" width="128" height="93"/>
+ <image name="dot.radiowaves.right" catalog="system" width="117" height="128"/>
+ <systemColor name="groupTableViewBackgroundColor">
+ <color red="0.94901960780000005" green="0.94901960780000005" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </systemColor>
+ <systemColor name="tableCellGroupedBackgroundColor">
+ <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </systemColor>
+ </resources>
</document>
diff --git a/Example Apps/Shared/Images.xcassets/Contents.json b/Example Apps/Shared/Images.xcassets/Contents.json
index da4a164c9..73c00596a 100644
--- a/Example Apps/Shared/Images.xcassets/Contents.json
+++ b/Example Apps/Shared/Images.xcassets/Contents.json
@@ -1,6 +1,6 @@
{
"info" : {
- "version" : 1,
- "author" : "xcode"
+ "author" : "xcode",
+ "version" : 1
}
-} \ No newline at end of file
+}
diff --git a/Example Apps/Shared/Images.xcassets/dot.radiowaves.right.imageset/Contents.json b/Example Apps/Shared/Images.xcassets/dot.radiowaves.right.imageset/Contents.json
new file mode 100644
index 000000000..02e7f1513
--- /dev/null
+++ b/Example Apps/Shared/Images.xcassets/dot.radiowaves.right.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "dot.radiowaves.right@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Example Apps/Shared/Images.xcassets/dot.radiowaves.right.imageset/dot.radiowaves.right@2x.png b/Example Apps/Shared/Images.xcassets/dot.radiowaves.right.imageset/dot.radiowaves.right@2x.png
new file mode 100644
index 000000000..3f5353253
--- /dev/null
+++ b/Example Apps/Shared/Images.xcassets/dot.radiowaves.right.imageset/dot.radiowaves.right@2x.png
Binary files differ
diff --git a/Example Apps/Shared/dot.radiowaves.right@2x.png b/Example Apps/Shared/dot.radiowaves.right@2x.png
new file mode 100644
index 000000000..3f5353253
--- /dev/null
+++ b/Example Apps/Shared/dot.radiowaves.right@2x.png
Binary files differ
diff --git a/SmartDeviceLink-iOS.podspec b/SmartDeviceLink-iOS.podspec
index f73173537..0e63d754d 100644
--- a/SmartDeviceLink-iOS.podspec
+++ b/SmartDeviceLink-iOS.podspec
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|
s.name = "SmartDeviceLink-iOS"
-s.version = "7.2.0"
+s.version = "7.3.0"
s.summary = "Connect your app with cars!"
s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS"
s.license = { :type => "New BSD", :file => "LICENSE" }
diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
index ccf58ea3e..1ec493f39 100644
--- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
+++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
@@ -513,9 +513,22 @@
4A8BD3CD24F999BE000945E3 /* TestSubscribeButtonObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A8BD3CC24F999BE000945E3 /* TestSubscribeButtonObserver.m */; };
4A8BD3D024FE7CF1000945E3 /* SDLPermissionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A8BD3CE24FE7CF1000945E3 /* SDLPermissionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
4A8BD3D124FE7CF1000945E3 /* SDLPermissionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A8BD3CF24FE7CF1000945E3 /* SDLPermissionManager.m */; };
+ 4A93893D25B8CBD40069F438 /* SDLMenuReplaceOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A93893B25B8CBD40069F438 /* SDLMenuReplaceOperation.h */; };
+ 4A93893E25B8CBD40069F438 /* SDLMenuReplaceOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A93893C25B8CBD40069F438 /* SDLMenuReplaceOperation.m */; };
+ 4A93895325B9DACA0069F438 /* SDLMenuShowOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A93895125B9DACA0069F438 /* SDLMenuShowOperation.h */; };
+ 4A93895425B9DACA0069F438 /* SDLMenuShowOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A93895225B9DACA0069F438 /* SDLMenuShowOperation.m */; };
+ 4A93895925B9E5E40069F438 /* SDLMenuConfigurationUpdateOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A93895725B9E5E40069F438 /* SDLMenuConfigurationUpdateOperation.h */; };
+ 4A93895A25B9E5E40069F438 /* SDLMenuConfigurationUpdateOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A93895825B9E5E40069F438 /* SDLMenuConfigurationUpdateOperation.m */; };
+ 4A93896625BB361C0069F438 /* SDLMenuReplaceUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A93896425BB361C0069F438 /* SDLMenuReplaceUtilities.h */; };
+ 4A93896725BB361C0069F438 /* SDLMenuReplaceUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A93896525BB361C0069F438 /* SDLMenuReplaceUtilities.m */; };
+ 4A96113B25D1A0C600D787DA /* SDLMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A96113925D1A0C600D787DA /* SDLMacros.h */; };
4AAB6A1225E57BEA0017A5A7 /* SDLSystemInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AAB6A1025E57BEA0017A5A7 /* SDLSystemInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
4AAB6A1325E57BEA0017A5A7 /* SDLSystemInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AAB6A1125E57BEA0017A5A7 /* SDLSystemInfo.m */; };
4AAB6A2325E69D010017A5A7 /* SDLSystemInfoSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AAB6A2225E69D010017A5A7 /* SDLSystemInfoSpec.m */; };
+ 4AAC0DBA25C1FEBA00746D33 /* SDLMenuManagerPrivateConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AAC0DB825C1FEBA00746D33 /* SDLMenuManagerPrivateConstants.h */; };
+ 4AAC0DBB25C1FEBA00746D33 /* SDLMenuManagerPrivateConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AAC0DB925C1FEBA00746D33 /* SDLMenuManagerPrivateConstants.m */; };
+ 4AAC0DE025C468EC00746D33 /* SDLMenuReplaceUtilitiesSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AAC0DDF25C468EC00746D33 /* SDLMenuReplaceUtilitiesSpec.m */; };
+ 4AAC0DE825C493EE00746D33 /* SDLMenuReplaceUtilitiesSpecHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AAC0DE725C493EE00746D33 /* SDLMenuReplaceUtilitiesSpecHelpers.m */; };
4ABB24BA24F592620061BF55 /* NSMutableArray+Safe.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB24B224F592620061BF55 /* NSMutableArray+Safe.h */; };
4ABB24BB24F592620061BF55 /* NSMutableArray+Safe.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB24B324F592620061BF55 /* NSMutableArray+Safe.m */; };
4ABB24BC24F592620061BF55 /* NSBundle+SDLBundle.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB24B424F592620061BF55 /* NSBundle+SDLBundle.m */; };
@@ -599,13 +612,11 @@
4ABB256324F7E5AA0061BF55 /* SDLPermissionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB256124F7E5AA0061BF55 /* SDLPermissionElement.h */; settings = {ATTRIBUTES = (Public, ); }; };
4ABB256624F7E5B80061BF55 /* SDLRPCPermissionStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB256424F7E5B70061BF55 /* SDLRPCPermissionStatus.m */; };
4ABB256724F7E5B80061BF55 /* SDLRPCPermissionStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB256524F7E5B80061BF55 /* SDLRPCPermissionStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 4ABB257024F7E5E80061BF55 /* SDLPreloadChoicesOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB256824F7E5E70061BF55 /* SDLPreloadChoicesOperation.m */; };
- 4ABB257124F7E5E80061BF55 /* SDLPresentChoiceSetOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB256924F7E5E70061BF55 /* SDLPresentChoiceSetOperation.m */; };
+ 4ABB257024F7E5E80061BF55 /* SDLPreloadPresentChoicesOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB256824F7E5E70061BF55 /* SDLPreloadPresentChoicesOperation.m */; };
4ABB257224F7E5E80061BF55 /* SDLCheckChoiceVROptionalOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB256A24F7E5E70061BF55 /* SDLCheckChoiceVROptionalOperation.m */; };
4ABB257324F7E5E80061BF55 /* SDLCheckChoiceVROptionalOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB256B24F7E5E70061BF55 /* SDLCheckChoiceVROptionalOperation.h */; };
- 4ABB257424F7E5E80061BF55 /* SDLPresentChoiceSetOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB256C24F7E5E70061BF55 /* SDLPresentChoiceSetOperation.h */; };
4ABB257524F7E5E80061BF55 /* SDLDeleteChoicesOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB256D24F7E5E70061BF55 /* SDLDeleteChoicesOperation.m */; };
- 4ABB257624F7E5E80061BF55 /* SDLPreloadChoicesOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB256E24F7E5E80061BF55 /* SDLPreloadChoicesOperation.h */; };
+ 4ABB257624F7E5E80061BF55 /* SDLPreloadPresentChoicesOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB256E24F7E5E80061BF55 /* SDLPreloadPresentChoicesOperation.h */; };
4ABB257724F7E5E80061BF55 /* SDLDeleteChoicesOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB256F24F7E5E80061BF55 /* SDLDeleteChoicesOperation.h */; };
4ABB257A24F7E5FF0061BF55 /* SDLPresentKeyboardOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB257824F7E5FF0061BF55 /* SDLPresentKeyboardOperation.m */; };
4ABB257B24F7E5FF0061BF55 /* SDLPresentKeyboardOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB257924F7E5FF0061BF55 /* SDLPresentKeyboardOperation.h */; };
@@ -1389,9 +1400,17 @@
4ABB2BA724F850AE0061BF55 /* SDLImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB2B9924F850AD0061BF55 /* SDLImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
4ABB2BA824F850AE0061BF55 /* SDLLightState.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB2B9A24F850AD0061BF55 /* SDLLightState.m */; };
4ABB2BA924F850AE0061BF55 /* SDLImageResolution.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB2B9B24F850AD0061BF55 /* SDLImageResolution.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4ABC1CA725DC4E1C00545AC6 /* SDLMenuReplaceOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABC1CA625DC4E1C00545AC6 /* SDLMenuReplaceOperationSpec.m */; };
+ 4ABC1CAD25DC51A800545AC6 /* SDLMenuConfigurationUpdateOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABC1CAC25DC51A800545AC6 /* SDLMenuConfigurationUpdateOperationSpec.m */; };
+ 4ABC1CB125DC520300545AC6 /* SDLMenuShowOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABC1CB025DC520300545AC6 /* SDLMenuShowOperationSpec.m */; };
4ABED25B257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */; };
4ABED25C257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */; };
+ 4AC0128026D9612E00537E31 /* SDLPreloadPresentChoicesOperationUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AC0127E26D9612E00537E31 /* SDLPreloadPresentChoicesOperationUtilities.h */; };
+ 4AC0128126D9612E00537E31 /* SDLPreloadPresentChoicesOperationUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AC0127F26D9612E00537E31 /* SDLPreloadPresentChoicesOperationUtilities.m */; };
+ 4AC0128326D9686F00537E31 /* SDLPreloadPresentChoicesOperationUtilitiesSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AC0128226D9686F00537E31 /* SDLPreloadPresentChoicesOperationUtilitiesSpec.m */; };
4AD1F1742559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */; };
+ 4ADBD1F826FCED4000ABB045 /* ConnectionTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ADBD1F726FCED4000ABB045 /* ConnectionTabBarController.swift */; };
+ 4ADBD1FB26FCEDFC00ABB045 /* ConnectionTabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ADBD1FA26FCEDFC00ABB045 /* ConnectionTabBarController.m */; };
4AE8A7022537796E000666C0 /* SmartDeviceLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AE8A7012537796E000666C0 /* SmartDeviceLink.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D0A9F911F15550400CC80DD /* SDLSystemCapabilityTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0A9F901F15550400CC80DD /* SDLSystemCapabilityTypeSpec.m */; };
5D0A9F931F15560B00CC80DD /* SDLNavigationCapabilitySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0A9F921F15560B00CC80DD /* SDLNavigationCapabilitySpec.m */; };
@@ -1409,14 +1428,9 @@
5D1FF2A221304515000EB9B4 /* ButtonManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF29B21304515000EB9B4 /* ButtonManager.m */; };
5D1FF2A721304531000EB9B4 /* Preferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2A421304531000EB9B4 /* Preferences.m */; };
5D1FF2A821304531000EB9B4 /* TextValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2A621304531000EB9B4 /* TextValidator.m */; };
- 5D1FF2AF21304568000EB9B4 /* ConnectionTCPTableViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5D1FF2A921304567000EB9B4 /* ConnectionTCPTableViewController.storyboard */; };
5D1FF2B021304568000EB9B4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5D1FF2AB21304567000EB9B4 /* Main.storyboard */; };
- 5D1FF2B121304568000EB9B4 /* ConnectionIAPTableViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5D1FF2AD21304567000EB9B4 /* ConnectionIAPTableViewController.storyboard */; };
5D1FF2B821304581000EB9B4 /* ConnectionIAPTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2B421304580000EB9B4 /* ConnectionIAPTableViewController.m */; };
- 5D1FF2B921304581000EB9B4 /* ConnectionContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2B521304581000EB9B4 /* ConnectionContainerViewController.m */; };
5D1FF2BA21304581000EB9B4 /* ConnectionTCPTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2B621304581000EB9B4 /* ConnectionTCPTableViewController.m */; };
- 5D1FF2BF21304598000EB9B4 /* ConnectionAnimatedTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2BC21304598000EB9B4 /* ConnectionAnimatedTransition.m */; };
- 5D1FF2C021304598000EB9B4 /* ConnectionTransitionContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2BE21304598000EB9B4 /* ConnectionTransitionContext.m */; };
5D1FF2C3213045EB000EB9B4 /* AppConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2C2213045EB000EB9B4 /* AppConstants.m */; };
5D1FF2C4213045EB000EB9B4 /* AppConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2C2213045EB000EB9B4 /* AppConstants.m */; };
5D1FF2C6213045F2000EB9B4 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5D1FF2C5213045F1000EB9B4 /* Images.xcassets */; };
@@ -1435,12 +1449,9 @@
5D1FF2E521304761000EB9B4 /* AppUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2E221304761000EB9B4 /* AppUserDefaults.swift */; };
5D1FF2E621304761000EB9B4 /* ProxyManagerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2E321304761000EB9B4 /* ProxyManagerDelegate.swift */; };
5D1FF2E721304761000EB9B4 /* TextValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2E421304761000EB9B4 /* TextValidator.swift */; };
- 5D1FF2EB2130479C000EB9B4 /* ConnectionContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2E82130479C000EB9B4 /* ConnectionContainerViewController.swift */; };
5D1FF2EC2130479C000EB9B4 /* ConnectionTCPTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2E92130479C000EB9B4 /* ConnectionTCPTableViewController.swift */; };
5D1FF2ED2130479C000EB9B4 /* ConnectionIAPTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2EA2130479C000EB9B4 /* ConnectionIAPTableViewController.swift */; };
5D1FF2F1213047AB000EB9B4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5D1FF2EE213047AB000EB9B4 /* Main.storyboard */; };
- 5D1FF2F2213047AB000EB9B4 /* ConnectionIAPTableViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5D1FF2EF213047AB000EB9B4 /* ConnectionIAPTableViewController.storyboard */; };
- 5D1FF2F3213047AB000EB9B4 /* ConnectionTCPTableViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5D1FF2F0213047AB000EB9B4 /* ConnectionTCPTableViewController.storyboard */; };
5D1FF2F5213047B3000EB9B4 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5D1FF2F4213047B2000EB9B4 /* LaunchScreen.xib */; };
5D1FF2F8213047C1000EB9B4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF2F7213047C1000EB9B4 /* AppDelegate.swift */; };
5D4346471E6F0BDA00B639C6 /* SDLLogFileModuleSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D4346461E6F0BDA00B639C6 /* SDLLogFileModuleSpec.m */; };
@@ -1546,8 +1557,7 @@
5DE35E4A20CB1BF70034BE5A /* SDLChoiceSetManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE35E4920CB1BF70034BE5A /* SDLChoiceSetManagerSpec.m */; };
5DE35E4C20CB1C1C0034BE5A /* SDLCheckChoiceVROptionalOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE35E4B20CB1C1C0034BE5A /* SDLCheckChoiceVROptionalOperationSpec.m */; };
5DE35E4E20CB1C2C0034BE5A /* SDLDeleteChoicesOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE35E4D20CB1C2C0034BE5A /* SDLDeleteChoicesOperationSpec.m */; };
- 5DE35E5220CB1C490034BE5A /* SDLPreloadChoicesOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE35E5120CB1C490034BE5A /* SDLPreloadChoicesOperationSpec.m */; };
- 5DE35E5420CB1C590034BE5A /* SDLPresentChoiceSetOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE35E5320CB1C590034BE5A /* SDLPresentChoiceSetOperationSpec.m */; };
+ 5DE35E5220CB1C490034BE5A /* SDLPreloadPresentChoicesOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE35E5120CB1C490034BE5A /* SDLPreloadPresentChoicesOperationSpec.m */; };
5DE35E5620CB1C680034BE5A /* SDLPresentKeyboardOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE35E5520CB1C680034BE5A /* SDLPresentKeyboardOperationSpec.m */; };
5DE372A41ACB336600849FAA /* SDLHMICapabilitiesSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DE372A31ACB336600849FAA /* SDLHMICapabilitiesSpec.m */; };
5DEF695D1FD6FA01004B8C2F /* testAudio.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 5DEF695C1FD6FA01004B8C2F /* testAudio.mp3 */; };
@@ -1736,15 +1746,19 @@
B3DF19F3251225AA0090D7BA /* TestSmartConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = B3DF19F1251225A90090D7BA /* TestSmartConnection.m */; };
B3EC9E6E2579AA010039F3AA /* SDLClimateDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3EC9E6D2579AA010039F3AA /* SDLClimateDataSpec.m */; };
B3F7918324E062C200DB5CAF /* SDLGetVehicleDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E824C1A9BDE8A00906325 /* SDLGetVehicleDataSpec.m */; };
+ C93193DC26B1B57C008203EC /* SDLSecurityQueryPayload.h in Headers */ = {isa = PBXBuildFile; fileRef = C93193DA26B1B57B008203EC /* SDLSecurityQueryPayload.h */; };
+ C93193DD26B1B57C008203EC /* SDLSecurityQueryPayload.m in Sources */ = {isa = PBXBuildFile; fileRef = C93193DB26B1B57B008203EC /* SDLSecurityQueryPayload.m */; };
C9707D1825DEE786009D00F2 /* NSArray+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = C9707D1625DEE786009D00F2 /* NSArray+Extensions.h */; };
C9707D1925DEE786009D00F2 /* NSArray+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = C9707D1725DEE786009D00F2 /* NSArray+Extensions.m */; };
- C9707D3025E0444D009D00F2 /* SDLMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = C9707D2E25E0444D009D00F2 /* SDLMacros.h */; };
C9707D3125E0444D009D00F2 /* SDLMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = C9707D2F25E0444D009D00F2 /* SDLMacros.m */; };
C971E3EE2649BD8700FC24D6 /* SDLOnSystemRequestSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E82371A9BDE8A00906325 /* SDLOnSystemRequestSpec.m */; };
C971E3EF2649C52000FC24D6 /* SDLResponseDispatcherSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DBAE0AC1D368D1A00CE00BF /* SDLResponseDispatcherSpec.m */; };
C971E3F02649D12D00FC24D6 /* NSMutableDictionary+StoreSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = BB3C600D221AEF37007DD4CA /* NSMutableDictionary+StoreSpec.m */; };
C975877F257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = C975877E257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m */; };
C9758785257F4C570066F271 /* SDLSeekStreamingIndicatorSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = C9758784257F4C570066F271 /* SDLSeekStreamingIndicatorSpec.m */; };
+ C99BE00926C53E7F00DB0B54 /* SDLSecurityQueryErrorCode.h in Headers */ = {isa = PBXBuildFile; fileRef = C99BE00726C53E7E00DB0B54 /* SDLSecurityQueryErrorCode.h */; };
+ C99BE00A26C53E7F00DB0B54 /* SDLSecurityQueryErrorCode.m in Sources */ = {isa = PBXBuildFile; fileRef = C99BE00826C53E7E00DB0B54 /* SDLSecurityQueryErrorCode.m */; };
+ C99BE00D26C5B23000DB0B54 /* SDLSecurityQueryPayloadSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = C99BE00C26C5B23000DB0B54 /* SDLSecurityQueryPayloadSpec.m */; };
C9AA62C4261E5035000F49BC /* SDLVoiceCommandManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */; };
C9DFFE78257ACE0000F7D57A /* SDLSeekStreamingIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = C9DFFE76257ACE0000F7D57A /* SDLSeekStreamingIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
C9DFFE79257ACE0000F7D57A /* SDLSeekStreamingIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = C9DFFE77257ACE0000F7D57A /* SDLSeekStreamingIndicator.m */; };
@@ -2377,9 +2391,24 @@
4A8BD3CC24F999BE000945E3 /* TestSubscribeButtonObserver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestSubscribeButtonObserver.m; sourceTree = "<group>"; };
4A8BD3CE24FE7CF1000945E3 /* SDLPermissionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLPermissionManager.h; path = public/SDLPermissionManager.h; sourceTree = "<group>"; };
4A8BD3CF24FE7CF1000945E3 /* SDLPermissionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPermissionManager.m; path = public/SDLPermissionManager.m; sourceTree = "<group>"; };
+ 4A93893B25B8CBD40069F438 /* SDLMenuReplaceOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLMenuReplaceOperation.h; path = private/SDLMenuReplaceOperation.h; sourceTree = "<group>"; };
+ 4A93893C25B8CBD40069F438 /* SDLMenuReplaceOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuReplaceOperation.m; path = private/SDLMenuReplaceOperation.m; sourceTree = "<group>"; };
+ 4A93895125B9DACA0069F438 /* SDLMenuShowOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLMenuShowOperation.h; path = private/SDLMenuShowOperation.h; sourceTree = "<group>"; };
+ 4A93895225B9DACA0069F438 /* SDLMenuShowOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuShowOperation.m; path = private/SDLMenuShowOperation.m; sourceTree = "<group>"; };
+ 4A93895725B9E5E40069F438 /* SDLMenuConfigurationUpdateOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLMenuConfigurationUpdateOperation.h; path = private/SDLMenuConfigurationUpdateOperation.h; sourceTree = "<group>"; };
+ 4A93895825B9E5E40069F438 /* SDLMenuConfigurationUpdateOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuConfigurationUpdateOperation.m; path = private/SDLMenuConfigurationUpdateOperation.m; sourceTree = "<group>"; };
+ 4A93896425BB361C0069F438 /* SDLMenuReplaceUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLMenuReplaceUtilities.h; path = private/SDLMenuReplaceUtilities.h; sourceTree = "<group>"; };
+ 4A93896525BB361C0069F438 /* SDLMenuReplaceUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuReplaceUtilities.m; path = private/SDLMenuReplaceUtilities.m; sourceTree = "<group>"; };
+ 4A96113925D1A0C600D787DA /* SDLMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLMacros.h; path = private/SDLMacros.h; sourceTree = "<group>"; };
+ 4A96114725D1B5DA00D787DA /* SDLMacros.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMacros.m; path = private/SDLMacros.m; sourceTree = "<group>"; };
4AAB6A1025E57BEA0017A5A7 /* SDLSystemInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLSystemInfo.h; path = public/SDLSystemInfo.h; sourceTree = "<group>"; };
4AAB6A1125E57BEA0017A5A7 /* SDLSystemInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLSystemInfo.m; path = public/SDLSystemInfo.m; sourceTree = "<group>"; };
4AAB6A2225E69D010017A5A7 /* SDLSystemInfoSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLSystemInfoSpec.m; path = DevAPISpecs/SDLSystemInfoSpec.m; sourceTree = "<group>"; };
+ 4AAC0DB825C1FEBA00746D33 /* SDLMenuManagerPrivateConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLMenuManagerPrivateConstants.h; path = private/SDLMenuManagerPrivateConstants.h; sourceTree = "<group>"; };
+ 4AAC0DB925C1FEBA00746D33 /* SDLMenuManagerPrivateConstants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuManagerPrivateConstants.m; path = private/SDLMenuManagerPrivateConstants.m; sourceTree = "<group>"; };
+ 4AAC0DDF25C468EC00746D33 /* SDLMenuReplaceUtilitiesSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuReplaceUtilitiesSpec.m; path = DevAPISpecs/SDLMenuReplaceUtilitiesSpec.m; sourceTree = "<group>"; };
+ 4AAC0DE625C493EE00746D33 /* SDLMenuReplaceUtilitiesSpecHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLMenuReplaceUtilitiesSpecHelpers.h; path = DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.h; sourceTree = "<group>"; };
+ 4AAC0DE725C493EE00746D33 /* SDLMenuReplaceUtilitiesSpecHelpers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuReplaceUtilitiesSpecHelpers.m; path = DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.m; sourceTree = "<group>"; };
4ABB24B224F592620061BF55 /* NSMutableArray+Safe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+Safe.h"; path = "private/NSMutableArray+Safe.h"; sourceTree = "<group>"; };
4ABB24B324F592620061BF55 /* NSMutableArray+Safe.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+Safe.m"; path = "private/NSMutableArray+Safe.m"; sourceTree = "<group>"; };
4ABB24B424F592620061BF55 /* NSBundle+SDLBundle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+SDLBundle.m"; path = "private/NSBundle+SDLBundle.m"; sourceTree = "<group>"; };
@@ -2463,13 +2492,11 @@
4ABB256124F7E5AA0061BF55 /* SDLPermissionElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLPermissionElement.h; path = public/SDLPermissionElement.h; sourceTree = "<group>"; };
4ABB256424F7E5B70061BF55 /* SDLRPCPermissionStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLRPCPermissionStatus.m; path = public/SDLRPCPermissionStatus.m; sourceTree = "<group>"; };
4ABB256524F7E5B80061BF55 /* SDLRPCPermissionStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLRPCPermissionStatus.h; path = public/SDLRPCPermissionStatus.h; sourceTree = "<group>"; };
- 4ABB256824F7E5E70061BF55 /* SDLPreloadChoicesOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPreloadChoicesOperation.m; path = private/SDLPreloadChoicesOperation.m; sourceTree = "<group>"; };
- 4ABB256924F7E5E70061BF55 /* SDLPresentChoiceSetOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPresentChoiceSetOperation.m; path = private/SDLPresentChoiceSetOperation.m; sourceTree = "<group>"; };
+ 4ABB256824F7E5E70061BF55 /* SDLPreloadPresentChoicesOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPreloadPresentChoicesOperation.m; path = private/SDLPreloadPresentChoicesOperation.m; sourceTree = "<group>"; };
4ABB256A24F7E5E70061BF55 /* SDLCheckChoiceVROptionalOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLCheckChoiceVROptionalOperation.m; path = private/SDLCheckChoiceVROptionalOperation.m; sourceTree = "<group>"; };
4ABB256B24F7E5E70061BF55 /* SDLCheckChoiceVROptionalOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLCheckChoiceVROptionalOperation.h; path = private/SDLCheckChoiceVROptionalOperation.h; sourceTree = "<group>"; };
- 4ABB256C24F7E5E70061BF55 /* SDLPresentChoiceSetOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLPresentChoiceSetOperation.h; path = private/SDLPresentChoiceSetOperation.h; sourceTree = "<group>"; };
4ABB256D24F7E5E70061BF55 /* SDLDeleteChoicesOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDeleteChoicesOperation.m; path = private/SDLDeleteChoicesOperation.m; sourceTree = "<group>"; };
- 4ABB256E24F7E5E80061BF55 /* SDLPreloadChoicesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLPreloadChoicesOperation.h; path = private/SDLPreloadChoicesOperation.h; sourceTree = "<group>"; };
+ 4ABB256E24F7E5E80061BF55 /* SDLPreloadPresentChoicesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLPreloadPresentChoicesOperation.h; path = private/SDLPreloadPresentChoicesOperation.h; sourceTree = "<group>"; };
4ABB256F24F7E5E80061BF55 /* SDLDeleteChoicesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLDeleteChoicesOperation.h; path = private/SDLDeleteChoicesOperation.h; sourceTree = "<group>"; };
4ABB257824F7E5FF0061BF55 /* SDLPresentKeyboardOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPresentKeyboardOperation.m; path = private/SDLPresentKeyboardOperation.m; sourceTree = "<group>"; };
4ABB257924F7E5FF0061BF55 /* SDLPresentKeyboardOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLPresentKeyboardOperation.h; path = private/SDLPresentKeyboardOperation.h; sourceTree = "<group>"; };
@@ -3255,9 +3282,18 @@
4ABB2B9924F850AD0061BF55 /* SDLImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLImage.h; path = public/SDLImage.h; sourceTree = "<group>"; };
4ABB2B9A24F850AD0061BF55 /* SDLLightState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLightState.m; path = public/SDLLightState.m; sourceTree = "<group>"; };
4ABB2B9B24F850AD0061BF55 /* SDLImageResolution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLImageResolution.h; path = public/SDLImageResolution.h; sourceTree = "<group>"; };
+ 4ABC1CA625DC4E1C00545AC6 /* SDLMenuReplaceOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuReplaceOperationSpec.m; path = DevAPISpecs/SDLMenuReplaceOperationSpec.m; sourceTree = "<group>"; };
+ 4ABC1CAC25DC51A800545AC6 /* SDLMenuConfigurationUpdateOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuConfigurationUpdateOperationSpec.m; path = DevAPISpecs/SDLMenuConfigurationUpdateOperationSpec.m; sourceTree = "<group>"; };
+ 4ABC1CB025DC520300545AC6 /* SDLMenuShowOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuShowOperationSpec.m; path = DevAPISpecs/SDLMenuShowOperationSpec.m; sourceTree = "<group>"; };
4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandUpdateOperation.m; path = private/SDLVoiceCommandUpdateOperation.m; sourceTree = "<group>"; };
4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLVoiceCommandUpdateOperation.h; path = private/SDLVoiceCommandUpdateOperation.h; sourceTree = "<group>"; };
+ 4AC0127E26D9612E00537E31 /* SDLPreloadPresentChoicesOperationUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLPreloadPresentChoicesOperationUtilities.h; path = private/SDLPreloadPresentChoicesOperationUtilities.h; sourceTree = "<group>"; };
+ 4AC0127F26D9612E00537E31 /* SDLPreloadPresentChoicesOperationUtilities.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLPreloadPresentChoicesOperationUtilities.m; path = private/SDLPreloadPresentChoicesOperationUtilities.m; sourceTree = "<group>"; };
+ 4AC0128226D9686F00537E31 /* SDLPreloadPresentChoicesOperationUtilitiesSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLPreloadPresentChoicesOperationUtilitiesSpec.m; path = DevAPISpecs/SDLPreloadPresentChoicesOperationUtilitiesSpec.m; sourceTree = "<group>"; };
4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandUpdateOperationSpec.m; path = DevAPISpecs/SDLVoiceCommandUpdateOperationSpec.m; sourceTree = "<group>"; };
+ 4ADBD1F726FCED4000ABB045 /* ConnectionTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ConnectionTabBarController.swift; path = "Example Apps/Example Swift/ConnectionTabBarController.swift"; sourceTree = SOURCE_ROOT; };
+ 4ADBD1F926FCEDFC00ABB045 /* ConnectionTabBarController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ConnectionTabBarController.h; path = "Example Apps/Example ObjC/ConnectionTabBarController.h"; sourceTree = SOURCE_ROOT; };
+ 4ADBD1FA26FCEDFC00ABB045 /* ConnectionTabBarController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ConnectionTabBarController.m; path = "Example Apps/Example ObjC/ConnectionTabBarController.m"; sourceTree = SOURCE_ROOT; };
4AE8A7012537796E000666C0 /* SmartDeviceLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SmartDeviceLink.h; path = public/SmartDeviceLink.h; sourceTree = "<group>"; };
4AE8A707253779F9000666C0 /* EAAccessory+OCMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "EAAccessory+OCMock.h"; sourceTree = "<group>"; };
5D0A9F901F15550400CC80DD /* SDLSystemCapabilityTypeSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSystemCapabilityTypeSpec.m; sourceTree = "<group>"; };
@@ -3292,19 +3328,11 @@
5D1FF2A421304531000EB9B4 /* Preferences.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Preferences.m; path = "Example Apps/Example ObjC/Preferences.m"; sourceTree = SOURCE_ROOT; };
5D1FF2A521304531000EB9B4 /* TextValidator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TextValidator.h; path = "Example Apps/Example ObjC/TextValidator.h"; sourceTree = SOURCE_ROOT; };
5D1FF2A621304531000EB9B4 /* TextValidator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TextValidator.m; path = "Example Apps/Example ObjC/TextValidator.m"; sourceTree = SOURCE_ROOT; };
- 5D1FF2AA21304567000EB9B4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = "Example Apps/Example ObjC/Base.lproj/ConnectionTCPTableViewController.storyboard"; sourceTree = SOURCE_ROOT; };
5D1FF2AC21304567000EB9B4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = "Example Apps/Example ObjC/Base.lproj/Main.storyboard"; sourceTree = SOURCE_ROOT; };
- 5D1FF2AE21304567000EB9B4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = "Example Apps/Example ObjC/Base.lproj/ConnectionIAPTableViewController.storyboard"; sourceTree = SOURCE_ROOT; };
- 5D1FF2B221304580000EB9B4 /* ConnectionContainerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConnectionContainerViewController.h; path = "Example Apps/Example ObjC/ConnectionContainerViewController.h"; sourceTree = SOURCE_ROOT; };
5D1FF2B321304580000EB9B4 /* ConnectionTCPTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConnectionTCPTableViewController.h; path = "Example Apps/Example ObjC/ConnectionTCPTableViewController.h"; sourceTree = SOURCE_ROOT; };
5D1FF2B421304580000EB9B4 /* ConnectionIAPTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ConnectionIAPTableViewController.m; path = "Example Apps/Example ObjC/ConnectionIAPTableViewController.m"; sourceTree = SOURCE_ROOT; };
- 5D1FF2B521304581000EB9B4 /* ConnectionContainerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ConnectionContainerViewController.m; path = "Example Apps/Example ObjC/ConnectionContainerViewController.m"; sourceTree = SOURCE_ROOT; };
5D1FF2B621304581000EB9B4 /* ConnectionTCPTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ConnectionTCPTableViewController.m; path = "Example Apps/Example ObjC/ConnectionTCPTableViewController.m"; sourceTree = SOURCE_ROOT; };
5D1FF2B721304581000EB9B4 /* ConnectionIAPTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConnectionIAPTableViewController.h; path = "Example Apps/Example ObjC/ConnectionIAPTableViewController.h"; sourceTree = SOURCE_ROOT; };
- 5D1FF2BB21304598000EB9B4 /* ConnectionAnimatedTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConnectionAnimatedTransition.h; path = "Example Apps/Example ObjC/ConnectionAnimatedTransition.h"; sourceTree = SOURCE_ROOT; };
- 5D1FF2BC21304598000EB9B4 /* ConnectionAnimatedTransition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ConnectionAnimatedTransition.m; path = "Example Apps/Example ObjC/ConnectionAnimatedTransition.m"; sourceTree = SOURCE_ROOT; };
- 5D1FF2BD21304598000EB9B4 /* ConnectionTransitionContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConnectionTransitionContext.h; path = "Example Apps/Example ObjC/ConnectionTransitionContext.h"; sourceTree = SOURCE_ROOT; };
- 5D1FF2BE21304598000EB9B4 /* ConnectionTransitionContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ConnectionTransitionContext.m; path = "Example Apps/Example ObjC/ConnectionTransitionContext.m"; sourceTree = SOURCE_ROOT; };
5D1FF2C1213045EB000EB9B4 /* AppConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppConstants.h; path = "Example Apps/Shared/AppConstants.h"; sourceTree = SOURCE_ROOT; };
5D1FF2C2213045EB000EB9B4 /* AppConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppConstants.m; path = "Example Apps/Shared/AppConstants.m"; sourceTree = SOURCE_ROOT; };
5D1FF2C5213045F1000EB9B4 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = "Example Apps/Shared/Images.xcassets"; sourceTree = SOURCE_ROOT; };
@@ -3324,12 +3352,9 @@
5D1FF2E221304761000EB9B4 /* AppUserDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppUserDefaults.swift; path = "Example Apps/Example Swift/AppUserDefaults.swift"; sourceTree = SOURCE_ROOT; };
5D1FF2E321304761000EB9B4 /* ProxyManagerDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ProxyManagerDelegate.swift; path = "Example Apps/Example Swift/ProxyManagerDelegate.swift"; sourceTree = SOURCE_ROOT; };
5D1FF2E421304761000EB9B4 /* TextValidator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TextValidator.swift; path = "Example Apps/Example Swift/TextValidator.swift"; sourceTree = SOURCE_ROOT; };
- 5D1FF2E82130479C000EB9B4 /* ConnectionContainerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConnectionContainerViewController.swift; path = "Example Apps/Example Swift/ConnectionContainerViewController.swift"; sourceTree = SOURCE_ROOT; };
5D1FF2E92130479C000EB9B4 /* ConnectionTCPTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConnectionTCPTableViewController.swift; path = "Example Apps/Example Swift/ConnectionTCPTableViewController.swift"; sourceTree = SOURCE_ROOT; };
5D1FF2EA2130479C000EB9B4 /* ConnectionIAPTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ConnectionIAPTableViewController.swift; path = "Example Apps/Example Swift/ConnectionIAPTableViewController.swift"; sourceTree = SOURCE_ROOT; };
5D1FF2EE213047AB000EB9B4 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = "Example Apps/Example Swift/Main.storyboard"; sourceTree = SOURCE_ROOT; };
- 5D1FF2EF213047AB000EB9B4 /* ConnectionIAPTableViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = ConnectionIAPTableViewController.storyboard; path = "Example Apps/Example Swift/ConnectionIAPTableViewController.storyboard"; sourceTree = SOURCE_ROOT; };
- 5D1FF2F0213047AB000EB9B4 /* ConnectionTCPTableViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = ConnectionTCPTableViewController.storyboard; path = "Example Apps/Example Swift/ConnectionTCPTableViewController.storyboard"; sourceTree = SOURCE_ROOT; };
5D1FF2F4213047B2000EB9B4 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LaunchScreen.xib; path = "Example Apps/Example Swift/LaunchScreen.xib"; sourceTree = SOURCE_ROOT; };
5D1FF2F6213047C1000EB9B4 /* SmartDeviceLink-Example-Swift-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SmartDeviceLink-Example-Swift-Bridging-Header.h"; path = "Example Apps/Example Swift/SmartDeviceLink-Example-Swift-Bridging-Header.h"; sourceTree = SOURCE_ROOT; };
5D1FF2F7213047C1000EB9B4 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = "Example Apps/Example Swift/AppDelegate.swift"; sourceTree = SOURCE_ROOT; };
@@ -3456,8 +3481,7 @@
5DE35E4920CB1BF70034BE5A /* SDLChoiceSetManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLChoiceSetManagerSpec.m; path = DevAPISpecs/SDLChoiceSetManagerSpec.m; sourceTree = "<group>"; };
5DE35E4B20CB1C1C0034BE5A /* SDLCheckChoiceVROptionalOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLCheckChoiceVROptionalOperationSpec.m; path = DevAPISpecs/SDLCheckChoiceVROptionalOperationSpec.m; sourceTree = "<group>"; };
5DE35E4D20CB1C2C0034BE5A /* SDLDeleteChoicesOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLDeleteChoicesOperationSpec.m; path = DevAPISpecs/SDLDeleteChoicesOperationSpec.m; sourceTree = "<group>"; };
- 5DE35E5120CB1C490034BE5A /* SDLPreloadChoicesOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLPreloadChoicesOperationSpec.m; path = DevAPISpecs/SDLPreloadChoicesOperationSpec.m; sourceTree = "<group>"; };
- 5DE35E5320CB1C590034BE5A /* SDLPresentChoiceSetOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLPresentChoiceSetOperationSpec.m; path = DevAPISpecs/SDLPresentChoiceSetOperationSpec.m; sourceTree = "<group>"; };
+ 5DE35E5120CB1C490034BE5A /* SDLPreloadPresentChoicesOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLPreloadPresentChoicesOperationSpec.m; path = DevAPISpecs/SDLPreloadPresentChoicesOperationSpec.m; sourceTree = "<group>"; };
5DE35E5520CB1C680034BE5A /* SDLPresentKeyboardOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLPresentKeyboardOperationSpec.m; path = DevAPISpecs/SDLPresentKeyboardOperationSpec.m; sourceTree = "<group>"; };
5DE372A31ACB336600849FAA /* SDLHMICapabilitiesSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLHMICapabilitiesSpec.m; sourceTree = "<group>"; };
5DEE55BF1B8509CB004F0D0F /* SDLURLRequestTaskSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLURLRequestTaskSpec.m; path = "UtilitiesSpecs/HTTP Connection/SDLURLRequestTaskSpec.m"; sourceTree = "<group>"; };
@@ -3649,12 +3673,17 @@
B3DF19F2251225A90090D7BA /* TestSmartConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSmartConnection.h; sourceTree = "<group>"; };
B3EC9E6D2579AA010039F3AA /* SDLClimateDataSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLClimateDataSpec.m; sourceTree = "<group>"; };
BB3C600D221AEF37007DD4CA /* NSMutableDictionary+StoreSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "NSMutableDictionary+StoreSpec.m"; path = "DevAPISpecs/NSMutableDictionary+StoreSpec.m"; sourceTree = "<group>"; };
+ C93193DA26B1B57B008203EC /* SDLSecurityQueryPayload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLSecurityQueryPayload.h; path = private/SDLSecurityQueryPayload.h; sourceTree = "<group>"; };
+ C93193DB26B1B57B008203EC /* SDLSecurityQueryPayload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLSecurityQueryPayload.m; path = private/SDLSecurityQueryPayload.m; sourceTree = "<group>"; };
C9707D1625DEE786009D00F2 /* NSArray+Extensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "NSArray+Extensions.h"; path = "private/NSArray+Extensions.h"; sourceTree = "<group>"; };
C9707D1725DEE786009D00F2 /* NSArray+Extensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "NSArray+Extensions.m"; path = "private/NSArray+Extensions.m"; sourceTree = "<group>"; };
C9707D2E25E0444D009D00F2 /* SDLMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLMacros.h; path = private/SDLMacros.h; sourceTree = "<group>"; };
C9707D2F25E0444D009D00F2 /* SDLMacros.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMacros.m; path = private/SDLMacros.m; sourceTree = "<group>"; };
C975877E257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeekIndicatorTypeSpec.m; sourceTree = "<group>"; };
C9758784257F4C570066F271 /* SDLSeekStreamingIndicatorSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeekStreamingIndicatorSpec.m; sourceTree = "<group>"; };
+ C99BE00726C53E7E00DB0B54 /* SDLSecurityQueryErrorCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLSecurityQueryErrorCode.h; path = private/SDLSecurityQueryErrorCode.h; sourceTree = "<group>"; };
+ C99BE00826C53E7E00DB0B54 /* SDLSecurityQueryErrorCode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLSecurityQueryErrorCode.m; path = private/SDLSecurityQueryErrorCode.m; sourceTree = "<group>"; };
+ C99BE00C26C5B23000DB0B54 /* SDLSecurityQueryPayloadSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSecurityQueryPayloadSpec.m; sourceTree = "<group>"; };
C9DFFE76257ACE0000F7D57A /* SDLSeekStreamingIndicator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLSeekStreamingIndicator.h; path = public/SDLSeekStreamingIndicator.h; sourceTree = "<group>"; };
C9DFFE77257ACE0000F7D57A /* SDLSeekStreamingIndicator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLSeekStreamingIndicator.m; path = public/SDLSeekStreamingIndicator.m; sourceTree = "<group>"; };
C9DFFE7C257AD07E00F7D57A /* SDLSeekIndicatorType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SDLSeekIndicatorType.h; path = public/SDLSeekIndicatorType.h; sourceTree = "<group>"; };
@@ -3972,6 +4001,7 @@
isa = PBXGroup;
children = (
162E823C1A9BDE8A00906325 /* SDLRPCPayloadSpec.m */,
+ C99BE00C26C5B23000DB0B54 /* SDLSecurityQueryPayloadSpec.m */,
);
path = PayloadSpecs;
sourceTree = "<group>";
@@ -4300,7 +4330,7 @@
path = MessageSpecs;
sourceTree = "<group>";
};
- 4A32B3E425559D93001FFA26 /* Voice Cammands */ = {
+ 4A32B3E425559D93001FFA26 /* Voice Commands */ = {
isa = PBXGroup;
children = (
4A32B3E525559DA4001FFA26 /* Cells */,
@@ -4308,7 +4338,7 @@
4ABB25A824F7E6E10061BF55 /* SDLVoiceCommandManager.h */,
4ABB25A724F7E6E10061BF55 /* SDLVoiceCommandManager.m */,
);
- name = "Voice Cammands";
+ name = "Voice Commands";
sourceTree = "<group>";
};
4A32B3E525559DA4001FFA26 /* Cells */ = {
@@ -4329,18 +4359,6 @@
name = Operations;
sourceTree = "<group>";
};
- 4A32B3F325559F37001FFA26 /* Menu */ = {
- isa = PBXGroup;
- children = (
- 5D76751022D907F500E8D71A /* Configuration */,
- 755F175E229F14F70041B9CB /* Dynamic Menu Update Utilities */,
- 5D339CEC207C08AB000CC364 /* Cells */,
- 4ABB25A924F7E6E10061BF55 /* SDLMenuManager.h */,
- 4ABB25A624F7E6E10061BF55 /* SDLMenuManager.m */,
- );
- name = Menu;
- sourceTree = "<group>";
- };
4A3BA4D9248E8EBB003E56B8 /* SystemRequest Handler */ = {
isa = PBXGroup;
children = (
@@ -4415,6 +4433,33 @@
path = Utilities;
sourceTree = "<group>";
};
+ 4A93893A25B8CB480069F438 /* Operations */ = {
+ isa = PBXGroup;
+ children = (
+ 4A93896325BB35FA0069F438 /* Menu Replace Utilities */,
+ 4A93895725B9E5E40069F438 /* SDLMenuConfigurationUpdateOperation.h */,
+ 4A93895825B9E5E40069F438 /* SDLMenuConfigurationUpdateOperation.m */,
+ 4A93893B25B8CBD40069F438 /* SDLMenuReplaceOperation.h */,
+ 4A93893C25B8CBD40069F438 /* SDLMenuReplaceOperation.m */,
+ 4A93895125B9DACA0069F438 /* SDLMenuShowOperation.h */,
+ 4A93895225B9DACA0069F438 /* SDLMenuShowOperation.m */,
+ );
+ name = Operations;
+ sourceTree = "<group>";
+ };
+ 4A93896325BB35FA0069F438 /* Menu Replace Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 4ABB25A124F7E6CE0061BF55 /* SDLDynamicMenuUpdateAlgorithm.h */,
+ 4ABB259F24F7E6CE0061BF55 /* SDLDynamicMenuUpdateAlgorithm.m */,
+ 4ABB259E24F7E6CE0061BF55 /* SDLDynamicMenuUpdateRunScore.h */,
+ 4ABB25A024F7E6CE0061BF55 /* SDLDynamicMenuUpdateRunScore.m */,
+ 4A93896425BB361C0069F438 /* SDLMenuReplaceUtilities.h */,
+ 4A93896525BB361C0069F438 /* SDLMenuReplaceUtilities.m */,
+ );
+ name = "Menu Replace Utilities";
+ sourceTree = "<group>";
+ };
4A9D02BB2497EEB400FBE99B /* Custom RPC Adapters */ = {
isa = PBXGroup;
children = (
@@ -4443,6 +4488,44 @@
name = Utilities;
sourceTree = "<group>";
};
+ 4AAC0DB725C1FE9700746D33 /* Constants */ = {
+ isa = PBXGroup;
+ children = (
+ 4ABB259824F7E6A60061BF55 /* SDLMenuManagerConstants.h */,
+ 4AAC0DB825C1FEBA00746D33 /* SDLMenuManagerPrivateConstants.h */,
+ 4AAC0DB925C1FEBA00746D33 /* SDLMenuManagerPrivateConstants.m */,
+ );
+ name = Constants;
+ sourceTree = "<group>";
+ };
+ 4AAC0DE525C493D800746D33 /* Helpers */ = {
+ isa = PBXGroup;
+ children = (
+ 4AAC0DE625C493EE00746D33 /* SDLMenuReplaceUtilitiesSpecHelpers.h */,
+ 4AAC0DE725C493EE00746D33 /* SDLMenuReplaceUtilitiesSpecHelpers.m */,
+ );
+ name = Helpers;
+ sourceTree = "<group>";
+ };
+ 4ABC1CA525DC4DC200545AC6 /* Operations */ = {
+ isa = PBXGroup;
+ children = (
+ 4ABC1CAC25DC51A800545AC6 /* SDLMenuConfigurationUpdateOperationSpec.m */,
+ 4ABC1CA625DC4E1C00545AC6 /* SDLMenuReplaceOperationSpec.m */,
+ 4ABC1CB025DC520300545AC6 /* SDLMenuShowOperationSpec.m */,
+ );
+ name = Operations;
+ sourceTree = "<group>";
+ };
+ 4AC0127B26D960E900537E31 /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 4AC0127E26D9612E00537E31 /* SDLPreloadPresentChoicesOperationUtilities.h */,
+ 4AC0127F26D9612E00537E31 /* SDLPreloadPresentChoicesOperationUtilities.m */,
+ );
+ name = Utilities;
+ sourceTree = "<group>";
+ };
4AD1F16A2559952D00637FE1 /* Voice Command */ = {
isa = PBXGroup;
children = (
@@ -4465,14 +4548,13 @@
5D0218EC1A8E796100D1BF62 /* Connection */ = {
isa = PBXGroup;
children = (
- 5D4832991A8EA27200252386 /* Storyboards */,
- 5D4832A21A94F8F100252386 /* Transition */,
- 5D1FF2B221304580000EB9B4 /* ConnectionContainerViewController.h */,
- 5D1FF2B521304581000EB9B4 /* ConnectionContainerViewController.m */,
+ 5D1FF2AB21304567000EB9B4 /* Main.storyboard */,
5D1FF2B721304581000EB9B4 /* ConnectionIAPTableViewController.h */,
5D1FF2B421304580000EB9B4 /* ConnectionIAPTableViewController.m */,
5D1FF2B321304580000EB9B4 /* ConnectionTCPTableViewController.h */,
5D1FF2B621304581000EB9B4 /* ConnectionTCPTableViewController.m */,
+ 4ADBD1F926FCEDFC00ABB045 /* ConnectionTabBarController.h */,
+ 4ADBD1FA26FCEDFC00ABB045 /* ConnectionTabBarController.m */,
);
name = Connection;
sourceTree = "<group>";
@@ -4499,6 +4581,7 @@
5D0A737F203F23D10001595D /* Soft Button */,
88A098AB2476F08F00A50005 /* Subscribe Button */,
5D0A737D203F23B30001595D /* Text and Graphic */,
+ 4A32B3E425559D93001FFA26 /* Voice Commands */,
5D1BF6AA2047429C00D36881 /* Utilities */,
4ABB25DA24F7E77C0061BF55 /* SDLScreenManager.h */,
4ABB25DB24F7E77C0061BF55 /* SDLScreenManager.m */,
@@ -4630,8 +4713,12 @@
5D339CE5207C0651000CC364 /* Menu */ = {
isa = PBXGroup;
children = (
- 4A32B3F325559F37001FFA26 /* Menu */,
- 4A32B3E425559D93001FFA26 /* Voice Cammands */,
+ 4AAC0DB725C1FE9700746D33 /* Constants */,
+ 5D339CEC207C08AB000CC364 /* Cells */,
+ 5D76751022D907F500E8D71A /* Configuration */,
+ 4A93893A25B8CB480069F438 /* Operations */,
+ 4ABB25A924F7E6E10061BF55 /* SDLMenuManager.h */,
+ 4ABB25A624F7E6E10061BF55 /* SDLMenuManager.m */,
);
name = Menu;
sourceTree = "<group>";
@@ -4789,16 +4876,6 @@
name = General;
sourceTree = "<group>";
};
- 5D4832991A8EA27200252386 /* Storyboards */ = {
- isa = PBXGroup;
- children = (
- 5D1FF2AD21304567000EB9B4 /* ConnectionIAPTableViewController.storyboard */,
- 5D1FF2A921304567000EB9B4 /* ConnectionTCPTableViewController.storyboard */,
- 5D1FF2AB21304567000EB9B4 /* Main.storyboard */,
- );
- name = Storyboards;
- sourceTree = "<group>";
- };
5D48329A1A8EA31500252386 /* Utilities */ = {
isa = PBXGroup;
children = (
@@ -4835,17 +4912,6 @@
name = SDL;
sourceTree = "<group>";
};
- 5D4832A21A94F8F100252386 /* Transition */ = {
- isa = PBXGroup;
- children = (
- 5D1FF2BB21304598000EB9B4 /* ConnectionAnimatedTransition.h */,
- 5D1FF2BC21304598000EB9B4 /* ConnectionAnimatedTransition.m */,
- 5D1FF2BD21304598000EB9B4 /* ConnectionTransitionContext.h */,
- 5D1FF2BE21304598000EB9B4 /* ConnectionTransitionContext.m */,
- );
- name = Transition;
- sourceTree = "<group>";
- };
5D5934EE1A85160900687FB9 /* Protocol */ = {
isa = PBXGroup;
children = (
@@ -5799,6 +5865,7 @@
5D5935011A851D7E00687FB9 /* Header */ = {
isa = PBXGroup;
children = (
+ C904F1DD26D919EF00E073DA /* SecurityQuery */,
4A8BD32824F9431B000945E3 /* SDLProtocolHeader.h */,
4A8BD32924F9431B000945E3 /* SDLProtocolHeader.m */,
4A8BD32724F9431B000945E3 /* SDLV1ProtocolHeader.h */,
@@ -5987,7 +6054,6 @@
children = (
4ABB259B24F7E6B90061BF55 /* SDLMenuConfiguration.h */,
4ABB259A24F7E6B90061BF55 /* SDLMenuConfiguration.m */,
- 4ABB259824F7E6A60061BF55 /* SDLMenuManagerConstants.h */,
);
name = Configuration;
sourceTree = "<group>";
@@ -6118,14 +6184,13 @@
5D92936D20B5E07000FCC775 /* Operations */ = {
isa = PBXGroup;
children = (
+ 4AC0127B26D960E900537E31 /* Utilities */,
4ABB256B24F7E5E70061BF55 /* SDLCheckChoiceVROptionalOperation.h */,
4ABB256A24F7E5E70061BF55 /* SDLCheckChoiceVROptionalOperation.m */,
4ABB256F24F7E5E80061BF55 /* SDLDeleteChoicesOperation.h */,
4ABB256D24F7E5E70061BF55 /* SDLDeleteChoicesOperation.m */,
- 4ABB256E24F7E5E80061BF55 /* SDLPreloadChoicesOperation.h */,
- 4ABB256C24F7E5E70061BF55 /* SDLPresentChoiceSetOperation.h */,
- 4ABB256824F7E5E70061BF55 /* SDLPreloadChoicesOperation.m */,
- 4ABB256924F7E5E70061BF55 /* SDLPresentChoiceSetOperation.m */,
+ 4ABB256E24F7E5E80061BF55 /* SDLPreloadPresentChoicesOperation.h */,
+ 4ABB256824F7E5E70061BF55 /* SDLPreloadPresentChoicesOperation.m */,
4ABB257924F7E5FF0061BF55 /* SDLPresentKeyboardOperation.h */,
4ABB257824F7E5FF0061BF55 /* SDLPresentKeyboardOperation.m */,
);
@@ -6244,6 +6309,8 @@
5DA3F35C1BC4484B0026F2D0 /* Notifications */,
5D6008871BE3ED470094A505 /* State Machine */,
4ABB24D824F594190061BF55 /* SDLConnectionManagerType.h */,
+ 4A96113925D1A0C600D787DA /* SDLMacros.h */,
+ 4A96114725D1B5DA00D787DA /* SDLMacros.m */,
4ABB24C824F593090061BF55 /* SDLStreamingProtocolDelegate.h */,
4ABB24D524F593ED0061BF55 /* SDLVersion.h */,
4ABB24D424F593EC0061BF55 /* SDLVersion.m */,
@@ -6681,9 +6748,9 @@
children = (
5DE35E4B20CB1C1C0034BE5A /* SDLCheckChoiceVROptionalOperationSpec.m */,
5DE35E4D20CB1C2C0034BE5A /* SDLDeleteChoicesOperationSpec.m */,
- 5DE35E5120CB1C490034BE5A /* SDLPreloadChoicesOperationSpec.m */,
- 5DE35E5320CB1C590034BE5A /* SDLPresentChoiceSetOperationSpec.m */,
5DE35E5520CB1C680034BE5A /* SDLPresentKeyboardOperationSpec.m */,
+ 5DE35E5120CB1C490034BE5A /* SDLPreloadPresentChoicesOperationSpec.m */,
+ 4AC0128226D9686F00537E31 /* SDLPreloadPresentChoicesOperationUtilitiesSpec.m */,
);
name = Operations;
sourceTree = "<group>";
@@ -6731,26 +6798,18 @@
5DF40B24208FA7C500DD6FDA /* Menu */ = {
isa = PBXGroup;
children = (
- 5DF40B25208FA7DE00DD6FDA /* SDLMenuManagerSpec.m */,
+ 4ABC1CA525DC4DC200545AC6 /* Operations */,
+ 4AAC0DE525C493D800746D33 /* Helpers */,
5DAB5F502098994C00A020C8 /* SDLMenuCellSpec.m */,
+ 5D76751522D920FD00E8D71A /* SDLMenuConfigurationSpec.m */,
+ 5DF40B25208FA7DE00DD6FDA /* SDLMenuManagerSpec.m */,
+ 4AAC0DDF25C468EC00746D33 /* SDLMenuReplaceUtilitiesSpec.m */,
752ECDB8228C42E100D945F4 /* SDLMenuRunScoreSpec.m */,
752ECDBA228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m */,
- 5D76751522D920FD00E8D71A /* SDLMenuConfigurationSpec.m */,
);
name = Menu;
sourceTree = "<group>";
};
- 755F175E229F14F70041B9CB /* Dynamic Menu Update Utilities */ = {
- isa = PBXGroup;
- children = (
- 4ABB25A124F7E6CE0061BF55 /* SDLDynamicMenuUpdateAlgorithm.h */,
- 4ABB259F24F7E6CE0061BF55 /* SDLDynamicMenuUpdateAlgorithm.m */,
- 4ABB259E24F7E6CE0061BF55 /* SDLDynamicMenuUpdateRunScore.h */,
- 4ABB25A024F7E6CE0061BF55 /* SDLDynamicMenuUpdateRunScore.m */,
- );
- name = "Dynamic Menu Update Utilities";
- sourceTree = "<group>";
- };
880245A120F79BDA00ED195B /* Configuration */ = {
isa = PBXGroup;
children = (
@@ -6833,9 +6892,6 @@
children = (
5D1FF2F4213047B2000EB9B4 /* LaunchScreen.xib */,
88A0AA5F207CFEA60075132C /* Connection */,
- 5D1FF2E82130479C000EB9B4 /* ConnectionContainerViewController.swift */,
- 5D1FF2EA2130479C000EB9B4 /* ConnectionIAPTableViewController.swift */,
- 5D1FF2E92130479C000EB9B4 /* ConnectionTCPTableViewController.swift */,
);
name = UI;
sourceTree = "<group>";
@@ -6936,19 +6992,12 @@
88A0AA5F207CFEA60075132C /* Connection */ = {
isa = PBXGroup;
children = (
- 88A0AA60207CFEAC0075132C /* Storyboards */,
- );
- name = Connection;
- sourceTree = "<group>";
- };
- 88A0AA60207CFEAC0075132C /* Storyboards */ = {
- isa = PBXGroup;
- children = (
- 5D1FF2EF213047AB000EB9B4 /* ConnectionIAPTableViewController.storyboard */,
- 5D1FF2F0213047AB000EB9B4 /* ConnectionTCPTableViewController.storyboard */,
5D1FF2EE213047AB000EB9B4 /* Main.storyboard */,
+ 5D1FF2EA2130479C000EB9B4 /* ConnectionIAPTableViewController.swift */,
+ 5D1FF2E92130479C000EB9B4 /* ConnectionTCPTableViewController.swift */,
+ 4ADBD1F726FCED4000ABB045 /* ConnectionTabBarController.swift */,
);
- name = Storyboards;
+ name = Connection;
sourceTree = "<group>";
};
88A70C392233087500574CA4 /* Requests */ = {
@@ -7050,6 +7099,17 @@
name = Frameworks;
sourceTree = "<group>";
};
+ C904F1DD26D919EF00E073DA /* SecurityQuery */ = {
+ isa = PBXGroup;
+ children = (
+ C93193DA26B1B57B008203EC /* SDLSecurityQueryPayload.h */,
+ C93193DB26B1B57B008203EC /* SDLSecurityQueryPayload.m */,
+ C99BE00726C53E7E00DB0B54 /* SDLSecurityQueryErrorCode.h */,
+ C99BE00826C53E7E00DB0B54 /* SDLSecurityQueryErrorCode.m */,
+ );
+ name = SecurityQuery;
+ sourceTree = "<group>";
+ };
DA1166D71D14601C00438CEA /* Touches */ = {
isa = PBXGroup;
children = (
@@ -7265,6 +7325,7 @@
4ABB28D524F82A6A0061BF55 /* SDLOnButtonEvent.h in Headers */,
4ABB2B7024F84FE50061BF55 /* SDLFuelRange.h in Headers */,
4ABB25D624F7E7630061BF55 /* SDLImageField+ScreenManagerExtensions.h in Headers */,
+ C99BE00926C53E7F00DB0B54 /* SDLSecurityQueryErrorCode.h in Headers */,
4ABB299324F845440061BF55 /* SDLSetAppIcon.h in Headers */,
4ABB2A3B24F847980061BF55 /* SDLDeleteInteractionChoiceSetResponse.h in Headers */,
4ABB275324F7FD9C0061BF55 /* SDLECallConfirmationStatus.h in Headers */,
@@ -7277,11 +7338,13 @@
88D79EED255D8D5B005FACB1 /* SDLPresentAlertOperation.h in Headers */,
4ABB27E424F800CA0061BF55 /* SDLPrerecordedSpeech.h in Headers */,
4ABB2A2E24F847980061BF55 /* SDLDeleteCommandResponse.h in Headers */,
+ 4A93895325B9DACA0069F438 /* SDLMenuShowOperation.h in Headers */,
4ABB277524F7FE910061BF55 /* SDLIgnitionStatus.h in Headers */,
4A8BD27924F9343F000945E3 /* SDLPermissionItem.h in Headers */,
4ABB2B5024F84EF50061BF55 /* SDLClusterModeStatus.h in Headers */,
4ABB26CA24F7FAAF0061BF55 /* SDLEnum.h in Headers */,
4ABB251E24F7E3EC0061BF55 /* SDLLifecycleMobileHMIStateHandler.h in Headers */,
+ 4A96113B25D1A0C600D787DA /* SDLMacros.h in Headers */,
4ABB260724F7E9650061BF55 /* SDLStreamingMediaManagerDataSource.h in Headers */,
4ABB265224F7F58D0061BF55 /* SDLRPCRequestNotification.h in Headers */,
4ABB2A6424F847BB0061BF55 /* SDLListFilesResponse.h in Headers */,
@@ -7322,10 +7385,12 @@
4ABB28ED24F82A6A0061BF55 /* SDLOnKeyboardInput.h in Headers */,
B360F9DE255F52A50027CA17 /* SDLSeatStatus.h in Headers */,
5D9FDA991F2A7D3F00A495C8 /* emhashmap.h in Headers */,
+ 4A93893D25B8CBD40069F438 /* SDLMenuReplaceOperation.h in Headers */,
4ABB255F24F7E59E0061BF55 /* SDLPermissionConstants.h in Headers */,
4ABB270324F7FB8F0061BF55 /* SDLButtonName.h in Headers */,
881BBF50255AC27000761B7E /* SDLAlertView.h in Headers */,
4ABB25B324F7E6F60061BF55 /* SDLSoftButtonTransitionOperation.h in Headers */,
+ 4AC0128026D9612E00537E31 /* SDLPreloadPresentChoicesOperationUtilities.h in Headers */,
4ABB24C624F592900061BF55 /* SDLError.h in Headers */,
5D9FDA901F2A7D3400A495C8 /* bson_array.h in Headers */,
4ABB2B8924F8504A0061BF55 /* SDLGrid.h in Headers */,
@@ -7384,10 +7449,10 @@
4ABB258124F7E61E0061BF55 /* SDLChoiceCell.h in Headers */,
4ABB270124F7FB8F0061BF55 /* SDLBitsPerSample.h in Headers */,
4ABB253224F7E43A0061BF55 /* SDLAsynchronousRPCOperation.h in Headers */,
+ 4A93895925B9E5E40069F438 /* SDLMenuConfigurationUpdateOperation.h in Headers */,
4ABB25CC24F7E74F0061BF55 /* SDLTextAndGraphicManager.h in Headers */,
4A8BD3B824F98F64000945E3 /* SDLOnUpdateSubMenu.h in Headers */,
4ABB291324F842160061BF55 /* SDLCreateInteractionChoiceSet.h in Headers */,
- 4ABB257424F7E5E80061BF55 /* SDLPresentChoiceSetOperation.h in Headers */,
4ABB2A3024F847980061BF55 /* SDLDiagnosticMessageResponse.h in Headers */,
4ABB2A7224F847D40061BF55 /* SDLPutFileResponse.h in Headers */,
4ABB24E224F5948D0061BF55 /* SDLEncryptionConfiguration.h in Headers */,
@@ -7419,6 +7484,7 @@
4ABB2AF424F849CF0061BF55 /* SDLGenericResponse.h in Headers */,
4ABB280A24F824600061BF55 /* SDLServiceUpdateReason.h in Headers */,
4ABB2B5124F84EF50061BF55 /* SDLDisplayCapability.h in Headers */,
+ 4A93896625BB361C0069F438 /* SDLMenuReplaceUtilities.h in Headers */,
4ABB2ABD24F847FC0061BF55 /* SDLSliderResponse.h in Headers */,
4ABB28D924F82A6A0061BF55 /* SDLOnSyncPData.h in Headers */,
4A8BD2B924F935BC000945E3 /* SDLSoftButton.h in Headers */,
@@ -7541,7 +7607,6 @@
4ABB25E024F7E7980061BF55 /* SDLStreamingMediaConfiguration.h in Headers */,
4A8BD2FE24F938A4000945E3 /* SDLVehicleType.h in Headers */,
4ABB282B24F824E70061BF55 /* SDLTBTState.h in Headers */,
- C9707D3025E0444D009D00F2 /* SDLMacros.h in Headers */,
4ABB26D724F7FAFD0061BF55 /* SDLRPCMessage.h in Headers */,
4A8BD24A24F93135000945E3 /* SDLMyKey.h in Headers */,
4ABB24F924F5959E0061BF55 /* SDLAsynchronousOperation.h in Headers */,
@@ -7571,7 +7636,7 @@
B3A9DB2825D4C3B000CDFD21 /* SDLOnAppCapabilityUpdated.h in Headers */,
4ABB275424F7FD9C0061BF55 /* SDLElectronicParkBrakeStatus.h in Headers */,
4ABB2B5524F84EF50061BF55 /* SDLDriverDistractionCapability.h in Headers */,
- 4ABB257624F7E5E80061BF55 /* SDLPreloadChoicesOperation.h in Headers */,
+ 4ABB257624F7E5E80061BF55 /* SDLPreloadPresentChoicesOperation.h in Headers */,
4ABB28E724F82A6A0061BF55 /* SDLOnAudioPassThru.h in Headers */,
4ABB25AD24F7E6E10061BF55 /* SDLMenuManager.h in Headers */,
88EE1A452502DB3100FFEBA9 /* SDLLockScreenConstants.h in Headers */,
@@ -7671,6 +7736,7 @@
4ABB2B5424F84EF50061BF55 /* SDLClimateControlData.h in Headers */,
4A8BD2B624F935BC000945E3 /* SDLSystemCapability.h in Headers */,
4ABB2AA624F847F40061BF55 /* SDLSetInteriorVehicleDataResponse.h in Headers */,
+ C93193DC26B1B57C008203EC /* SDLSecurityQueryPayload.h in Headers */,
4ABB264F24F7F5720061BF55 /* SDLConfiguration.h in Headers */,
4ABB252224F7E3FC0061BF55 /* SDLLifecycleSyncPDataHandler.h in Headers */,
4ABB29FD24F8477F0061BF55 /* SDLAlertResponse.h in Headers */,
@@ -7686,6 +7752,7 @@
4ABB250524F596450061BF55 /* SDLListFilesOperation.h in Headers */,
4ABB268F24F7F8FC0061BF55 /* SDLHexUtility.h in Headers */,
4A8BD28124F9343F000945E3 /* SDLRemoteControlCapabilities.h in Headers */,
+ 4AAC0DBA25C1FEBA00746D33 /* SDLMenuManagerPrivateConstants.h in Headers */,
4ABB26DD24F7FAFD0061BF55 /* SDLRPCResponse.h in Headers */,
4ABB2AAE24F847F40061BF55 /* SDLSendLocationResponse.h in Headers */,
4A8BD36B24F94636000945E3 /* SDLProtocolMessageDisassembler.h in Headers */,
@@ -7906,7 +7973,7 @@
attributes = {
CLASSPREFIX = SDL;
LastSwiftUpdateCheck = 0710;
- LastUpgradeCheck = 1250;
+ LastUpgradeCheck = 1310;
ORGANIZATIONNAME = smartdevicelink;
TargetAttributes = {
5D4019AE1A76EC350006B0C2 = {
@@ -7923,7 +7990,7 @@
};
5D61FA1B1A84237100846EE7 = {
CreatedOnToolsVersion = 6.1.1;
- LastSwiftMigration = 1210;
+ LastSwiftMigration = 1250;
ProvisioningStyle = Automatic;
};
5D61FA251A84237100846EE7 = {
@@ -7968,8 +8035,6 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- 5D1FF2B121304568000EB9B4 /* ConnectionIAPTableViewController.storyboard in Resources */,
- 5D1FF2AF21304568000EB9B4 /* ConnectionTCPTableViewController.storyboard in Resources */,
5D1FF2C6213045F2000EB9B4 /* Images.xcassets in Resources */,
5D1FF2B021304568000EB9B4 /* Main.storyboard in Resources */,
5D1FF2D12130466D000EB9B4 /* LaunchScreen.xib in Resources */,
@@ -8008,10 +8073,8 @@
buildActionMask = 2147483647;
files = (
5D1FF2F1213047AB000EB9B4 /* Main.storyboard in Resources */,
- 5D1FF2F3213047AB000EB9B4 /* ConnectionTCPTableViewController.storyboard in Resources */,
5D1FF2C7213045F2000EB9B4 /* Images.xcassets in Resources */,
5D1FF2F5213047B3000EB9B4 /* LaunchScreen.xib in Resources */,
- 5D1FF2F2213047AB000EB9B4 /* ConnectionIAPTableViewController.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -8035,17 +8098,15 @@
5D1FF2CA2130463F000EB9B4 /* AppDelegate.m in Sources */,
5D1FF2BA21304581000EB9B4 /* ConnectionTCPTableViewController.m in Sources */,
B30509052511E79B008C5401 /* ProxyManager.m in Sources */,
- 5D1FF2B921304581000EB9B4 /* ConnectionContainerViewController.m in Sources */,
5D1FF29D21304515000EB9B4 /* RPCPermissionsManager.m in Sources */,
5D1FF2A121304515000EB9B4 /* VehicleDataManager.m in Sources */,
- 5D1FF2BF21304598000EB9B4 /* ConnectionAnimatedTransition.m in Sources */,
5D1FF2A721304531000EB9B4 /* Preferences.m in Sources */,
5D1FF2CC2130464E000EB9B4 /* main.m in Sources */,
4A40255D250026830080E159 /* SubscribeButtonManager.m in Sources */,
- 5D1FF2C021304598000EB9B4 /* ConnectionTransitionContext.m in Sources */,
5D1FF2A221304515000EB9B4 /* ButtonManager.m in Sources */,
5D1FF2A021304515000EB9B4 /* AudioManager.m in Sources */,
5D1FF29E21304515000EB9B4 /* MenuManager.m in Sources */,
+ 4ADBD1FB26FCEDFC00ABB045 /* ConnectionTabBarController.m in Sources */,
5D1FF2C3213045EB000EB9B4 /* AppConstants.m in Sources */,
5D1FF2B821304581000EB9B4 /* ConnectionIAPTableViewController.m in Sources */,
5D1FF29C21304515000EB9B4 /* PerformInteractionManager.m in Sources */,
@@ -8091,6 +8152,7 @@
4ABB250924F596920061BF55 /* SDLFileWrapper.m in Sources */,
4ABB24E324F5948D0061BF55 /* SDLEncryptionConfiguration.m in Sources */,
4ABB273D24F7FD1D0061BF55 /* SDLDimension.m in Sources */,
+ 4AAC0DBB25C1FEBA00746D33 /* SDLMenuManagerPrivateConstants.m in Sources */,
4ABB267B24F7F6840061BF55 /* SDLIconArchiveFile.m in Sources */,
4ABB2A2224F847980061BF55 /* SDLChangeRegistrationResponse.m in Sources */,
4A8BD3A524F9485B000945E3 /* SDLVideoStreamingState.m in Sources */,
@@ -8205,8 +8267,10 @@
4ABB274F24F7FD9C0061BF55 /* SDLECallConfirmationStatus.m in Sources */,
4ABB27AF24F7FFDA0061BF55 /* SDLMaintenanceModeStatus.m in Sources */,
4ABB292D24F842A00061BF55 /* SDLDeleteWindow.m in Sources */,
+ 4A93896725BB361C0069F438 /* SDLMenuReplaceUtilities.m in Sources */,
4ABB299A24F845440061BF55 /* SDLSendHapticData.m in Sources */,
4ABB29DB24F846880061BF55 /* SDLUnregisterAppInterface.m in Sources */,
+ 4A93895425B9DACA0069F438 /* SDLMenuShowOperation.m in Sources */,
4ABB270824F7FB8F0061BF55 /* SDLAppHMIType.m in Sources */,
4ABB282A24F824E70061BF55 /* SDLSystemAction.m in Sources */,
4ABB297824F844D30061BF55 /* SDLPublishAppService.m in Sources */,
@@ -8228,6 +8292,7 @@
4A8BD24824F93135000945E3 /* SDLMassageCushionFirmness.m in Sources */,
4ABB24DC24F594560061BF55 /* SDLEncryptionLifecycleManager.m in Sources */,
4ABB275524F7FD9C0061BF55 /* SDLDriverDistractionState.m in Sources */,
+ 4AC0128126D9612E00537E31 /* SDLPreloadPresentChoicesOperationUtilities.m in Sources */,
4ABB264124F7F45B0061BF55 /* SDLSystemCapabilityObserver.m in Sources */,
4ABB25F924F7E7EF0061BF55 /* SDLTouchManager.m in Sources */,
4ABB286024F828E00061BF55 /* SDLUpdateMode.m in Sources */,
@@ -8305,7 +8370,7 @@
4ABB258224F7E61E0061BF55 /* SDLChoiceCell.m in Sources */,
4ABB288D24F82A340061BF55 /* SDLVideoStreamingProtocol.m in Sources */,
B3A9DAFD25D4943E00CDFD21 /* SDLAppCapability.m in Sources */,
- 4ABB257024F7E5E80061BF55 /* SDLPreloadChoicesOperation.m in Sources */,
+ 4ABB257024F7E5E80061BF55 /* SDLPreloadPresentChoicesOperation.m in Sources */,
4ABB2B3F24F84EF50061BF55 /* SDLCloudAppProperties.m in Sources */,
4A8BD27C24F9343F000945E3 /* SDLPhoneCapability.m in Sources */,
4ABB269724F7F9400061BF55 /* SDLRPCFunctionNames.m in Sources */,
@@ -8363,6 +8428,7 @@
4ABB2BA424F850AE0061BF55 /* SDLLightCapabilities.m in Sources */,
B3A9DB0625D497FB00CDFD21 /* SDLAppCapabilityType.m in Sources */,
4ABB272224F7FCAE0061BF55 /* SDLDefrostZone.m in Sources */,
+ C93193DD26B1B57C008203EC /* SDLSecurityQueryPayload.m in Sources */,
4ABB24BB24F592620061BF55 /* NSMutableArray+Safe.m in Sources */,
4ABB25AA24F7E6E10061BF55 /* SDLMenuManager.m in Sources */,
4ABB25DD24F7E77C0061BF55 /* SDLScreenManager.m in Sources */,
@@ -8408,6 +8474,7 @@
4ABB28C924F82A6A0061BF55 /* SDLOnRCStatus.m in Sources */,
4ABB253124F7E43A0061BF55 /* SDLAsynchronousRPCOperation.m in Sources */,
4ABB2A7524F847D40061BF55 /* SDLPublishAppServiceResponse.m in Sources */,
+ 4A93893E25B8CBD40069F438 /* SDLMenuReplaceOperation.m in Sources */,
4A8BD3AA24F948CF000945E3 /* SDLDeleteFileOperation.m in Sources */,
4ABB2B4524F84EF50061BF55 /* SDLBodyInformation.m in Sources */,
4ABB25BB24F7E70E0061BF55 /* SDLSoftButtonObject.m in Sources */,
@@ -8431,7 +8498,6 @@
4ABB29B424F845DB0061BF55 /* SDLSpeak.m in Sources */,
4A8BD3AF24F98ACE000945E3 /* SDLLogManager.m in Sources */,
4A39C6FA25E84C87005C8943 /* SDLKeyboardCapabilities.m in Sources */,
- 4ABB257124F7E5E80061BF55 /* SDLPresentChoiceSetOperation.m in Sources */,
4ABB2A5624F847B10061BF55 /* SDLGetWayPointsResponse.m in Sources */,
4ABB24F524F595120061BF55 /* SDLArtwork.m in Sources */,
4ABB27B124F7FFDA0061BF55 /* SDLMassageCushion.m in Sources */,
@@ -8441,7 +8507,9 @@
4ABB282F24F824E70061BF55 /* SDLTextAlignment.m in Sources */,
4A8BD31124F938D6000945E3 /* SDLWeatherServiceManifest.m in Sources */,
4ABB271524F7FC4E0061BF55 /* SDLCompassDirection.m in Sources */,
+ C99BE00A26C53E7F00DB0B54 /* SDLSecurityQueryErrorCode.m in Sources */,
4ABB254424F7E48D0061BF55 /* SDLLockScreenRootViewController.m in Sources */,
+ 4A93895A25B9E5E40069F438 /* SDLMenuConfigurationUpdateOperation.m in Sources */,
4ABB265F24F7F5F20061BF55 /* SDLNotificationDispatcher.m in Sources */,
4A8BD31624F938D6000945E3 /* SDLWindowTypeCapabilities.m in Sources */,
4ABB280924F824600061BF55 /* SDLSoftButtonType.m in Sources */,
@@ -8695,6 +8763,7 @@
5DBEFA581F436132009EE295 /* SDLFakeSecurityManager.m in Sources */,
9FA0D00022DF06A0009CF344 /* SDLWindowCapabilitySpec.m in Sources */,
162E82D91A9BDE8A00906325 /* SDLDisplayTypeSpec.m in Sources */,
+ 4ABC1CB125DC520300545AC6 /* SDLMenuShowOperationSpec.m in Sources */,
00EADD3522DFE5670088B608 /* SDLEncryptionConfigurationSpec.m in Sources */,
162E83871A9BDE8B00906325 /* SDLPermissionItemSpec.m in Sources */,
5DAB5F5320989A8300A020C8 /* SDLVoiceCommandSpec.m in Sources */,
@@ -8797,6 +8866,7 @@
162E83811A9BDE8B00906325 /* SDLImageFieldSpec.m in Sources */,
5D60DF24202B7A80001EDA01 /* SDLAsynchronousRPCRequestOperationSpec.m in Sources */,
883C22CB222EEF0900939C4C /* SDLRPCFunctionNamesSpec.m in Sources */,
+ 4AAC0DE825C493EE00746D33 /* SDLMenuReplaceUtilitiesSpecHelpers.m in Sources */,
162E834F1A9BDE8B00906325 /* SDLDeleteCommandResponseSpec.m in Sources */,
88B848C91F462E3600DED768 /* TestFileProgressResponse.m in Sources */,
162E83231A9BDE8B00906325 /* SDLAddSubMenuSpec.m in Sources */,
@@ -8848,6 +8918,7 @@
1680B11D1A9CD7AD00DBD79E /* SDLProtocolMessageDisassemblerSpec.m in Sources */,
8BBEA6091F324832003EEA26 /* SDLMetadataTypeSpec.m in Sources */,
5DAD5F8B20508F140025624C /* SDLSoftButtonObjectSpec.m in Sources */,
+ C99BE00D26C5B23000DB0B54 /* SDLSecurityQueryPayloadSpec.m in Sources */,
DA9F7E9E1DCC05B900ACAE48 /* SDLWaypointTypeSpec.m in Sources */,
5D76E31C1D3805FF00647CFA /* SDLLockScreenManagerSpec.m in Sources */,
162E82DA1A9BDE8B00906325 /* SDLDriverDistractionStateSpec.m in Sources */,
@@ -8897,6 +8968,7 @@
5DA23FF61F2FAA31009C0313 /* SDLControlFramePayloadRPCStartServiceSpec.m in Sources */,
162E83201A9BDE8B00906325 /* SDLOnVehicleDataSpec.m in Sources */,
1EAA47762036B847000FE74B /* SDLEqualizerSettingsSpec.m in Sources */,
+ 4AC0128326D9686F00537E31 /* SDLPreloadPresentChoicesOperationUtilitiesSpec.m in Sources */,
752ECDB9228C42E100D945F4 /* SDLMenuRunScoreSpec.m in Sources */,
162E83141A9BDE8B00906325 /* SDLOnDriverDistractionSpec.m in Sources */,
B3838A09257C4EB400420C11 /* SDLDoorStatusSpec.m in Sources */,
@@ -8962,7 +9034,6 @@
162E83131A9BDE8B00906325 /* SDLOnCommandSpec.m in Sources */,
162E833A1A9BDE8B00906325 /* SDLSetDisplayLayoutSpec.m in Sources */,
1EE8C4401F348D3200FDC2CF /* SDLClimateControlCapabilitiesSpec.m in Sources */,
- 5DE35E5420CB1C590034BE5A /* SDLPresentChoiceSetOperationSpec.m in Sources */,
162E838F1A9BDE8B00906325 /* SDLTextFieldSpec.m in Sources */,
8818ADDD2100FE0C007D6F19 /* SDLTurnSignalSpec.m in Sources */,
162E82CA1A9BDE8A00906325 /* SDLAmbientLightStatusSpec.m in Sources */,
@@ -8983,6 +9054,7 @@
162E82F91A9BDE8B00906325 /* SDLSamplingRateSpec.m in Sources */,
5DBEFA541F434B9E009EE295 /* SDLStreamingMediaConfigurationSpec.m in Sources */,
1EB59CD2202DCA9B00343A61 /* SDLMassageModeSpec.m in Sources */,
+ 4AAC0DE025C468EC00746D33 /* SDLMenuReplaceUtilitiesSpec.m in Sources */,
9FA0D00C22DF0B65009CF344 /* SDLCreateWindowResponseSpec.m in Sources */,
162E82CB1A9BDE8A00906325 /* SDLAppHMITypeSpec.m in Sources */,
EEB2537E2067D3E80069584E /* SDLSecondaryTransportManagerSpec.m in Sources */,
@@ -9020,7 +9092,7 @@
5DA23FF81F2FAF2D009C0313 /* SDLControlFramePayloadRPCStartServiceAckSpec.m in Sources */,
162E83191A9BDE8B00906325 /* SDLOnLanguageChangeSpec.m in Sources */,
5DE35E4E20CB1C2C0034BE5A /* SDLDeleteChoicesOperationSpec.m in Sources */,
- 5DE35E5220CB1C490034BE5A /* SDLPreloadChoicesOperationSpec.m in Sources */,
+ 5DE35E5220CB1C490034BE5A /* SDLPreloadPresentChoicesOperationSpec.m in Sources */,
5DADA7781F4E059E0084D17D /* SDLRectangleSpec.m in Sources */,
4A457DC324A2933E00386CBA /* SDLLifecycleRPCAdapterSpec.m in Sources */,
5DB1BCDD1D243DC3002FFC37 /* SDLLifecycleConfigurationSpec.m in Sources */,
@@ -9053,6 +9125,7 @@
162E836B1A9BDE8B00906325 /* SDLSyncPDataResponseSpec.m in Sources */,
8B7B31AF1F2FBA0200BDC38D /* SDLVideoStreamingCapabilitySpec.m in Sources */,
88FBF7C2250132C1005EA0A4 /* SDLOnLockScreenStatusSpec.m in Sources */,
+ 4ABC1CAD25DC51A800545AC6 /* SDLMenuConfigurationUpdateOperationSpec.m in Sources */,
8B05F88922DD011300666CD8 /* SDLUnpublishAppServiceSpec.m in Sources */,
162E839B1A9BDE8B00906325 /* SDLRPCNotificationSpec.m in Sources */,
162E83581A9BDE8B00906325 /* SDLGetVehicleDataResponseSpec.m in Sources */,
@@ -9141,6 +9214,7 @@
162E83731A9BDE8B00906325 /* SDLBeltStatusSpec.m in Sources */,
162E83551A9BDE8B00906325 /* SDLEndAudioPassThruResponseSpec.m in Sources */,
8881AFC12225EB9300EA870B /* SDLGetCloudAppPropertiesResponseSpec.m in Sources */,
+ 4ABC1CA725DC4E1C00545AC6 /* SDLMenuReplaceOperationSpec.m in Sources */,
000DD56E22EF01FC005AB7A7 /* SDLSeatLocationSpec.m in Sources */,
162E83251A9BDE8B00906325 /* SDLAlertSpec.m in Sources */,
2BF2F85220ED068200A26EF2 /* SDLAudioStreamingIndicatorSpec.m in Sources */,
@@ -9175,8 +9249,8 @@
5D1FF2C4213045EB000EB9B4 /* AppConstants.m in Sources */,
5D1FF2DA21304746000EB9B4 /* ButtonManager.swift in Sources */,
5DC49BDD237314B500B2B8F2 /* SceneDelegate.swift in Sources */,
+ 4ADBD1F826FCED4000ABB045 /* ConnectionTabBarController.swift in Sources */,
5D1FF2DC21304746000EB9B4 /* AlertManager.swift in Sources */,
- 5D1FF2EB2130479C000EB9B4 /* ConnectionContainerViewController.swift in Sources */,
5D1FF2E021304746000EB9B4 /* MenuManager.swift in Sources */,
5D1FF2DF21304746000EB9B4 /* PerformInteractionManager.swift in Sources */,
5D1FF2ED2130479C000EB9B4 /* ConnectionIAPTableViewController.swift in Sources */,
@@ -9232,14 +9306,6 @@
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
- 5D1FF2A921304567000EB9B4 /* ConnectionTCPTableViewController.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- 5D1FF2AA21304567000EB9B4 /* Base */,
- );
- name = ConnectionTCPTableViewController.storyboard;
- sourceTree = "<group>";
- };
5D1FF2AB21304567000EB9B4 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
@@ -9248,14 +9314,6 @@
name = Main.storyboard;
sourceTree = "<group>";
};
- 5D1FF2AD21304567000EB9B4 /* ConnectionIAPTableViewController.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- 5D1FF2AE21304567000EB9B4 /* Base */,
- );
- name = ConnectionIAPTableViewController.storyboard;
- sourceTree = "<group>";
- };
5D1FF2CF2130466D000EB9B4 /* LaunchScreen.xib */ = {
isa = PBXVariantGroup;
children = (
@@ -9390,13 +9448,14 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = NCVC2MHU7M;
INFOPLIST_FILE = "$(SRCROOT)/Example Apps/Example ObjC/SmartDeviceLink-Example-ObjC-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 7.2.0;
+ MARKETING_VERSION = 7.3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
PRODUCT_NAME = "SDL Example";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -9408,13 +9467,14 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = NCVC2MHU7M;
INFOPLIST_FILE = "$(SRCROOT)/Example Apps/Example ObjC/SmartDeviceLink-Example-ObjC-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 7.2.0;
+ MARKETING_VERSION = 7.3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
PRODUCT_NAME = "SDL Example";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -9433,6 +9493,7 @@
CLANG_STATIC_ANALYZER_MODE = deep;
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_INTEGER = YES;
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES;
+ CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_FLOAT_CONVERSION = YES;
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
@@ -9462,7 +9523,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
- MARKETING_VERSION = 7.2.0;
+ MARKETING_VERSION = 7.3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.smartdevicelink;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -9489,6 +9550,7 @@
CLANG_STATIC_ANALYZER_MODE = deep;
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_INTEGER = YES;
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES;
+ CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_FLOAT_CONVERSION = YES;
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
@@ -9514,7 +9576,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
- MARKETING_VERSION = 7.2.0;
+ MARKETING_VERSION = 7.3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.smartdevicelink;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -9606,13 +9668,14 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = NCVC2MHU7M;
INFOPLIST_FILE = "$(SRCROOT)/Example Apps/Example Swift/SmartDeviceLink-Example-Swift-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 7.2.0;
+ MARKETING_VERSION = 7.3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
PRODUCT_NAME = "SDL Example Swift";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -9628,13 +9691,14 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = NCVC2MHU7M;
INFOPLIST_FILE = "$(SRCROOT)/Example Apps/Example Swift/SmartDeviceLink-Example-Swift-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- MARKETING_VERSION = 7.2.0;
+ MARKETING_VERSION = 7.3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
PRODUCT_NAME = "SDL Example Swift";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -9681,7 +9745,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
- MARKETING_VERSION = 7.2.0;
+ MARKETING_VERSION = 7.3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SmartDeviceLinkSwift;
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_CLANG_STATIC_ANALYZER = YES;
@@ -9732,7 +9796,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = "$(inherited)";
- MARKETING_VERSION = 7.2.0;
+ MARKETING_VERSION = 7.3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SmartDeviceLinkSwift;
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_CLANG_STATIC_ANALYZER = YES;
diff --git a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-ObjC.xcscheme b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-ObjC.xcscheme
index ed5b74e00..0594d7cad 100644
--- a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-ObjC.xcscheme
+++ b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-ObjC.xcscheme
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
- LastUpgradeVersion = "1250"
+ LastUpgradeVersion = "1310"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
diff --git a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-Swift.xcscheme b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-Swift.xcscheme
new file mode 100644
index 000000000..590cc3654
--- /dev/null
+++ b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink-Example-Swift.xcscheme
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "1310"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8829567D207CF68800EF056C"
+ BuildableName = "SDL Example Swift.app"
+ BlueprintName = "SmartDeviceLink-Example-Swift"
+ ReferencedContainer = "container:SmartDeviceLink-iOS.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES">
+ <Testables>
+ </Testables>
+ </TestAction>
+ <LaunchAction
+ buildConfiguration = "Debug"
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ debugServiceExtension = "internal"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8829567D207CF68800EF056C"
+ BuildableName = "SDL Example Swift.app"
+ BlueprintName = "SmartDeviceLink-Example-Swift"
+ ReferencedContainer = "container:SmartDeviceLink-iOS.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </LaunchAction>
+ <ProfileAction
+ buildConfiguration = "Release"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable
+ runnableDebuggingMode = "0">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "8829567D207CF68800EF056C"
+ BuildableName = "SDL Example Swift.app"
+ BlueprintName = "SmartDeviceLink-Example-Swift"
+ ReferencedContainer = "container:SmartDeviceLink-iOS.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme
index 8456e95f7..b5dda18cd 100644
--- a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme
+++ b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
- LastUpgradeVersion = "1250"
+ LastUpgradeVersion = "1310"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
diff --git a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLinkSwift.xcscheme b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLinkSwift.xcscheme
index e0da27d50..5bca151a1 100644
--- a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLinkSwift.xcscheme
+++ b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLinkSwift.xcscheme
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
- LastUpgradeVersion = "1250"
+ LastUpgradeVersion = "1310"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
diff --git a/SmartDeviceLink.podspec b/SmartDeviceLink.podspec
index 310d1e3bc..d7ed9e6ee 100644
--- a/SmartDeviceLink.podspec
+++ b/SmartDeviceLink.podspec
@@ -1,7 +1,7 @@
Pod::Spec.new do |s|
s.name = "SmartDeviceLink"
-s.version = "7.2.0"
+s.version = "7.3.0"
s.summary = "Connect your app with cars!"
s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS"
s.license = { :type => "New BSD", :file => "LICENSE" }
diff --git a/SmartDeviceLink/private/SDLCheckChoiceVROptionalOperation.h b/SmartDeviceLink/private/SDLCheckChoiceVROptionalOperation.h
index a7a9f14d0..cf83e3ad9 100644
--- a/SmartDeviceLink/private/SDLCheckChoiceVROptionalOperation.h
+++ b/SmartDeviceLink/private/SDLCheckChoiceVROptionalOperation.h
@@ -15,9 +15,9 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLCheckChoiceVROptionalOperation : SDLAsynchronousOperation
-@property (assign, nonatomic, getter=isVROptional) BOOL vrOptional;
+typedef void(^SDLCheckChoiceVROptionalCompletionHandler)(BOOL isVROptional, NSError *_Nullable error);
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager completionHandler:(SDLCheckChoiceVROptionalCompletionHandler)completionHandler;
@end
diff --git a/SmartDeviceLink/private/SDLCheckChoiceVROptionalOperation.m b/SmartDeviceLink/private/SDLCheckChoiceVROptionalOperation.m
index 0615cb01a..0b661c6c5 100644
--- a/SmartDeviceLink/private/SDLCheckChoiceVROptionalOperation.m
+++ b/SmartDeviceLink/private/SDLCheckChoiceVROptionalOperation.m
@@ -12,6 +12,7 @@
#import "SDLCreateInteractionChoiceSet.h"
#import "SDLConnectionManagerType.h"
#import "SDLDeleteInteractionChoiceSet.h"
+#import "SDLError.h"
#import "SDLLogMacros.h"
NS_ASSUME_NONNULL_BEGIN
@@ -20,18 +21,24 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) NSUUID *operationId;
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (assign, nonatomic, getter=isVROptional) BOOL vrOptional;
@property (copy, nonatomic, nullable) NSError *internalError;
+@property (copy, nonatomic) SDLCheckChoiceVROptionalCompletionHandler vrOptionalCompletionHandler;
@end
@implementation SDLCheckChoiceVROptionalOperation
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager completionHandler:(SDLCheckChoiceVROptionalCompletionHandler)completionHandler {
self = [super init];
- if (!self) { return nil; }
+ if (!self) {
+ completionHandler(NO, [NSError sdl_failedToCreateObjectOfClass:[SDLCheckChoiceVROptionalOperation class]]);
+ return nil;
+ }
_connectionManager = connectionManager;
_operationId = [NSUUID UUID];
+ _vrOptionalCompletionHandler = completionHandler;
return self;
}
@@ -96,6 +103,12 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Property Overrides
+- (void)finishOperation {
+ self.vrOptionalCompletionHandler(self.isVROptional, self.internalError);
+
+ [super finishOperation];
+}
+
- (nullable NSString *)name {
return [NSString stringWithFormat:@"%@ - %@", self.class, self.operationId];
}
diff --git a/SmartDeviceLink/private/SDLChoiceSetManager.m b/SmartDeviceLink/private/SDLChoiceSetManager.m
index 68f77cdd6..ae41c39c1 100644
--- a/SmartDeviceLink/private/SDLChoiceSetManager.m
+++ b/SmartDeviceLink/private/SDLChoiceSetManager.m
@@ -14,8 +14,7 @@
#import "SDLDeleteChoicesOperation.h"
#import "SDLError.h"
#import "SDLGlobals.h"
-#import "SDLPreloadChoicesOperation.h"
-#import "SDLPresentChoiceSetOperation.h"
+#import "SDLPreloadPresentChoicesOperation.h"
#import "SDLPresentKeyboardOperation.h"
#import "SDLRPCNotificationNotification.h"
#import "SDLRPCResponseNotification.h"
@@ -57,20 +56,12 @@ typedef NSNumber * SDLChoiceId;
@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
@property (copy, nonatomic, nullable) SDLWindowCapability *currentWindowCapability;
-@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *preloadedMutableChoices;
-@property (strong, nonatomic, readonly) NSSet<SDLChoiceCell *> *pendingPreloadChoices;
-@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *pendingMutablePreloadChoices;
-@property (strong, nonatomic, nullable) SDLChoiceSet *pendingPresentationSet;
-@property (strong, nonatomic, nullable) SDLAsynchronousOperation *pendingPresentOperation;
-
-@property (assign, nonatomic) UInt16 nextChoiceId;
@property (assign, nonatomic) UInt16 nextCancelId;
@property (assign, nonatomic, getter=isVROptional) BOOL vrOptional;
+@property (copy, nonatomic, readwrite) NSSet<SDLChoiceCell *> *preloadedChoices;
@end
-UInt16 const ChoiceCellIdMin = 1;
-
// Assigns a set range of unique cancel ids in order to prevent overlap with other sub-screen managers that use cancel ids. If the max cancel id is reached, generation starts over from the cancel id min value.
UInt16 const ChoiceCellCancelIdMin = 101;
UInt16 const ChoiceCellCancelIdMax = 200;
@@ -91,10 +82,8 @@ UInt16 const ChoiceCellCancelIdMax = 200;
_readWriteQueue = dispatch_queue_create_with_target("com.sdl.screenManager.choiceSetManager.readWriteQueue", DISPATCH_QUEUE_SERIAL, [SDLGlobals sharedGlobals].sdlProcessingQueue);
- _preloadedMutableChoices = [NSMutableSet set];
- _pendingMutablePreloadChoices = [NSMutableSet set];
+ _preloadedChoices = [NSSet set];
- _nextChoiceId = ChoiceCellIdMin;
_nextCancelId = ChoiceCellCancelIdMin;
_vrOptional = YES;
_keyboardConfiguration = [self sdl_defaultKeyboardConfiguration];
@@ -169,31 +158,26 @@ UInt16 const ChoiceCellCancelIdMax = 200;
[self.transactionQueue cancelAllOperations];
self.transactionQueue = [self sdl_newTransactionQueue];
- _preloadedMutableChoices = [NSMutableSet set];
- _pendingMutablePreloadChoices = [NSMutableSet set];
- _pendingPresentationSet = nil;
+ _preloadedChoices = [NSMutableSet set];
_vrOptional = YES;
- _nextChoiceId = ChoiceCellIdMin;
_nextCancelId = ChoiceCellCancelIdMin;
}
- (void)didEnterStateCheckingVoiceOptional {
// Setup by sending a Choice Set without VR, seeing if there's an error. If there is, send one with VR. This choice set will be used for `presentKeyboard` interactions.
- SDLCheckChoiceVROptionalOperation *checkOp = [[SDLCheckChoiceVROptionalOperation alloc] initWithConnectionManager:self.connectionManager];
-
- __weak typeof(self) weakSelf = self;
- __weak typeof(checkOp) weakOp = checkOp;
- checkOp.completionBlock = ^{
+ __weak typeof(self) weakself = self;
+ SDLCheckChoiceVROptionalOperation *checkOp = [[SDLCheckChoiceVROptionalOperation alloc] initWithConnectionManager:self.connectionManager completionHandler:^(BOOL isVROptional, NSError * _Nullable error) {
+ __strong typeof(weakself) strongself = weakself;
if ([self.currentState isEqualToString:SDLChoiceManagerStateShutdown]) { return; }
- weakSelf.vrOptional = weakOp.isVROptional;
- if (weakOp.error != nil) {
- [weakSelf.stateMachine transitionToState:SDLChoiceManagerStateStartupError];
+ strongself.vrOptional = isVROptional;
+ if (error != nil) {
+ [strongself.stateMachine transitionToState:SDLChoiceManagerStateStartupError];
} else {
- [weakSelf.stateMachine transitionToState:SDLChoiceManagerStateReady];
+ [strongself.stateMachine transitionToState:SDLChoiceManagerStateReady];
}
- };
+ }];
[self.transactionQueue addOperation:checkOp];
}
@@ -204,164 +188,87 @@ UInt16 const ChoiceCellCancelIdMax = 200;
#pragma mark - Choice Management
-#pragma mark Upload / Delete
+#pragma mark Delete
-- (void)preloadChoices:(NSArray<SDLChoiceCell *> *)choices withCompletionHandler:(nullable SDLPreloadChoiceCompletionHandler)handler {
- SDLLogV(@"Request to preload choices: %@", choices);
- if ([self.currentState isEqualToString:SDLChoiceManagerStateShutdown]) {
- NSError *error = [NSError sdl_choiceSetManager_incorrectState:self.currentState];
- SDLLogE(@"Attempted to preload choices but the choice set manager is shut down: %@", error);
- if (handler != nil) {
- handler(error);
- }
+- (void)deleteChoices:(NSArray<SDLChoiceCell *> *)choices {
+ SDLLogV(@"Request to delete choices: %@", choices);
+ if (![self.currentState isEqualToString:SDLChoiceManagerStateReady]) {
+ SDLLogE(@"Attempted to delete choices in an incorrect state: %@, they will not be deleted", self.currentState);
return;
}
- NSMutableOrderedSet<SDLChoiceCell *> *mutableChoicesToUpload = [self sdl_choicesToBeUploadedWithArray:choices];
- [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
- [mutableChoicesToUpload minusSet:self.preloadedMutableChoices];
- [mutableChoicesToUpload minusSet:self.pendingMutablePreloadChoices];
+ __weak typeof(self) weakself = self;
+ SDLDeleteChoicesOperation *deleteOp = [[SDLDeleteChoicesOperation alloc] initWithConnectionManager:self.connectionManager cellsToDelete:[NSSet setWithArray:choices] loadedCells:self.preloadedChoices completionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError *_Nullable error) {
+ __strong typeof(weakself) strongself = weakself;
+ if ([strongself.currentState isEqualToEnum:SDLChoiceManagerStateShutdown]) {
+ SDLLogD(@"Cancelling deleting choices because the manager is shut down");
+ return;
+ }
+
+ SDLLogD(@"Finished deleting choices");
+
+ strongself.preloadedChoices = updatedLoadedCells;
+ [strongself sdl_updatePendingTasksWithCurrentPreloads];
+
+ if (error != nil) {
+ SDLLogE(@"Failed to delete choices with error: %@", error);
+ }
}];
- NSOrderedSet<SDLChoiceCell *> *choicesToUpload = [mutableChoicesToUpload copy];
- if (choicesToUpload.count == 0) {
- SDLLogD(@"All choices already preloaded. No need to perform a preload");
+ [self.transactionQueue addOperation:deleteOp];
+}
+
+#pragma mark Upload / Present
+
+- (void)preloadChoices:(NSArray<SDLChoiceCell *> *)choices withCompletionHandler:(nullable SDLPreloadChoiceCompletionHandler)handler {
+ SDLLogV(@"Request to preload choices: %@", choices);
+ if (choices.count == 0) {
if (handler != nil) {
- handler(nil);
+ handler([NSError sdl_choiceSetManager_choiceUploadFailed:@{
+ NSLocalizedDescriptionKey: @"Choice upload failed",
+ NSLocalizedFailureReasonErrorKey: @"No choices were provided for upload",
+ NSLocalizedRecoverySuggestionErrorKey: @"Provide some choice cells to upload instead of an empty list"
+ }]);
}
-
return;
}
-
- [self sdl_updateIdsOnChoices:choicesToUpload];
-
- // Add the preload cells to the pending preloads
- [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
- [self.pendingMutablePreloadChoices unionSet:choicesToUpload.set];
- }];
+ if (![self.currentState isEqualToString:SDLChoiceManagerStateReady]) {
+ NSError *error = [NSError sdl_choiceSetManager_incorrectState:self.currentState];
+ SDLLogE(@"Cannot preload choices when the manager isn't in the ready state: %@", error);
+ if (handler != nil) { handler(error); }
+ return;
+ }
// Upload pending preloads
// For backward compatibility with Gen38Inch display type head units
- SDLLogD(@"Preloading choices");
- SDLLogV(@"Choices to be uploaded: %@", choicesToUpload);
+ SDLLogD(@"Starting preload choices");
+ SDLLogV(@"Choices to be uploaded: %@", choices);
NSString *displayName = self.systemCapabilityManager.displays.firstObject.displayName;
__weak typeof(self) weakSelf = self;
- SDLPreloadChoicesOperation *preloadOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager displayName:displayName windowCapability:self.systemCapabilityManager.defaultMainWindowCapability isVROptional:self.isVROptional cellsToPreload:choicesToUpload updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {
+ SDLPreloadPresentChoicesOperation *preloadOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager displayName:displayName windowCapability:self.currentWindowCapability isVROptional:self.isVROptional cellsToPreload:choices loadedCells:self.preloadedChoices preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
__strong typeof(weakSelf) strongSelf = weakSelf;
- // Find the `SDLChoiceCell`s that failed to upload using the `choiceId`s
- NSMutableSet<SDLChoiceCell *> *failedChoiceUploadSet = [NSMutableSet set];
- for (NSNumber *failedChoiceUploadID in failedChoiceUploadIDs) {
- NSUInteger failedChoiceUploadIndex = [choicesToUpload indexOfObjectPassingTest:^BOOL(SDLChoiceCell * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
- return obj.choiceId == failedChoiceUploadID.intValue;
- }];
- if (failedChoiceUploadIndex == NSNotFound) { continue; }
- [failedChoiceUploadSet addObject:choicesToUpload[failedChoiceUploadIndex]];
- }
-
// Check if the manager has shutdown because the list of uploaded and pending choices should not be updated
if ([strongSelf.currentState isEqualToString:SDLChoiceManagerStateShutdown]) {
SDLLogD(@"Cancelling preloading choices because the manager is shut down");
- return;
- }
-
- // Update the list of `preloadedMutableChoices` and `pendingMutablePreloadChoices` with the successful choice uploads
- [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if (failedChoiceUploadSet.count == 0) {
- [strongSelf.preloadedMutableChoices unionSet:choicesToUpload.set];
- [strongSelf.pendingMutablePreloadChoices minusSet:choicesToUpload.set];
- } else {
- // If some choices failed, remove the failed choices from the successful ones, then update the preloaded choices and pending choices
- NSMutableSet<SDLChoiceCell *> *successfulChoiceUploads = [NSMutableSet setWithSet:choicesToUpload.set];
- [successfulChoiceUploads minusSet:failedChoiceUploadSet];
-
- [strongSelf.preloadedMutableChoices unionSet:successfulChoiceUploads];
- [strongSelf.pendingMutablePreloadChoices minusSet:choicesToUpload.set];
- }
- }];
- }];
-
- __weak typeof(preloadOp) weakPreloadOp = preloadOp;
- preloadOp.completionBlock = ^{
- SDLLogD(@"Choices finished preloading");
- if (handler != nil) {
- handler(weakPreloadOp.error);
+ if (handler != nil) { handler([NSError sdl_choiceSetManager_incorrectState:SDLChoiceManagerStateShutdown]); }
+ BLOCK_RETURN;
}
- };
-
- [self.transactionQueue addOperation:preloadOp];
-}
-- (void)deleteChoices:(NSArray<SDLChoiceCell *> *)choices {
- SDLLogV(@"Request to delete choices: %@", choices);
- if (![self.currentState isEqualToString:SDLChoiceManagerStateReady]) {
- SDLLogE(@"Attempted to delete choices in an incorrect state: %@, they will not be deleted", self.currentState);
- return;
- }
+ // Update the list of `preloadedChoices`
+ strongSelf.preloadedChoices = updatedLoadedCells;
+ [strongSelf sdl_updatePendingTasksWithCurrentPreloads];
- // Find cells to be deleted that are already uploaded or are pending upload
- NSSet<SDLChoiceCell *> *cellsToBeDeleted = [self sdl_choicesToBeDeletedWithArray:choices];
- NSSet<SDLChoiceCell *> *cellsToBeRemovedFromPending = [self sdl_choicesToBeRemovedFromPendingWithArray:choices];
-
- // If choices are deleted that are already uploaded or pending and are used by a pending presentation, cancel it and send an error
- NSSet<SDLChoiceCell *> *pendingPresentationChoices = [NSSet setWithArray:self.pendingPresentationSet.choices];
- if ((!self.pendingPresentOperation.isCancelled && !self.pendingPresentOperation.isFinished)
- && ([cellsToBeDeleted intersectsSet:pendingPresentationChoices] || [cellsToBeRemovedFromPending intersectsSet:pendingPresentationChoices])) {
- [self.pendingPresentOperation cancel];
- if (self.pendingPresentationSet.delegate != nil) {
- [self.pendingPresentationSet.delegate choiceSet:self.pendingPresentationSet didReceiveError:[NSError sdl_choiceSetManager_choicesDeletedBeforePresentation:@{@"deletedChoices": choices}]];
- }
- self.pendingPresentationSet = nil;
- }
+ SDLLogD(@"Choices finished preloading");
- // Remove the cells from pending and delete choices
- [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
- [self.pendingMutablePreloadChoices minusSet:cellsToBeRemovedFromPending];
+ if (handler != nil) { handler(error); }
}];
- for (SDLAsynchronousOperation *op in self.transactionQueue.operations) {
- if (![op isMemberOfClass:[SDLPreloadChoicesOperation class]]) { continue; }
-
- SDLPreloadChoicesOperation *preloadOp = (SDLPreloadChoicesOperation *)op;
- [preloadOp removeChoicesFromUpload:cellsToBeRemovedFromPending];
- }
-
- // Find choices to delete
- if (cellsToBeDeleted.count == 0) { return; }
-
- [self sdl_findIdsOnChoices:cellsToBeDeleted];
- SDLDeleteChoicesOperation *deleteOp = [[SDLDeleteChoicesOperation alloc] initWithConnectionManager:self.connectionManager cellsToDelete:cellsToBeDeleted];
-
- __weak typeof(self) weakSelf = self;
- __weak typeof(deleteOp) weakOp = deleteOp;
- deleteOp.completionBlock = ^{
- SDLLogD(@"Finished deleting choices");
-
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if (weakOp.error != nil) {
- SDLLogE(@"Failed to delete choices: %@", weakOp.error);
- return;
- }
-
- // Check if the manager has shutdown because the list of uploaded choices should not be updated
- if ([strongSelf.currentState isEqualToString:SDLChoiceManagerStateShutdown]) {
- SDLLogD(@"Cancelling deleting choices because manager is shut down");
- return;
- }
-
- [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- [strongSelf.preloadedMutableChoices minusSet:cellsToBeDeleted];
- }];
- };
- [self.transactionQueue addOperation:deleteOp];
+ [self.transactionQueue addOperation:preloadOp];
}
-#pragma mark Present
-
- (void)presentChoiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode withKeyboardDelegate:(nullable id<SDLKeyboardDelegate>)delegate {
if (![self.currentState isEqualToString:SDLChoiceManagerStateReady]) {
SDLLogE(@"Attempted to present choices in an incorrect state: %@, it will not be presented", self.currentState);
@@ -373,67 +280,26 @@ UInt16 const ChoiceCellCancelIdMax = 200;
return;
}
- if (self.pendingPresentationSet != nil && !self.pendingPresentOperation.isFinished) {
- SDLLogW(@"A choice set is pending: %@. We will try to cancel it in favor of presenting a different choice set: %@. If it's already on screen it cannot be cancelled", self.pendingPresentationSet, choiceSet);
- [self.pendingPresentOperation cancel];
- }
-
SDLLogD(@"Preloading and presenting choice set: %@", choiceSet);
- self.pendingPresentationSet = choiceSet;
+ // Add an operation to present it once the preload is complete
__weak typeof(self) weakSelf = self;
- [self preloadChoices:self.pendingPresentationSet.choices withCompletionHandler:^(NSError * _Nullable error) {
+ NSString *displayName = self.systemCapabilityManager.displays.firstObject.displayName;
+ SDLPreloadPresentChoicesOperation *presentOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager choiceSet:choiceSet mode:mode keyboardProperties:self.keyboardConfiguration keyboardDelegate:delegate cancelID:self.nextCancelId displayName:displayName windowCapability:self.currentWindowCapability isVROptional:self.isVROptional loadedCells:self.preloadedChoices preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
__strong typeof(weakSelf) strongSelf = weakSelf;
- if (error != nil) {
- SDLLogE(@"Error preloading choice cells for choice set presentation; aborting. Error: %@", error);
- [choiceSet.delegate choiceSet:choiceSet didReceiveError:error];
- return;
- }
+ // Check if the manager has shutdown because the list of uploaded and pending choices should not be updated
if ([strongSelf.currentState isEqualToString:SDLChoiceManagerStateShutdown]) {
- SDLLogD(@"Cancelling presenting choices because the manager has shut down");
- strongSelf.pendingPresentOperation = nil;
- strongSelf.pendingPresentationSet = nil;
- return;
+ SDLLogD(@"Cancelling preloading choices because the manager is shut down");
+ BLOCK_RETURN;
}
- // The cells necessary for this presentation are now preloaded, so we will enqueue a presentation
- [strongSelf sdl_presentChoiceSetWithMode:mode keyboardDelegate:delegate];
- }];
-}
-
-/// Helper method for presenting a choice set.
-/// @param mode If the set should be presented for the user to interact via voice, touch, or both
-/// @param delegate The keyboard delegate called when the user interacts with the search field of the choice set, if not set, a non-searchable choice set will be used
-- (void)sdl_presentChoiceSetWithMode:(SDLInteractionMode)mode keyboardDelegate:(nullable id<SDLKeyboardDelegate>)delegate {
- [self sdl_findIdsOnChoiceSet:self.pendingPresentationSet];
-
- SDLPresentChoiceSetOperation *presentOp = nil;
- if (delegate == nil) {
- // Non-searchable choice set
- presentOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:self.connectionManager choiceSet:self.pendingPresentationSet mode:mode keyboardProperties:nil keyboardDelegate:nil cancelID:self.nextCancelId windowCapability:self.currentWindowCapability];
- } else {
- // Searchable choice set
- presentOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:self.connectionManager choiceSet:self.pendingPresentationSet mode:mode keyboardProperties:self.keyboardConfiguration keyboardDelegate:delegate cancelID:self.nextCancelId windowCapability:self.currentWindowCapability];
- }
- self.pendingPresentOperation = presentOp;
-
- __weak typeof(self) weakSelf = self;
- __weak typeof(presentOp) weakOp = presentOp;
- self.pendingPresentOperation.completionBlock = ^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- __strong typeof(weakOp) strongOp = weakOp;
-
- SDLLogD(@"Finished presenting choice set: %@", strongOp.choiceSet);
- if (strongOp.error != nil && strongOp.choiceSet.delegate != nil) {
- [strongOp.choiceSet.delegate choiceSet:strongOp.choiceSet didReceiveError:strongOp.error];
- } else if (strongOp.selectedCell != nil && strongOp.choiceSet.delegate != nil) {
- [strongOp.choiceSet.delegate choiceSet:strongOp.choiceSet didSelectChoice:strongOp.selectedCell withSource:strongOp.selectedTriggerSource atRowIndex:strongOp.selectedCellRow];
- }
+ // Update the list of `preloadedChoices`
+ strongSelf.preloadedChoices = updatedLoadedCells;
+ [strongSelf sdl_updatePendingTasksWithCurrentPreloads];
- strongSelf.pendingPresentOperation = nil;
- strongSelf.pendingPresentationSet = nil;
- };
+ SDLLogD(@"Choices finished preloading");
+ }];
[self.transactionQueue addOperation:presentOp];
}
@@ -444,17 +310,11 @@ UInt16 const ChoiceCellCancelIdMax = 200;
return nil;
}
- if (self.pendingPresentationSet != nil) {
- SDLLogW(@"There's already a pending presentation set, cancelling it in favor of a keyboard");
- [self.pendingPresentOperation cancel];
- self.pendingPresentationSet = nil;
- }
-
SDLLogD(@"Presenting keyboard with initial text: %@", initialText);
// Present a keyboard with the choice set that we used to test VR's optional state
UInt16 keyboardCancelId = self.nextCancelId;
- self.pendingPresentOperation = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:self.connectionManager keyboardProperties:self.keyboardConfiguration initialText:initialText keyboardDelegate:delegate cancelID:keyboardCancelId windowCapability:self.currentWindowCapability];
- [self.transactionQueue addOperation:self.pendingPresentOperation];
+ SDLPresentKeyboardOperation *keyboardOperation = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:self.connectionManager keyboardProperties:self.keyboardConfiguration initialText:initialText keyboardDelegate:delegate cancelID:keyboardCancelId windowCapability:self.currentWindowCapability];
+ [self.transactionQueue addOperation:keyboardOperation];
return @(keyboardCancelId);
}
@@ -473,134 +333,18 @@ UInt16 const ChoiceCellCancelIdMax = 200;
#pragma mark - Choice Management Helpers
-/// Checks the passed list of choices to be uploaded and returns the items that have not yet been uploaded to the module.
-/// @param choices The choices to be uploaded
-/// @return The choices that have not yet been uploaded to the module
-- (NSMutableOrderedSet<SDLChoiceCell *> *)sdl_choicesToBeUploadedWithArray:(NSArray<SDLChoiceCell *> *)choices {
- NSMutableOrderedSet<SDLChoiceCell *> *choicesCopy = [[NSMutableOrderedSet alloc] initWithArray:choices copyItems:YES];
-
- SDLVersion *choiceUniquenessSupportedVersion = [[SDLVersion alloc] initWithMajor:7 minor:1 patch:0];
- if ([[SDLGlobals sharedGlobals].rpcVersion isLessThanVersion:choiceUniquenessSupportedVersion]) {
- // If we're on < RPC 7.1, all primary texts need to be unique, so we don't need to check removed properties and duplicate cells
- [self sdl_addUniqueNamesToCells:choicesCopy];
- } else {
- // On > RPC 7.1, at this point all cells are unique when considering all properties, but we also need to check if any cells will _appear_ as duplicates when displayed on the screen. To check that, we'll remove properties from the set cells based on the system capabilities (we probably don't need to consider them changing between now and when they're actually sent to the HU) and check for uniqueness again. Then we'll add unique identifiers to primary text if there are duplicates. Then we transfer the primary text identifiers back to the main cells and add those to an operation to be sent.
- NSMutableOrderedSet<SDLChoiceCell *> *strippedCellsCopy = [self sdl_removeUnusedProperties:choicesCopy];
- [self sdl_addUniqueNamesBasedOnStrippedCells:strippedCellsCopy toUnstrippedCells:choicesCopy];
- }
- [choicesCopy minusSet:self.preloadedChoices];
-
- return choicesCopy;
-}
-
-- (NSMutableOrderedSet<SDLChoiceCell *> *)sdl_removeUnusedProperties:(NSMutableOrderedSet<SDLChoiceCell *> *)choiceCells {
- NSMutableOrderedSet<SDLChoiceCell *> *strippedCellsCopy = [[NSMutableOrderedSet alloc] initWithOrderedSet:choiceCells copyItems:YES];
- for (SDLChoiceCell *cell in strippedCellsCopy) {
- // Strip away fields that cannot be used to determine uniqueness visually including fields not supported by the HMI
- cell.voiceCommands = nil;
+- (void)sdl_updatePendingTasksWithCurrentPreloads {
+ for (NSOperation *op in self.transactionQueue.operations) {
+ if (op.isExecuting || op.isCancelled) { continue; }
- // Don't check SDLImageFieldNameSubMenuIcon because it was added in 7.0 when the feature was added in 5.0. Just assume that if CommandIcon is not available, the submenu icon is not either.
- if (![self.currentWindowCapability hasImageFieldOfName:SDLImageFieldNameChoiceImage]) {
- cell.artwork = nil;
- }
- if (![self.currentWindowCapability hasTextFieldOfName:SDLTextFieldNameSecondaryText]) {
- cell.secondaryText = nil;
- }
- if (![self.currentWindowCapability hasTextFieldOfName:SDLTextFieldNameTertiaryText]) {
- cell.tertiaryText = nil;
- }
- if (![self.currentWindowCapability hasImageFieldOfName:SDLImageFieldNameChoiceSecondaryImage]) {
- cell.secondaryArtwork = nil;
+ if ([op isMemberOfClass:SDLPreloadPresentChoicesOperation.class]) {
+ SDLPreloadPresentChoicesOperation *preloadPresentOp = (SDLPreloadPresentChoicesOperation *)op;
+ preloadPresentOp.loadedCells = self.preloadedChoices;
+ } else if ([op isMemberOfClass:SDLDeleteChoicesOperation.class]) {
+ SDLDeleteChoicesOperation *deleteOp = (SDLDeleteChoicesOperation *)op;
+ deleteOp.loadedCells = self.preloadedChoices;
}
}
-
- return strippedCellsCopy;
-}
-
-- (void)sdl_addUniqueNamesBasedOnStrippedCells:(NSMutableOrderedSet<SDLChoiceCell *> *)strippedCells toUnstrippedCells:(NSMutableOrderedSet<SDLChoiceCell *> *)unstrippedCells {
- NSParameterAssert(strippedCells.count == unstrippedCells.count);
- // Tracks how many of each cell primary text there are so that we can append numbers to make each unique as necessary
- NSMutableDictionary<SDLChoiceCell *, NSNumber *> *dictCounter = [[NSMutableDictionary alloc] init];
- for (NSUInteger i = 0; i < strippedCells.count; i++) {
- SDLChoiceCell *cell = strippedCells[i];
- NSNumber *counter = dictCounter[cell];
- if (counter != nil) {
- counter = @(counter.intValue + 1);
- dictCounter[cell] = counter;
- } else {
- dictCounter[cell] = @1;
- }
-
- counter = dictCounter[cell];
- if (counter.intValue > 1) {
- unstrippedCells[i].uniqueText = [NSString stringWithFormat: @"%@ (%d)", unstrippedCells[i].text, counter.intValue];
- }
- }
-}
-
-/// Checks if 2 or more cells have the same text/title. In case this condition is true, this function will handle the presented issue by adding "(count)".
-/// E.g. Choices param contains 2 cells with text/title "Address" will be handled by updating the uniqueText/uniqueTitle of the second cell to "Address (2)".
-/// @param choices The choices to be uploaded.
-- (void)sdl_addUniqueNamesToCells:(NSOrderedSet<SDLChoiceCell *> *)choices {
- // Tracks how many of each cell primary text there are so that we can append numbers to make each unique as necessary
- NSMutableDictionary<NSString *, NSNumber *> *dictCounter = [[NSMutableDictionary alloc] init];
- for (SDLChoiceCell *cell in choices) {
- NSString *cellName = cell.text;
- NSNumber *counter = dictCounter[cellName];
- if (counter != nil) {
- counter = @(counter.intValue + 1);
- dictCounter[cellName] = counter;
- } else {
- dictCounter[cellName] = @1;
- }
- if (counter.intValue > 1) {
- cell.uniqueText = [NSString stringWithFormat: @"%@ (%d)", cell.text, counter.intValue];
- }
- }
-}
-
-/// Checks the passed list of choices to be deleted and returns the items that have been uploaded to the module.
-/// @param choices The choices to be deleted
-/// @return The choices that have been uploaded to the module
-- (NSSet<SDLChoiceCell *> *)sdl_choicesToBeDeletedWithArray:(NSArray<SDLChoiceCell *> *)choices {
- NSMutableSet<SDLChoiceCell *> *choicesSet = [NSMutableSet setWithArray:choices];
- [choicesSet intersectSet:self.preloadedChoices];
-
- return [choicesSet copy];
-}
-
-/// Checks the passed list of choices to be deleted and returns the items that are waiting to be uploaded to the module.
-/// @param choices The choices to be deleted
-/// @return The choices that are waiting to be uploaded to the module
-- (NSSet<SDLChoiceCell *> *)sdl_choicesToBeRemovedFromPendingWithArray:(NSArray<SDLChoiceCell *> *)choices {
- NSMutableSet<SDLChoiceCell *> *choicesSet = [NSMutableSet setWithArray:choices];
- [choicesSet intersectSet:self.pendingPreloadChoices];
-
- return [choicesSet copy];
-}
-
-/// Assigns a unique id to each choice item.
-/// @param choices An array of choices
-- (void)sdl_updateIdsOnChoices:(NSOrderedSet<SDLChoiceCell *> *)choices {
- for (SDLChoiceCell *cell in choices) {
- cell.choiceId = self.nextChoiceId;
- }
-}
-
-/// Checks each choice item to find out if it has already been uploaded or if it is the the process of being uploaded. If so, the choice item is assigned the unique id of the uploaded item.
-/// @param choiceSet A set of choice items
-- (void)sdl_findIdsOnChoiceSet:(SDLChoiceSet *)choiceSet {
- [self sdl_findIdsOnChoices:[NSSet setWithArray:choiceSet.choices]];
-}
-
-/// Checks each choice item to find out if it has already been uploaded or if it is the the process of being uploaded. If so, the choice item is assigned the unique id of the uploaded item.
-/// @param choices An array of choice items
-- (void)sdl_findIdsOnChoices:(NSSet<SDLChoiceCell *> *)choices {
- for (SDLChoiceCell *cell in choices) {
- SDLChoiceCell *uploadCell = [self.pendingPreloadChoices member:cell] ?: [self.preloadedChoices member:cell];
- if (uploadCell == nil) { continue; }
- cell.choiceId = uploadCell.choiceId;
- }
}
#pragma mark - Keyboard Configuration
@@ -628,34 +372,6 @@ UInt16 const ChoiceCellCancelIdMax = 200;
#pragma mark - Getters
-- (NSSet<SDLChoiceCell *> *)preloadedChoices {
- __block NSSet<SDLChoiceCell *> *set = nil;
- [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
- set = [self->_preloadedMutableChoices copy];
- }];
-
- return set;
-}
-
-- (NSSet<SDLChoiceCell *> *)pendingPreloadChoices {
- __block NSSet<SDLChoiceCell *> *set = nil;
- [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
- set = [self->_pendingMutablePreloadChoices copy];
- }];
-
- return set;
-}
-
-- (UInt16)nextChoiceId {
- __block UInt16 choiceId = 0;
- [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
- choiceId = self->_nextChoiceId;
- self->_nextChoiceId = choiceId + 1;
- }];
-
- return choiceId;
-}
-
- (UInt16)nextCancelId {
__block UInt16 cancelId = 0;
[SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
diff --git a/SmartDeviceLink/private/SDLDeleteChoicesOperation.h b/SmartDeviceLink/private/SDLDeleteChoicesOperation.h
index b712759cb..21d4cdbed 100644
--- a/SmartDeviceLink/private/SDLDeleteChoicesOperation.h
+++ b/SmartDeviceLink/private/SDLDeleteChoicesOperation.h
@@ -18,7 +18,12 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLDeleteChoicesOperation : SDLAsynchronousOperation
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager cellsToDelete:(NSSet<SDLChoiceCell *> *)cells;
+typedef void(^SDLDeleteChoicesCompletionHandler)(NSSet<SDLChoiceCell *> *updatedLoadedCells, NSError *_Nullable error);
+
+/// The cells that are loaded on the head unit
+@property (strong, nonatomic) NSSet<SDLChoiceCell *> *loadedCells;
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager cellsToDelete:(NSSet<SDLChoiceCell *> *)cellsToDelete loadedCells:(NSSet<SDLChoiceCell *> *)loadedCells completionHandler:(SDLDeleteChoicesCompletionHandler)completionHandler;
@end
diff --git a/SmartDeviceLink/private/SDLDeleteChoicesOperation.m b/SmartDeviceLink/private/SDLDeleteChoicesOperation.m
index 027c549dd..03ca2a4ab 100644
--- a/SmartDeviceLink/private/SDLDeleteChoicesOperation.m
+++ b/SmartDeviceLink/private/SDLDeleteChoicesOperation.m
@@ -27,18 +27,26 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) NSSet<SDLChoiceCell *> *cellsToDelete;
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (copy, nonatomic, nullable) NSError *internalError;
+@property (copy, nonatomic) SDLDeleteChoicesCompletionHandler deleteCompletionHandler;
+
+@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *mutableLoadedCells;
@end
@implementation SDLDeleteChoicesOperation
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager cellsToDelete:(NSSet<SDLChoiceCell *> *)cells {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager cellsToDelete:(NSSet<SDLChoiceCell *> *)cellsToDelete loadedCells:(NSSet<SDLChoiceCell *> *)loadedCells completionHandler:(SDLDeleteChoicesCompletionHandler)completionHandler {
self = [super init];
- if (!self) { return nil; }
+ if (!self) {
+ completionHandler(loadedCells, [NSError sdl_failedToCreateObjectOfClass:[SDLDeleteChoicesOperation class]]);
+ return nil;
+ }
_connectionManager = connectionManager;
- _cellsToDelete = cells;
+ _cellsToDelete = cellsToDelete;
+ _mutableLoadedCells = [loadedCells mutableCopy];
_operationId = [NSUUID UUID];
+ _deleteCompletionHandler = completionHandler;
return self;
}
@@ -47,6 +55,9 @@ NS_ASSUME_NONNULL_BEGIN
[super start];
if (self.isCancelled) { return; }
+ [self sdl_updateCellsToDelete];
+ if (self.cellsToDelete.count == 0) { [self finishOperation]; }
+
[self sdl_sendDeletions];
}
@@ -59,8 +70,11 @@ NS_ASSUME_NONNULL_BEGIN
__weak typeof(self) weakSelf = self;
__block NSMutableDictionary<SDLRPCRequest *, NSError *> *errors = [NSMutableDictionary dictionary];
[self.connectionManager sendRequests:deleteChoices progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
+ SDLDeleteInteractionChoiceSet *sentRequest = (SDLDeleteInteractionChoiceSet *)request;
if (error != nil) {
errors[request] = error;
+ } else {
+ [self.mutableLoadedCells removeObject:[self sdl_loadedCellFromChoiceId:(UInt16)sentRequest.interactionChoiceSetID.unsignedIntValue]];
}
} completionHandler:^(BOOL success) {
if (!success) {
@@ -71,8 +85,49 @@ NS_ASSUME_NONNULL_BEGIN
}];
}
+#pragma mark - Getters / Setters
+
+- (void)setLoadedCells:(NSSet<SDLChoiceCell *> *)loadedCells {
+ _mutableLoadedCells = [loadedCells mutableCopy];
+}
+
+- (NSSet<SDLChoiceCell *> *)loadedCells {
+ return [_mutableLoadedCells copy];
+}
+
+#pragma mark - Helpers
+
+- (void)sdl_updateCellsToDelete {
+ // Remove cells that aren't loaded
+ NSMutableSet<SDLChoiceCell *> *updatedCellsToDelete = [self.cellsToDelete mutableCopy];
+ [updatedCellsToDelete intersectSet:self.loadedCells];
+
+ // Update the choice ids on the cells to be deleted
+ for (SDLChoiceCell *cell in updatedCellsToDelete) {
+ SDLChoiceCell *uploadCell = [self.loadedCells member:cell];
+ if (uploadCell == nil) { continue; }
+ cell.choiceId = uploadCell.choiceId;
+ }
+
+ // Update our cells to delete
+ self.cellsToDelete = [updatedCellsToDelete copy];
+}
+
+- (nullable SDLChoiceCell *)sdl_loadedCellFromChoiceId:(UInt16)choiceId {
+ for (SDLChoiceCell *cell in self.loadedCells) {
+ if (cell.choiceId == choiceId) { return cell; }
+ }
+
+ return nil;
+}
+
#pragma mark - Property Overrides
+- (void)finishOperation {
+ self.deleteCompletionHandler(self.loadedCells, self.internalError);
+ [super finishOperation];
+}
+
- (nullable NSString *)name {
return [NSString stringWithFormat:@"%@ - %@", self.class, self.operationId];
}
diff --git a/SmartDeviceLink/private/SDLDeleteFileOperation.h b/SmartDeviceLink/private/SDLDeleteFileOperation.h
index 9252ae725..f5031a61e 100644
--- a/SmartDeviceLink/private/SDLDeleteFileOperation.h
+++ b/SmartDeviceLink/private/SDLDeleteFileOperation.h
@@ -18,30 +18,26 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLDeleteFileOperation : SDLAsynchronousOperation
-/**
- * Create an instance of a delete files operation which will tell the remote system to remove a file form its storage.
- *
- * @param fileName The name of the file to be deleted on the remote system.
- * @param connectionManager The connection manager which will handle transporting the request to the remote system.
- * @param completionHandler A completion handler to be called when the delete finishes.
- *
- * @return An instance of SDLDeleteFilesOperation
- */
-- (instancetype)initWithFileName:(NSString *)fileName connectionManager:(id<SDLConnectionManagerType>)connectionManager completionHandler:(nullable SDLFileManagerDeleteCompletionHandler)completionHandler;
-
-/**
- The name of the file to be deleted on the remote system.
- */
-@property (copy, nonatomic, readonly) NSString *fileName;
-
-/**
- The connection manager which will handle transporting the request to the remote system.
- */
+/// Create an instance of a delete files operation which will tell the remote system to remove a file form its storage.
+/// @param fileName The name of the file to be deleted on the remote system.
+/// @param connectionManager The connection manager which will handle transporting the request to the remote system.
+/// @param remoteFileNames The files currently on the remote file system. Used to check if the file is available to be deleted.
+/// @param completionHandler A completion handler to be called when the delete finishes.
+///
+/// @returns An instance of SDLDeleteFilesOperation
+- (instancetype)initWithFileName:(SDLFileName *)fileName connectionManager:(id<SDLConnectionManagerType>)connectionManager remoteFileNames:(NSSet<SDLFileName *> *)remoteFileNames completionHandler:(SDLFileManagerDeleteCompletionHandler)completionHandler;
+
+
+/// The name of the file to be deleted on the remote system.
+@property (copy, nonatomic, readonly) SDLFileName *fileName;
+
+/// The files currently on the remote file system. Used to check if the file is available to be deleted.
+@property (nonatomic, strong) NSSet<SDLFileName *> *remoteFileNames;
+
+/// The connection manager which will handle transporting the request to the remote system.
@property (weak, nonatomic, readonly) id<SDLConnectionManagerType> connectionManager;
-/**
- A completion handler to be called when the delete finishes.
- */
+/// A completion handler to be called when the delete finishes.
@property (copy, nonatomic, nullable, readonly) SDLFileManagerDeleteCompletionHandler completionHandler;
@end
diff --git a/SmartDeviceLink/private/SDLDeleteFileOperation.m b/SmartDeviceLink/private/SDLDeleteFileOperation.m
index e7ce7e204..e170837f7 100644
--- a/SmartDeviceLink/private/SDLDeleteFileOperation.m
+++ b/SmartDeviceLink/private/SDLDeleteFileOperation.m
@@ -11,6 +11,8 @@
#import "SDLConnectionManagerType.h"
#import "SDLDeleteFile.h"
#import "SDLDeleteFileResponse.h"
+#import "SDLError.h"
+#import "SDLLogMacros.h"
NS_ASSUME_NONNULL_BEGIN
@@ -25,14 +27,18 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLDeleteFileOperation
-- (instancetype)initWithFileName:(NSString *)fileName connectionManager:(id<SDLConnectionManagerType>)connectionManager completionHandler:(nullable SDLFileManagerDeleteCompletionHandler)completionHandler {
+- (instancetype)initWithFileName:(SDLFileName *)fileName connectionManager:(id<SDLConnectionManagerType>)connectionManager remoteFileNames:(NSSet<SDLFileName *> *)remoteFileNames completionHandler:(SDLFileManagerDeleteCompletionHandler)completionHandler {
self = [super init];
if (!self) {
+ if (completionHandler != nil) {
+ completionHandler(NO, NSNotFound, [NSError sdl_failedToCreateObjectOfClass:[SDLDeleteFileOperation class]]);
+ }
return nil;
}
_fileName = fileName;
_connectionManager = connectionManager;
+ _remoteFileNames = remoteFileNames;
_completionHandler = completionHandler;
return self;
@@ -42,6 +48,12 @@ NS_ASSUME_NONNULL_BEGIN
[super start];
if (self.isCancelled) { return; }
+ if (![self.remoteFileNames containsObject:self.fileName]) {
+ SDLLogW(@"File to delete is no longer on the head unit, aborting operation");
+ self.completionHandler(NO, NSNotFound, [NSError sdl_fileManager_fileDoesNotExistError]);
+ return [self finishOperation];
+ }
+
[self sdl_deleteFile];
}
@@ -50,18 +62,17 @@ NS_ASSUME_NONNULL_BEGIN
typeof(self) weakself = self;
[self.connectionManager sendConnectionManagerRequest:deleteFile withResponseHandler:^(__kindof SDLRPCRequest *request, __kindof SDLRPCResponse *response, NSError *error) {
- // Pull out the parameters
SDLDeleteFileResponse *deleteFileResponse = (SDLDeleteFileResponse *)response;
BOOL success = [deleteFileResponse.success boolValue];
- // If spaceAvailable is nil, set it to the max value
- NSUInteger bytesAvailable = deleteFileResponse.spaceAvailable != nil ? deleteFileResponse.spaceAvailable.unsignedIntegerValue : 2000000000;
-
- // Callback
- if (weakself.completionHandler != nil) {
- weakself.completionHandler(success, bytesAvailable, error);
+ if (error != nil) {
+ SDLLogE(@"Error deleting file: %@", error);
}
+ // If spaceAvailable is nil, set it to the max value
+ NSUInteger bytesAvailable = (deleteFileResponse.spaceAvailable != nil) ? deleteFileResponse.spaceAvailable.unsignedIntegerValue : 2000000000;
+
+ weakself.completionHandler(success, bytesAvailable, error);
[weakself finishOperation];
}];
}
@@ -74,7 +85,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (NSOperationQueuePriority)queuePriority {
- return NSOperationQueuePriorityVeryHigh;
+ return NSOperationQueuePriorityNormal;
}
@end
diff --git a/SmartDeviceLink/private/SDLDynamicMenuUpdateAlgorithm.h b/SmartDeviceLink/private/SDLDynamicMenuUpdateAlgorithm.h
index 64d7d2585..a07a8c1de 100644
--- a/SmartDeviceLink/private/SDLDynamicMenuUpdateAlgorithm.h
+++ b/SmartDeviceLink/private/SDLDynamicMenuUpdateAlgorithm.h
@@ -10,9 +10,24 @@
@class SDLDynamicMenuUpdateRunScore;
@class SDLMenuCell;
+@class SDLWindowCapability;
NS_ASSUME_NONNULL_BEGIN
+/// Menu cell state
+///
+/// Cell state that tells the menu manager what it should do with a given SDLMenuCell
+typedef NS_ENUM(NSUInteger, SDLMenuCellUpdateState) {
+ /// Marks the cell to be deleted
+ SDLMenuCellUpdateStateDelete = 0,
+
+ /// Marks the cell to be added
+ SDLMenuCellUpdateStateAdd,
+
+ /// Marks the cell to be kept
+ SDLMenuCellUpdateStateKeep
+};
+
@interface SDLDynamicMenuUpdateAlgorithm : NSObject
/**
@@ -21,7 +36,9 @@ NS_ASSUME_NONNULL_BEGIN
@param oldMenuCells The old menu array
@param updatedMenuCells The new menu array
*/
-+ (nullable SDLDynamicMenuUpdateRunScore *)compareOldMenuCells:(NSArray<SDLMenuCell *> *)oldMenuCells updatedMenuCells:(NSArray<SDLMenuCell *> *)updatedMenuCells;
++ (SDLDynamicMenuUpdateRunScore *)dynamicRunScoreOldMenuCells:(NSArray<SDLMenuCell *> *)oldMenuCells updatedMenuCells:(NSArray<SDLMenuCell *> *)updatedMenuCells;
+
++ (SDLDynamicMenuUpdateRunScore *)compatibilityRunScoreWithOldMenuCells:(NSArray<SDLMenuCell *> *)oldMenuCells updatedMenuCells:(NSArray<SDLMenuCell *> *)updatedMenuCells;
@end
diff --git a/SmartDeviceLink/private/SDLDynamicMenuUpdateAlgorithm.m b/SmartDeviceLink/private/SDLDynamicMenuUpdateAlgorithm.m
index 51bfd14e2..3ddaa42ac 100644
--- a/SmartDeviceLink/private/SDLDynamicMenuUpdateAlgorithm.m
+++ b/SmartDeviceLink/private/SDLDynamicMenuUpdateAlgorithm.m
@@ -10,40 +10,56 @@
#import "SDLDynamicMenuUpdateRunScore.h"
#import "SDLMenuCell.h"
#import "SDLLogMacros.h"
-#import "SDLMenuManagerConstants.h"
+#import "SDLWindowCapability.h"
NS_ASSUME_NONNULL_BEGIN
+@interface SDLMenuCell ()
+
+- (BOOL)sdl_isEqualToCellWithUniqueTitle:(SDLMenuCell *)cell;
+
+@end
+
@implementation SDLDynamicMenuUpdateAlgorithm
-#pragma mark - Update Menu Cells
-+ (nullable SDLDynamicMenuUpdateRunScore *)compareOldMenuCells:(NSArray<SDLMenuCell *> *)oldMenuCells updatedMenuCells:(NSArray<SDLMenuCell *> *)updatedMenuCells{
+#pragma mark Compatibility Menu Run Score
+
++ (SDLDynamicMenuUpdateRunScore *)compatibilityRunScoreWithOldMenuCells:(NSArray<SDLMenuCell *> *)oldMenuCells updatedMenuCells:(NSArray<SDLMenuCell *> *)updatedMenuCells {
+ return [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:[self sdl_buildAllDeleteStatusesForMenu:oldMenuCells] updatedStatus:[self sdl_buildAllAddStatusesForMenu:updatedMenuCells] score:updatedMenuCells.count];
+}
+
+#pragma mark - Dynamic Menu Run Score
+
++ (SDLDynamicMenuUpdateRunScore *)dynamicRunScoreOldMenuCells:(NSArray<SDLMenuCell *> *)oldMenuCells updatedMenuCells:(NSArray<SDLMenuCell *> *)updatedMenuCells {
if (oldMenuCells.count > 0 && updatedMenuCells.count == 0) {
- return [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:[SDLDynamicMenuUpdateAlgorithm sdl_buildAllDeleteStatusesforMenu:oldMenuCells] updatedStatus:@[] score:0];
+ // Deleting all cells
+ return [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:[SDLDynamicMenuUpdateAlgorithm sdl_buildAllDeleteStatusesForMenu:oldMenuCells] updatedStatus:@[] score:0];
}else if (oldMenuCells.count == 0 && updatedMenuCells.count > 0) {
+ // No cells to delete
return [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:@[] updatedStatus:[SDLDynamicMenuUpdateAlgorithm sdl_buildAllAddStatusesForMenu:updatedMenuCells] score:updatedMenuCells.count];
} else if (oldMenuCells.count == 0 && updatedMenuCells.count == 0) {
- return nil;
+ // Empty menu to empty menu
+ return [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:@[] updatedStatus:@[] score:0];
}
return [SDLDynamicMenuUpdateAlgorithm sdl_startCompareAtRun:0 oldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
}
-+ (nullable SDLDynamicMenuUpdateRunScore *)sdl_startCompareAtRun:(NSUInteger)startRun oldMenuCells:(NSArray<SDLMenuCell *> *)oldMenuCells updatedMenuCells:(NSArray<SDLMenuCell *> *)updatedMenuCells {
- SDLDynamicMenuUpdateRunScore *bestScore = nil;
++ (SDLDynamicMenuUpdateRunScore *)sdl_startCompareAtRun:(NSUInteger)startRun oldMenuCells:(NSArray<SDLMenuCell *> *)oldMenuCells updatedMenuCells:(NSArray<SDLMenuCell *> *)updatedMenuCells {
+ SDLDynamicMenuUpdateRunScore *bestScore = [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:@[] updatedStatus:@[] score:0];
for (NSUInteger run = startRun; run < oldMenuCells.count; run++) {
// Set the menu status as a 1-1 array, start off will oldMenus = all Deletes, newMenu = all Adds
- NSMutableArray<NSNumber *> *oldMenuStatus = [SDLDynamicMenuUpdateAlgorithm sdl_buildAllDeleteStatusesforMenu:oldMenuCells];
+ NSMutableArray<NSNumber *> *oldMenuStatus = [SDLDynamicMenuUpdateAlgorithm sdl_buildAllDeleteStatusesForMenu:oldMenuCells];
NSMutableArray<NSNumber *> *newMenuStatus = [SDLDynamicMenuUpdateAlgorithm sdl_buildAllAddStatusesForMenu:updatedMenuCells];
NSUInteger startIndex = 0;
for (NSUInteger oldCellIndex = run; oldCellIndex < oldMenuCells.count; oldCellIndex++) { //For each old item
// Create inner loop to compare old cells to new cells to find a match, if a match if found we mark the index at match for both the old and the new status to keep since we do not want to send RPCs for those cases
for (NSUInteger newCellIndex = startIndex; newCellIndex < updatedMenuCells.count; newCellIndex++) {
- if ([oldMenuCells[oldCellIndex] isEqual:updatedMenuCells[newCellIndex]]) {
- oldMenuStatus[oldCellIndex] = @(MenuCellStateKeep);
- newMenuStatus[newCellIndex] = @(MenuCellStateKeep);
+ if ([oldMenuCells[oldCellIndex] sdl_isEqualToCellWithUniqueTitle:updatedMenuCells[newCellIndex]]) {
+ oldMenuStatus[oldCellIndex] = @(SDLMenuCellUpdateStateKeep);
+ newMenuStatus[newCellIndex] = @(SDLMenuCellUpdateStateKeep);
startIndex = newCellIndex + 1;
break;
}
@@ -54,18 +70,17 @@ NS_ASSUME_NONNULL_BEGIN
NSUInteger numberOfAdds = 0;
for (NSUInteger status = 0; status < newMenuStatus.count; status++) {
// 0 = Delete 1 = Add 2 = Keep
- if (newMenuStatus[status].integerValue == MenuCellStateAdd) {
+ if (newMenuStatus[status].integerValue == SDLMenuCellUpdateStateAdd) {
numberOfAdds++;
}
}
// As soon as we a run that requires 0 Adds we will use it since we cant do better then 0
if (numberOfAdds == 0) {
- bestScore = [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds];
- return bestScore;
+ return [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds];
}
- // if we havent create the bestScore object or if the current score beats the old score then we will create a new bestScore
- if (bestScore == nil || numberOfAdds < bestScore.score) {
+ // if we haven't create the bestScore object or if the current score beats the old score then we will create a new bestScore
+ if (bestScore.isEmpty || numberOfAdds < bestScore.score) {
bestScore = [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds];
}
}
@@ -78,12 +93,12 @@ NS_ASSUME_NONNULL_BEGIN
@param oldMenu The old menu array
*/
-+ (NSMutableArray<NSNumber *> *)sdl_buildAllDeleteStatusesforMenu:(NSArray<SDLMenuCell *> *)oldMenu {
- NSMutableArray<NSNumber *> *oldMenuStatus = [[NSMutableArray alloc] init];
++ (NSMutableArray<NSNumber *> *)sdl_buildAllDeleteStatusesForMenu:(NSArray<SDLMenuCell *> *)oldMenu {
+ NSMutableArray<NSNumber *> *oldMenuStatus = [[NSMutableArray alloc] initWithCapacity:oldMenu.count];
for (NSUInteger index = 0; index < oldMenu.count; index++) {
- [oldMenuStatus addObject:@(MenuCellStateDelete)];
+ [oldMenuStatus addObject:@(SDLMenuCellUpdateStateDelete)];
}
- return [oldMenuStatus mutableCopy];
+ return oldMenuStatus;
}
/**
@@ -92,11 +107,11 @@ NS_ASSUME_NONNULL_BEGIN
@param newMenu The new menu array
*/
+ (NSMutableArray<NSNumber *> *)sdl_buildAllAddStatusesForMenu:(NSArray<SDLMenuCell *> *)newMenu {
- NSMutableArray<NSNumber *> *newMenuStatus = [[NSMutableArray alloc] init];
+ NSMutableArray<NSNumber *> *newMenuStatus = [[NSMutableArray alloc] initWithCapacity:newMenu.count];
for (NSUInteger index = 0; index < newMenu.count; index++) {
- [newMenuStatus addObject:@(MenuCellStateAdd)];
+ [newMenuStatus addObject:@(SDLMenuCellUpdateStateAdd)];
}
- return [newMenuStatus mutableCopy];
+ return newMenuStatus;
}
@end
diff --git a/SmartDeviceLink/private/SDLDynamicMenuUpdateRunScore.h b/SmartDeviceLink/private/SDLDynamicMenuUpdateRunScore.h
index 12f251970..5ec70a6d8 100644
--- a/SmartDeviceLink/private/SDLDynamicMenuUpdateRunScore.h
+++ b/SmartDeviceLink/private/SDLDynamicMenuUpdateRunScore.h
@@ -13,12 +13,12 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLDynamicMenuUpdateRunScore : NSObject
/**
- Will contain all the Deletes and Keeps
+ Will contain all the Deletes and Keeps. Contains SDLMenuState.
*/
@property (copy, nonatomic, readonly) NSArray<NSNumber *> *oldStatus;
/**
- Will contain all the Adds and Keeps
+ Will contain all the Adds and Keeps. Contains SDLMenuState.
*/
@property (copy, nonatomic, readonly) NSArray<NSNumber *> *updatedStatus;
@@ -27,6 +27,9 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (assign, nonatomic, readonly) NSUInteger score;
+/// Contains no old score, new score, or score
+@property (assign, nonatomic, readonly) BOOL isEmpty;
+
- (instancetype)initWithOldStatus:(NSArray<NSNumber *> *)oldStatus updatedStatus:(NSArray<NSNumber *> *)updatedStatus score:(NSUInteger)score;
@end
diff --git a/SmartDeviceLink/private/SDLDynamicMenuUpdateRunScore.m b/SmartDeviceLink/private/SDLDynamicMenuUpdateRunScore.m
index 5066904a5..c5f8b8608 100644
--- a/SmartDeviceLink/private/SDLDynamicMenuUpdateRunScore.m
+++ b/SmartDeviceLink/private/SDLDynamicMenuUpdateRunScore.m
@@ -8,6 +8,8 @@
#import "SDLDynamicMenuUpdateRunScore.h"
+#import "SDLDynamicMenuUpdateAlgorithm.h"
+
NS_ASSUME_NONNULL_BEGIN
@implementation SDLDynamicMenuUpdateRunScore
@@ -23,6 +25,29 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
+- (NSString *)description {
+ return [NSString stringWithFormat:@"Run Score: %ld, old status: %@, updated status: %@", (long)self.score, [self sdl_stringArrayForCellUpdateStatuses:self.oldStatus], [self sdl_stringArrayForCellUpdateStatuses:self.updatedStatus]];
+}
+
+- (NSArray<NSString *> *)sdl_stringArrayForCellUpdateStatuses:(NSArray<NSNumber *> *)statuses {
+ NSMutableArray<NSString *> *mutableStringArray = [NSMutableArray arrayWithCapacity:statuses.count];
+ for (NSNumber *status in statuses) {
+ if (status.unsignedIntegerValue == SDLMenuCellUpdateStateDelete) {
+ [mutableStringArray addObject:@"DELETE"];
+ } else if (status.unsignedIntegerValue == SDLMenuCellUpdateStateAdd) {
+ [mutableStringArray addObject:@"ADD"];
+ } else if (status.unsignedIntegerValue == SDLMenuCellUpdateStateKeep) {
+ [mutableStringArray addObject:@"KEEP"];
+ }
+ }
+
+ return [mutableStringArray copy];
+}
+
+- (BOOL)isEmpty {
+ return (self.oldStatus.count == 0 && self.updatedStatus.count == 0 && self.score == 0);
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLError.h b/SmartDeviceLink/private/SDLError.h
index f802e651b..72453b06f 100644
--- a/SmartDeviceLink/private/SDLError.h
+++ b/SmartDeviceLink/private/SDLError.h
@@ -8,14 +8,20 @@
#import <Foundation/Foundation.h>
+#import "SDLChoiceCell.h"
#import "SDLErrorConstants.h"
#import "SDLResult.h"
+@class SDLMenuCell;
+@class SDLMenuConfiguration;
+
NS_ASSUME_NONNULL_BEGIN
@interface NSError (SDLErrors)
++ (NSError *)sdl_failedToCreateObjectOfClass:(Class)objectClass;
+
#pragma mark SDLEncryptionLifecycleManager
+ (NSError *)sdl_encryption_lifecycle_notReadyError;
+ (NSError *)sdl_encryption_lifecycle_encryption_off;
@@ -52,19 +58,29 @@ NS_ASSUME_NONNULL_BEGIN
+ (NSError *)sdl_softButtonManager_pendingUpdateSuperseded;
+ (NSError *)sdl_subscribeButtonManager_notSubscribed;
+ (NSError *)sdl_textAndGraphicManager_pendingUpdateSuperseded;
++ (NSError *)sdl_textAndGraphicManager_batchingUpdate;
++ (NSError *)sdl_textAndGraphicManager_nothingToUpdate;
#pragma mark Menu Manager
++ (NSError *)sdl_menuManager_configurationOperationLayoutsNotSupported;
++ (NSError *)sdl_menuManager_configurationOperationFailed:(SDLMenuConfiguration *)failedConfiguration;
++ (NSError *)sdl_menuManager_openMenuOperationCancelled;
++ (NSError *)sdl_menuManager_openMenuOperationFailed:(nullable SDLMenuCell *)menuCell;
++ (NSError *)sdl_menuManager_replaceOperationCancelled;
+ (NSError *)sdl_menuManager_failedToUpdateWithDictionary:(NSDictionary *)userInfo;
+
+ (NSError *)sdl_voiceCommandManager_pendingUpdateSuperseded;
#pragma mark Choice Set Manager
-+ (NSError *)sdl_choiceSetManager_choicesDeletedBeforePresentation:(NSDictionary *)userInfo;
++ (NSError *)sdl_choiceSetManager_choicesNotAvailableForPresentation:(NSSet<SDLChoiceCell *> *)neededCells availableCells:(NSSet<SDLChoiceCell *> *)availableCells;
+ (NSError *)sdl_choiceSetManager_choiceDeletionFailed:(NSDictionary *)userInfo;
+ (NSError *)sdl_choiceSetManager_choiceUploadFailed:(NSDictionary *)userInfo;
+ (NSError *)sdl_choiceSetManager_failedToCreateMenuItems;
+ (NSError *)sdl_choiceSetManager_incorrectState:(NSString *)state;
++ (NSError *)sdl_choiceSetManager_cancelled;
++ (NSError *)sdl_choiceSetManager_noIdsAvailable;
#pragma mark Alert Manager
@@ -77,6 +93,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (NSError *)sdl_systemCapabilityManager_moduleDoesNotSupportSystemCapabilities;
+ (NSError *)sdl_systemCapabilityManager_cannotUpdateInHMINONE;
+ (NSError *)sdl_systemCapabilityManager_cannotUpdateTypeDISPLAYS;
++ (NSError *)sdl_systemCapabilityManager_unknownSystemCapabilityType;
#pragma mark Transport
diff --git a/SmartDeviceLink/private/SDLError.m b/SmartDeviceLink/private/SDLError.m
index 86b1815aa..6a72f296a 100644
--- a/SmartDeviceLink/private/SDLError.m
+++ b/SmartDeviceLink/private/SDLError.m
@@ -9,11 +9,20 @@
#import "SDLError.h"
#import "SDLChoiceSetManager.h"
+#import "SDLMenuConfiguration.h"
NS_ASSUME_NONNULL_BEGIN
@implementation NSError (SDLErrors)
++ (NSError *)sdl_failedToCreateObjectOfClass:(Class)objectClass {
+ return [NSError errorWithDomain:SDLErrorDomainSystem code:SDLSystemErrorFailedToCreateObject userInfo:@{
+ NSLocalizedDescriptionKey: [NSString stringWithFormat: @"iOS system failed to create a new object of class: %@", objectClass],
+ NSLocalizedFailureReasonErrorKey: @"An unknown error caused iOS to fail to create an object",
+ NSLocalizedRecoverySuggestionErrorKey: @"There is no known way to fix this error"
+ }];
+}
+
#pragma mark - SDLEncryptionLifecycleManager
+ (NSError *)sdl_encryption_lifecycle_notReadyError {
NSDictionary<NSString *, NSString *> *userInfo = @{
@@ -167,7 +176,7 @@ NS_ASSUME_NONNULL_BEGIN
NSDictionary<NSString *, NSString *> *userInfo = @{
NSLocalizedDescriptionKey: @"Cannot overwrite remote file",
NSLocalizedFailureReasonErrorKey: @"The remote file system already has a file of this name, and the file manager is set to not automatically overwrite files",
- NSLocalizedRecoverySuggestionErrorKey: @"Set SDLFileManager autoOverwrite to YES, or call forceUploadFile:completion:"
+ NSLocalizedRecoverySuggestionErrorKey: @"Set file.overwrite to true to overwrite the file"
};
return [NSError errorWithDomain:SDLErrorDomainFileManager code:SDLFileManagerErrorCannotOverwrite userInfo:userInfo];
}
@@ -268,8 +277,72 @@ NS_ASSUME_NONNULL_BEGIN
return [NSError errorWithDomain:SDLErrorDomainSubscribeButtonManager code:SDLSubscribeButtonManagerErrorNotSubscribed userInfo:userInfo];
}
++ (NSError *)sdl_textAndGraphicManager_batchingUpdate {
+ return [NSError errorWithDomain:SDLErrorDomainTextAndGraphicManager code:SDLTextAndGraphicManagerErrorCurrentlyBatching userInfo:@{
+ NSLocalizedDescriptionKey: @"Update will not run because batching is enabled",
+ NSLocalizedFailureReasonErrorKey: @"Text and Graphic manager will not run this update and call this handler because its currently batching updates. The update will occur when batching ends.",
+ NSLocalizedRecoverySuggestionErrorKey: @"This callback shouldn't occur. Please open an issue on https://www.github.com/smartdevicelink/sdl_ios/ if it does"
+ }];
+}
+
++ (NSError *)sdl_textAndGraphicManager_nothingToUpdate {
+ return [NSError errorWithDomain:SDLErrorDomainTextAndGraphicManager code:SDLTextAndGraphicManagerErrorNothingToUpdate userInfo:@{
+ NSLocalizedDescriptionKey: @"Update will not run because there's nothing to update",
+ NSLocalizedFailureReasonErrorKey: @"This callback shouldn't occur, so there's no known reason for this failure.",
+ NSLocalizedRecoverySuggestionErrorKey: @"This callback shouldn't occur. Please open an issue on https://www.github.com/smartdevicelink/sdl_ios/ if it does"
+ }];
+}
+
#pragma mark Menu Manager
++ (NSError *)sdl_menuManager_configurationOperationLayoutsNotSupported {
+ return [NSError errorWithDomain:SDLErrorDomainMenuManager code:SDLMenuManagerErrorConfigurationUpdateLayoutNotSupported userInfo:@{
+ NSLocalizedDescriptionKey: @"Menu Manager - Configuration Update Failed",
+ NSLocalizedFailureReasonErrorKey: @"One or more of the configuration layouts is not supported by the module",
+ NSLocalizedRecoverySuggestionErrorKey: @"Compare SDLManager.systemCapabilityManager.defaultWindowCapability.menuLayoutsAvailable to what you attempted to set"
+ }];
+}
+
++ (NSError *)sdl_menuManager_configurationOperationFailed:(SDLMenuConfiguration *)failedConfiguration {
+ return [NSError errorWithDomain:SDLErrorDomainMenuManager code:SDLMenuManagerErrorConfigurationUpdateFailed userInfo:@{
+ @"Failed Configuration": failedConfiguration,
+ NSLocalizedDescriptionKey: @"Menu Manager - Configuration Update Failed",
+ NSLocalizedFailureReasonErrorKey: @"The configuration may not be supported by the connected head unit",
+ NSLocalizedRecoverySuggestionErrorKey: @"Check SystemCapabilityManager.defaultWindowCapability.menuLayouts to ensure the set configuration is supported"
+ }];
+}
+
++ (NSError *)sdl_menuManager_openMenuOperationCancelled {
+ return [NSError errorWithDomain:SDLErrorDomainMenuManager code:SDLMenuManagerErrorOperationCancelled userInfo:@{
+ NSLocalizedDescriptionKey: @"Menu Manager - Open Menu Cancelled",
+ NSLocalizedFailureReasonErrorKey: @"The menu manager was probably stopped or opening another menu item was requested.",
+ NSLocalizedRecoverySuggestionErrorKey: @"This error probably does not need recovery."
+ }];
+}
+
++ (NSError *)sdl_menuManager_openMenuOperationFailed:(nullable SDLMenuCell *)menuCell {
+ NSString *failureReason = nil;
+ if (menuCell != nil) {
+ failureReason = @"Something went wrong attempting to open the menu.";
+ } else {
+ failureReason = [NSString stringWithFormat:@"Something went wrong attempting to open the menu to the given subcell: %@", menuCell];
+ }
+
+ return [NSError errorWithDomain:SDLErrorDomainMenuManager code:SDLMenuManagerErrorOpenMenuFailed userInfo:@{
+ NSLocalizedDescriptionKey: @"Menu Manager - Open Menu Failed",
+ NSLocalizedFailureReasonErrorKey: failureReason,
+ NSLocalizedRecoverySuggestionErrorKey: @"Check the error logs for more information on the RPC failure."
+ }];
+}
+
++ (NSError *)sdl_menuManager_replaceOperationCancelled {
+ return [NSError errorWithDomain:SDLErrorDomainMenuManager code:SDLMenuManagerErrorOperationCancelled userInfo:@{
+ NSLocalizedDescriptionKey: @"Menu Manager - Menu Replace Cancelled",
+ NSLocalizedFailureReasonErrorKey: @"The menu manager was probably stopped or another menu update was requested.",
+ NSLocalizedRecoverySuggestionErrorKey: @"This error probably does not need recovery."
+ }];
+}
+
+ (NSError *)sdl_menuManager_failedToUpdateWithDictionary:(NSDictionary *)userInfo {
return [NSError errorWithDomain:SDLErrorDomainMenuManager code:SDLMenuManagerErrorRPCsFailed userInfo:userInfo];
}
@@ -283,8 +356,15 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark Choice Set Manager
-+ (NSError *)sdl_choiceSetManager_choicesDeletedBeforePresentation:(NSDictionary *)userInfo {
- return [NSError errorWithDomain:SDLErrorDomainChoiceSetManager code:SDLChoiceSetManagerErrorPendingPresentationDeleted userInfo:userInfo];
++ (NSError *)sdl_choiceSetManager_choicesNotAvailableForPresentation:(NSSet<SDLChoiceCell *> *)neededCells availableCells:(NSSet<SDLChoiceCell *> *)availableCells {
+
+ return [NSError errorWithDomain:SDLErrorDomainChoiceSetManager code:SDLChoiceSetManagerErrorNeededChoicesUnavailable userInfo:@{
+ NSLocalizedDescriptionKey: @"Choice Set Manager error",
+ NSLocalizedFailureReasonErrorKey: @"Not all needed choices for presentation are available on the head unit. See key 'neededChoices' and 'availableChoices'",
+ NSLocalizedRecoverySuggestionErrorKey: @"Choices may have been deleted or were not all properly uploaded for presentation. You can attempt the presentation again to retry the upload.",
+ @"neededChoices": neededCells.description,
+ @"availableChoices": availableCells.description
+ }];
}
+ (NSError *)sdl_choiceSetManager_choiceDeletionFailed:(NSDictionary *)userInfo {
@@ -314,6 +394,22 @@ NS_ASSUME_NONNULL_BEGIN
return [NSError errorWithDomain:SDLErrorDomainChoiceSetManager code:SDLChoiceSetManagerErrorInvalidState userInfo:userInfo];
}
++ (NSError *)sdl_choiceSetManager_cancelled {
+ return [NSError errorWithDomain:SDLErrorDomainChoiceSetManager code:SDLChoiceSetManagerErrorCancelled userInfo:@{
+ NSLocalizedDescriptionKey: @"Choice set operation error cancelled",
+ NSLocalizedFailureReasonErrorKey: @"The choice operation was cancelled and may or may not have completed",
+ NSLocalizedRecoverySuggestionErrorKey: @"It may have been cancelled due to shutdown, or it may have been cancelled by the developer"
+ }];
+}
+
++ (NSError *)sdl_choiceSetManager_noIdsAvailable {
+ return [NSError errorWithDomain:SDLErrorDomainChoiceSetManager code:SDLChoiceSetManagerErrorNoIdsAvailable userInfo:@{
+ NSLocalizedDescriptionKey: @"Choice set operation failed because the maximum number of choices have been uploaded (65535)",
+ NSLocalizedFailureReasonErrorKey: @"65535 unique choices have been uploaded to the head unit in this session and no more are allowed",
+ NSLocalizedRecoverySuggestionErrorKey: @"Re-use or delete choices to free up space"
+ }];
+}
+
#pragma mark Alert Manager
+ (NSError *)sdl_alertManager_presentationFailedWithError:(NSError *)error tryAgainTime:(int)tryAgainTime {
@@ -374,6 +470,14 @@ NS_ASSUME_NONNULL_BEGIN
return [NSError errorWithDomain:SDLErrorDomainSystemCapabilityManager code:SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays userInfo:userInfo];
}
++ (NSError *)sdl_systemCapabilityManager_unknownSystemCapabilityType {
+ return [NSError errorWithDomain:SDLErrorDomainSystemCapabilityManager code:SDLSystemCapabilityManagerErrorUnknownType userInfo:@{
+ NSLocalizedDescriptionKey: @"An unknown system capability type was received.",
+ NSLocalizedFailureReasonErrorKey: @"Failure reason unknown. If you see this, please open an issue on https://www.github.com/smartdevicelink/sdl_ios/",
+ NSLocalizedRecoverySuggestionErrorKey: @"Ensure you are only attempting to manually subscribe to known system capability types for the version of this library. You may also want to update this library to its latest version."
+ }];
+}
+
#pragma mark Transport
+ (NSError *)sdl_transport_unknownError {
diff --git a/SmartDeviceLink/private/SDLFileWrapper.m b/SmartDeviceLink/private/SDLFileWrapper.m
index fac2b6580..c6500171d 100644
--- a/SmartDeviceLink/private/SDLFileWrapper.m
+++ b/SmartDeviceLink/private/SDLFileWrapper.m
@@ -8,6 +8,7 @@
#import "SDLFileWrapper.h"
+#import "SDLError.h"
#import "SDLFile.h"
@@ -18,6 +19,7 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithFile:(SDLFile *)file completionHandler:(SDLFileManagerUploadCompletionHandler)completionHandler {
self = [super init];
if (!self) {
+ completionHandler(NO, NSNotFound, [NSError sdl_failedToCreateObjectOfClass:[SDLFileWrapper class]]);
return nil;
}
@@ -33,4 +35,4 @@ NS_ASSUME_NONNULL_BEGIN
@end
-NS_ASSUME_NONNULL_END \ No newline at end of file
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLGlobals.m b/SmartDeviceLink/private/SDLGlobals.m
index c9a36c6c2..d6399d68e 100644
--- a/SmartDeviceLink/private/SDLGlobals.m
+++ b/SmartDeviceLink/private/SDLGlobals.m
@@ -15,8 +15,8 @@
NS_ASSUME_NONNULL_BEGIN
// VERSION DEPENDENT CODE
-NSString *const SDLMaxProxyProtocolVersion = @"5.4.0";
-NSString *const SDLMaxProxyRPCVersion = @"7.1.0";
+NSString *const SDLMaxProxyProtocolVersion = @"5.4.1";
+NSString *const SDLMaxProxyRPCVersion = @"8.0.0";
NSUInteger const SDLDefaultMTUSize = UINT32_MAX;
NSUInteger const SDLV1MTUSize = 1024;
diff --git a/SmartDeviceLink/private/SDLIAPDataSession.m b/SmartDeviceLink/private/SDLIAPDataSession.m
index 8c6cc84e8..06d2e1f1d 100644
--- a/SmartDeviceLink/private/SDLIAPDataSession.m
+++ b/SmartDeviceLink/private/SDLIAPDataSession.m
@@ -60,7 +60,7 @@ NS_ASSUME_NONNULL_BEGIN
[self.sendDataQueue popBuffer];
} else {
// Cleave the sent bytes from the data, the remainder will sit at the head of the queue
- SDLLogD(@"SDLIAPDataSession writeDataToSessionStream bytes written %ld", (long)bytesWritten);
+ SDLLogV(@"SDLIAPDataSession writeDataToSessionStream bytes written %ld", (long)bytesWritten);
[remainder replaceBytesInRange:NSMakeRange(0, (NSUInteger)bytesWritten) withBytes:NULL length:0];
}
} else {
@@ -69,7 +69,7 @@ NS_ASSUME_NONNULL_BEGIN
}
}];
} else {
- SDLLogD(@"No more data to write to data session's output stream for IAPSession %@", self.iapSession);
+ SDLLogV(@"No more data to write to data session's output stream for IAPSession %@", self.iapSession);
return;
}
}
diff --git a/SmartDeviceLink/private/SDLLifecycleManager.m b/SmartDeviceLink/private/SDLLifecycleManager.m
index 0e23d1cc5..826a91dff 100644
--- a/SmartDeviceLink/private/SDLLifecycleManager.m
+++ b/SmartDeviceLink/private/SDLLifecycleManager.m
@@ -681,8 +681,7 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
- (void)sendRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
if (requests.count == 0) {
- completionHandler(YES);
- return;
+ return completionHandler(YES);
}
SDLAsynchronousRPCRequestOperation *op = [[SDLAsynchronousRPCRequestOperation alloc] initWithConnectionManager:self requests:requests progressHandler:progressHandler completionHandler:completionHandler];
diff --git a/SmartDeviceLink/private/SDLListFilesOperation.m b/SmartDeviceLink/private/SDLListFilesOperation.m
index 693d52eea..2eb3102b0 100644
--- a/SmartDeviceLink/private/SDLListFilesOperation.m
+++ b/SmartDeviceLink/private/SDLListFilesOperation.m
@@ -9,6 +9,7 @@
#import "SDLListFilesOperation.h"
#import "SDLConnectionManagerType.h"
+#import "SDLError.h"
#import "SDLListFiles.h"
#import "SDLListFilesResponse.h"
@@ -29,6 +30,9 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager completionHandler:(nullable SDLFileManagerListFilesCompletionHandler)completionHandler {
self = [super init];
if (!self) {
+ if (completionHandler != nil) {
+ completionHandler(NO, NSNotFound, @[], [NSError sdl_failedToCreateObjectOfClass:[SDLListFilesOperation class]]);
+ }
return nil;
}
diff --git a/SmartDeviceLink/private/SDLLogFileModuleMap.m b/SmartDeviceLink/private/SDLLogFileModuleMap.m
index 385ef836d..d8da4cdb2 100644
--- a/SmartDeviceLink/private/SDLLogFileModuleMap.m
+++ b/SmartDeviceLink/private/SDLLogFileModuleMap.m
@@ -135,11 +135,11 @@
}
+ (SDLLogFileModule *)sdl_screenManagerMenuModule {
- return [SDLLogFileModule moduleWithName:@"Screen/Menu" files:[NSSet setWithArray:@[@"SDLMenuManager", @"SDLVoiceCommandManager", @"SDLVoiceCommandUpdateOperation"]]];
+ return [SDLLogFileModule moduleWithName:@"Screen/Menu" files:[NSSet setWithArray:@[@"SDLMenuManager", @"SDLMenuReplaceOperation", @"SDLMenuShowOperation", @"SDLMenuConfigurationUpdateOperation", @"SDLVoiceCommandManager", @"SDLVoiceCommandUpdateOperation"]]];
}
+ (SDLLogFileModule *)sdl_screenManagerChoiceSetModule {
- return [SDLLogFileModule moduleWithName:@"Screen/ChoiceSet" files:[NSSet setWithArray:@[@"SDLChoiceSetManager", @"SDLCheckChoiceVROptionalOperation", @"SDLDeleteChoicesOperation", @"SDLPreloadChoicesOperation", @"SDLPresentChoiceSetOperation", @"SDLPresentKeyboardOperation", @"SDLChoiceSet"]]];
+ return [SDLLogFileModule moduleWithName:@"Screen/ChoiceSet" files:[NSSet setWithArray:@[@"SDLChoiceSetManager", @"SDLCheckChoiceVROptionalOperation", @"SDLDeleteChoicesOperation", @"SDLPreloadPresentChoicesOperation", @"SDLPresentKeyboardOperation", @"SDLChoiceSet"]]];
}
diff --git a/SmartDeviceLink/private/SDLMenuConfigurationUpdateOperation.h b/SmartDeviceLink/private/SDLMenuConfigurationUpdateOperation.h
new file mode 100644
index 000000000..9482ccfe1
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMenuConfigurationUpdateOperation.h
@@ -0,0 +1,26 @@
+//
+// SDLMenuConfigurationUpdateOperation.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 1/21/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLAsynchronousOperation.h"
+
+#import "SDLConnectionManagerType.h"
+#import "SDLMenuConfiguration.h"
+#import "SDLMenuReplaceUtilities.h"
+#import "SDLWindowCapability.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^SDLMenuConfigurationUpdatedBlock)(SDLMenuConfiguration *_Nullable newMenuConfiguration, NSError *_Nullable error);
+
+@interface SDLMenuConfigurationUpdateOperation : SDLAsynchronousOperation
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager windowCapability:(SDLWindowCapability *)windowCapability newMenuConfiguration:(SDLMenuConfiguration *)newConfiguration configurationUpdatedHandler:(SDLMenuConfigurationUpdatedBlock)configurationUpdatedBlock;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLMenuConfigurationUpdateOperation.m b/SmartDeviceLink/private/SDLMenuConfigurationUpdateOperation.m
new file mode 100644
index 000000000..94d642f78
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMenuConfigurationUpdateOperation.m
@@ -0,0 +1,99 @@
+//
+// SDLMenuConfigurationUpdateOperation.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 1/21/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLMenuConfigurationUpdateOperation.h"
+
+#import "SDLError.h"
+#import "SDLGlobals.h"
+#import "SDLLogMacros.h"
+#import "SDLSetGlobalProperties.h"
+#import "SDLVersion.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLMenuConfigurationUpdateOperation ()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (strong, nonatomic) NSArray<SDLMenuLayout> *availableMenuLayouts;
+@property (strong, nonatomic) SDLMenuConfiguration *updatedMenuConfiguration;
+@property (copy, nonatomic) SDLMenuConfigurationUpdatedBlock menuConfigurationUpdatedBlock;
+
+@property (copy, nonatomic, nullable) NSError *internalError;
+
+@end
+
+@implementation SDLMenuConfigurationUpdateOperation
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager windowCapability:(SDLWindowCapability *)windowCapability newMenuConfiguration:(SDLMenuConfiguration *)newConfiguration configurationUpdatedHandler:(SDLMenuConfigurationUpdatedBlock)configurationUpdatedBlock {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _connectionManager = connectionManager;
+ _availableMenuLayouts = windowCapability.menuLayoutsAvailable;
+ _updatedMenuConfiguration = newConfiguration;
+ _menuConfigurationUpdatedBlock = configurationUpdatedBlock;
+
+ return self;
+}
+
+- (void)start {
+ [super start];
+ if (self.isCancelled) { return; }
+
+ if (self.availableMenuLayouts.count == 0) {
+ SDLLogW(@"Could not set the main menu configuration. Which menu layouts can be used is not available");
+ self.internalError = [NSError sdl_menuManager_configurationOperationLayoutsNotSupported];
+ return [self finishOperation];
+ } else if (![self.availableMenuLayouts containsObject:self.updatedMenuConfiguration.mainMenuLayout]
+ || ![self.availableMenuLayouts containsObject:self.updatedMenuConfiguration.defaultSubmenuLayout]) {
+ SDLLogE(@"One or more of the set menu layouts are not available on this system. The menu configuration will not be set. Available menu layouts: %@, set menu layouts: %@", self.availableMenuLayouts, self.updatedMenuConfiguration);
+ self.internalError = [NSError sdl_menuManager_configurationOperationLayoutsNotSupported];
+ return [self finishOperation];
+ }
+
+ __weak typeof(self) weakself = self;
+ SDLSetGlobalProperties *setGlobalsRPC = [[SDLSetGlobalProperties alloc] init];
+ setGlobalsRPC.menuLayout = self.updatedMenuConfiguration.mainMenuLayout;
+ [self.connectionManager sendConnectionRequest:setGlobalsRPC withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ __strong typeof(weakself) strongself = weakself;
+ if (error != nil) {
+ strongself.internalError = [NSError sdl_menuManager_configurationOperationFailed:strongself.updatedMenuConfiguration];
+ }
+
+ [strongself finishOperation];
+ }];
+}
+
+#pragma mark - Operation Overrides
+
+- (void)finishOperation {
+ SDLLogV(@"Finishing menu manager configuration update operation");
+ if (self.internalError != nil) {
+ self.menuConfigurationUpdatedBlock(nil, self.internalError);
+ } else {
+ self.menuConfigurationUpdatedBlock(self.updatedMenuConfiguration, nil);
+ }
+
+ [super finishOperation];
+}
+
+- (nullable NSString *)name {
+ return @"com.sdl.menuManager.configurationUpdate";
+}
+
+- (NSOperationQueuePriority)queuePriority {
+ return NSOperationQueuePriorityNormal;
+}
+
+- (nullable NSError *)error {
+ return self.internalError;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLMenuManager.h b/SmartDeviceLink/private/SDLMenuManager.h
index a17775131..806e21a4a 100644
--- a/SmartDeviceLink/private/SDLMenuManager.h
+++ b/SmartDeviceLink/private/SDLMenuManager.h
@@ -42,9 +42,7 @@ typedef void(^SDLMenuUpdateCompletionHandler)(NSError *__nullable error);
@property (assign, nonatomic) SDLDynamicMenuUpdatesMode dynamicMenuUpdatesMode;
-- (BOOL)openMenu;
-
-- (BOOL)openSubmenu:(SDLMenuCell *)cell;
+- (BOOL)openMenu:(nullable SDLMenuCell *)cell;
@end
diff --git a/SmartDeviceLink/private/SDLMenuManager.m b/SmartDeviceLink/private/SDLMenuManager.m
index 7f05a2c8c..ae422345f 100644
--- a/SmartDeviceLink/private/SDLMenuManager.m
+++ b/SmartDeviceLink/private/SDLMenuManager.m
@@ -16,6 +16,8 @@
#import "SDLDeleteSubMenu.h"
#import "SDLDisplayCapability.h"
#import "SDLDisplayType.h"
+#import "SDLDynamicMenuUpdateRunScore.h"
+#import "SDLDynamicMenuUpdateAlgorithm.h"
#import "SDLError.h"
#import "SDLFileManager.h"
#import "SDLGlobals.h"
@@ -23,9 +25,11 @@
#import "SDLLogMacros.h"
#import "SDLMenuCell.h"
#import "SDLMenuConfiguration.h"
+#import "SDLMenuConfigurationUpdateOperation.h"
+#import "SDLMenuManagerPrivateConstants.h"
#import "SDLMenuParams.h"
-#import "SDLDynamicMenuUpdateRunScore.h"
-#import "SDLDynamicMenuUpdateAlgorithm.h"
+#import "SDLMenuReplaceOperation.h"
+#import "SDLMenuShowOperation.h"
#import "SDLOnCommand.h"
#import "SDLOnHMIStatus.h"
#import "SDLPredefinedWindows.h"
@@ -68,34 +72,27 @@ NS_ASSUME_NONNULL_BEGIN
@property (weak, nonatomic) SDLFileManager *fileManager;
@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
-@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
-@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
-
-@property (strong, nonatomic, nullable) NSArray<SDLRPCRequest *> *inProgressUpdate;
-@property (assign, nonatomic) BOOL hasQueuedUpdate;
-@property (assign, nonatomic) BOOL waitingOnHMIUpdate;
-@property (copy, nonatomic) NSArray<SDLMenuCell *> *waitingUpdateMenuCells;
+@property (strong, nonatomic) NSOperationQueue *transactionQueue;
@property (strong, nonatomic, nullable) SDLWindowCapability *windowCapability;
-@property (assign, nonatomic) UInt32 lastMenuId;
-@property (copy, nonatomic) NSArray<SDLMenuCell *> *oldMenuCells;
+@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
+@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
+@property (copy, nonatomic) NSArray<SDLMenuCell *> *currentMenuCells;
+@property (strong, nonatomic, nullable) SDLMenuConfiguration *currentMenuConfiguration;
@end
-UInt32 const ParentIdNotFound = UINT32_MAX;
-UInt32 const MenuCellIdMin = 1;
-
@implementation SDLMenuManager
- (instancetype)init {
self = [super init];
if (!self) { return nil; }
- _lastMenuId = MenuCellIdMin;
_menuConfiguration = [[SDLMenuConfiguration alloc] init];
_menuCells = @[];
- _oldMenuCells = @[];
+ _currentMenuCells = @[];
_dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeOnWithCompatibility;
+ _transactionQueue = [self sdl_newTransactionQueue];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusNotification:) name:SDLDidChangeHMIStatusNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_commandNotification:) name:SDLDidReceiveCommandNotification object:nil];
@@ -119,398 +116,164 @@ UInt32 const MenuCellIdMin = 1;
}
- (void)stop {
- _lastMenuId = MenuCellIdMin;
_menuCells = @[];
- _oldMenuCells = @[];
+ _currentMenuCells = @[];
+ _transactionQueue = [self sdl_newTransactionQueue];
_currentHMILevel = nil;
- _currentSystemContext = SDLSystemContextMain;
- _inProgressUpdate = nil;
- _hasQueuedUpdate = NO;
- _waitingOnHMIUpdate = NO;
- _waitingUpdateMenuCells = @[];
+ _currentSystemContext = nil;
+ _currentMenuConfiguration = nil;
+ _windowCapability = nil;
+}
+
+#pragma mark Transaction Queue
+
+- (NSOperationQueue *)sdl_newTransactionQueue {
+ NSOperationQueue *queue = [[NSOperationQueue alloc] init];
+ queue.name = @"SDLMenuManager Transaction Queue";
+ queue.maxConcurrentOperationCount = 1;
+ queue.qualityOfService = NSQualityOfServiceUserInitiated;
+ queue.underlyingQueue = [SDLGlobals sharedGlobals].sdlConcurrentQueue;
+ queue.suspended = YES;
+
+ return queue;
+}
+
+/// Suspend the queue if the HMI level is NONE since we want to delay sending RPCs until we're in non-NONE
+- (void)sdl_updateTransactionQueueSuspended {
+ if ([self.currentHMILevel isEqualToEnum:SDLHMILevelNone] || [self.currentSystemContext isEqualToEnum:SDLSystemContextMenu]) {
+ SDLLogD(@"Suspending the transaction queue. Current HMI level is NONE: %@, current system context is MENU: %@", ([self.currentHMILevel isEqualToEnum:SDLHMILevelNone] ? @"YES" : @"NO"), ([self.currentSystemContext isEqualToEnum:SDLSystemContextMenu] ? @"YES" : @"NO"));
+ self.transactionQueue.suspended = YES;
+ } else {
+ SDLLogD(@"Starting the transaction queue");
+ self.transactionQueue.suspended = NO;
+ }
}
#pragma mark - Setters
- (void)setMenuConfiguration:(SDLMenuConfiguration *)menuConfiguration {
- NSArray<SDLMenuLayout> *layoutsAvailable = self.windowCapability.menuLayoutsAvailable;
-
- if ([[SDLGlobals sharedGlobals].rpcVersion isLessThanVersion:[SDLVersion versionWithMajor:6 minor:0 patch:0]]) {
- SDLLogW(@"Menu configurations is only supported on head units with RPC spec version 6.0.0 or later. Currently connected head unit RPC spec version is %@", [SDLGlobals sharedGlobals].rpcVersion);
- return;
- } else if (layoutsAvailable == nil) {
- SDLLogW(@"Could not set the main menu configuration. Which menu layouts can be used is not available");
- return;
- } else if (![layoutsAvailable containsObject:menuConfiguration.mainMenuLayout]
- || ![layoutsAvailable containsObject:menuConfiguration.defaultSubmenuLayout]) {
- SDLLogE(@"One or more of the set menu layouts are not available on this system. The menu configuration will not be set. Available menu layouts: %@, set menu layouts: %@", layoutsAvailable, menuConfiguration);
+ if ([menuConfiguration isEqual:self.menuConfiguration]) {
+ SDLLogD(@"New menu configuration is equal to existing one, will not set new configuration");
return;
- } else if (self.currentHMILevel == nil
- || [self.currentHMILevel isEqualToEnum:SDLHMILevelNone]) {
- SDLLogE(@"Could not set main menu configuration, HMI level: %@, required: 'Not-NONE', system context: %@, required: 'Not MENU'", self.currentHMILevel, self.currentSystemContext);
+ } else if ([[SDLGlobals sharedGlobals].rpcVersion isLessThanVersion:[SDLVersion versionWithMajor:6 minor:0 patch:0]]) {
+ SDLLogE(@"Setting a menu configuration is not supported on this head unit. Only supported on RPC 6.0+, this version: %@", [SDLGlobals sharedGlobals].rpcVersion);
return;
}
- SDLMenuConfiguration *oldConfig = _menuConfiguration;
_menuConfiguration = menuConfiguration;
- SDLSetGlobalProperties *setGlobalsRPC = [[SDLSetGlobalProperties alloc] init];
- setGlobalsRPC.menuLayout = menuConfiguration.mainMenuLayout;
-
+ // Create the operation
__weak typeof(self) weakself = self;
- [self.connectionManager sendConnectionRequest:setGlobalsRPC withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
- __strong typeof(weakself) strongself = weakself;
+ SDLMenuConfigurationUpdateOperation *configurationUpdateOp = [[SDLMenuConfigurationUpdateOperation alloc] initWithConnectionManager:self.connectionManager windowCapability:self.windowCapability newMenuConfiguration:menuConfiguration configurationUpdatedHandler:^(SDLMenuConfiguration *newMenuConfiguration, NSError *_Nullable error) {
if (error != nil) {
- SDLLogE(@"Could not set main menu configuration: %@", error);
- strongself.menuConfiguration = oldConfig;
+ SDLLogE(@"Error updating menu configuration: %@", error);
return;
+ } else {
+ SDLLogD(@"Successfully updated menu configuration: %@", newMenuConfiguration);
}
+
+ weakself.currentMenuConfiguration = newMenuConfiguration;
+ [weakself sdl_updateMenuReplaceOperationsWithNewMenuConfiguration];
}];
+
+ // Cancel previous menu configuration operations
+ for (NSOperation *operation in self.transactionQueue.operations) {
+ if ([operation isMemberOfClass:[SDLMenuConfigurationUpdateOperation class]]) {
+ [operation cancel];
+ }
+ }
+
+ // Add the new menu configuration operation to the queue
+ [self.transactionQueue addOperation:configurationUpdateOp];
}
- (void)setMenuCells:(NSArray<SDLMenuCell *> *)menuCells {
- NSArray<SDLMenuCell *> *menuCellsCopy = [[NSArray alloc] initWithArray:menuCells copyItems:YES];
- // Check for cell lists with completely duplicate information, or any duplicate voiceCommands and return if it fails (logs are in the called method).
- if (![self sdl_menuCellsAreUnique:menuCellsCopy allVoiceCommands:[NSMutableArray array]]) { return; }
-
- if (self.currentHMILevel == nil
- || [self.currentHMILevel isEqualToEnum:SDLHMILevelNone]
- || [self.currentSystemContext isEqualToEnum:SDLSystemContextMenu]) {
- SDLLogD(@"Waiting for HMI update to send menu cells");
- self.waitingOnHMIUpdate = YES;
- self.waitingUpdateMenuCells = menuCells;
+ if (![self sdl_menuCellsAreUnique:menuCells allVoiceCommands:[NSMutableArray array]]) {
+ SDLLogE(@"Not all set menu cells are unique, but that is required");
return;
}
- self.waitingOnHMIUpdate = NO;
- SDLVersion *menuUniquenessSupportedVersion = [[SDLVersion alloc] initWithMajor:7 minor:1 patch:0];
- if ([[SDLGlobals sharedGlobals].rpcVersion isLessThanVersion:menuUniquenessSupportedVersion]) {
- // If we're on < RPC 7.1, all primary texts need to be unique, so we don't need to check removed properties and duplicate cells
- [self sdl_addUniqueNamesToCellsWithDuplicatePrimaryText:menuCellsCopy];
- } else {
- // On > RPC 7.1, at this point all cells are unique when considering all properties, but we also need to check if any cells will _appear_ as duplicates when displayed on the screen. To check that, we'll remove properties from the set cells based on the system capabilities (we probably don't need to consider them changing between now and when they're actually sent to the HU unless the menu layout changes) and check for uniqueness again. Then we'll add unique identifiers to primary text if there are duplicates. Then we transfer the primary text identifiers back to the main cells and add those to an operation to be sent.
- NSArray<SDLMenuCell *> *strippedCellsCopy = [self sdl_removeUnusedProperties:menuCellsCopy];
- [self sdl_addUniqueNamesBasedOnStrippedCells:strippedCellsCopy toUnstrippedCells:menuCellsCopy];
- }
+ _menuCells = [[NSArray alloc] initWithArray:menuCells copyItems:YES];
- _oldMenuCells = _menuCells;
- _menuCells = menuCellsCopy;
+ __weak typeof(self) weakself = self;
+ SDLMenuReplaceOperation *menuReplaceOperation = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager windowCapability:self.windowCapability menuConfiguration:self.currentMenuConfiguration currentMenu:self.currentMenuCells updatedMenu:self.menuCells compatibilityModeEnabled:(![self sdl_isDynamicMenuUpdateActive:self.dynamicMenuUpdatesMode]) currentMenuUpdatedHandler:^(NSArray<SDLMenuCell *> * _Nonnull currentMenuCells, NSError *error) {
+ weakself.currentMenuCells = currentMenuCells;
+ [weakself sdl_updateMenuReplaceOperationsWithNewCurrentMenu];
+ SDLLogD(@"Finished updating menu");
+ }];
- if ([self sdl_isDynamicMenuUpdateActive:self.dynamicMenuUpdatesMode]) {
- [self sdl_startDynamicMenuUpdate];
- } else {
- [self sdl_startNonDynamicMenuUpdate];
+ // Cancel previous replace menu operations
+ for (NSOperation *operation in self.transactionQueue.operations) {
+ if ([operation isMemberOfClass:[SDLMenuReplaceOperation class]]) {
+ [operation cancel];
+ }
}
+
+ [self.transactionQueue addOperation:menuReplaceOperation];
}
#pragma mark - Open Menu
-- (BOOL)openMenu {
- if ([SDLGlobals.sharedGlobals.rpcVersion isLessThanVersion:[[SDLVersion alloc] initWithMajor:6 minor:0 patch:0]]) {
- SDLLogE(@"The openMenu method is not supported on this head unit.");
- return NO;
- }
-
- SDLShowAppMenu *openMenu = [[SDLShowAppMenu alloc] init];
- [self.connectionManager sendConnectionRequest:openMenu withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
- if ([response.resultCode isEqualToEnum:SDLResultWarnings]) {
- SDLLogW(@"Warning opening application menu: %@", error);
- } else if (![response.resultCode isEqualToEnum:SDLResultSuccess]) {
- SDLLogE(@"Error opening application menu: %@", error);
- } else {
- SDLLogD(@"Successfully opened application main menu");
- }
- }];
-
- return YES;
-}
-
-- (BOOL)openSubmenu:(SDLMenuCell *)cell {
- if (cell.subCells.count == 0) {
+- (BOOL)openMenu:(nullable SDLMenuCell *)cell {
+ if (cell != nil && cell.subCells.count == 0) {
SDLLogE(@"The cell %@ does not contain any sub cells, so no submenu can be opened", cell);
return NO;
- } else if ([SDLGlobals.sharedGlobals.rpcVersion isLessThanVersion:[[SDLVersion alloc] initWithMajor:6 minor:0 patch:0]]) {
- SDLLogE(@"The openSubmenu method is not supported on this head unit.");
- return NO;
- } else if (![self.menuCells containsObject:cell]) {
+ } else if (cell != nil && ![self.menuCells containsObject:cell]) {
SDLLogE(@"This cell has not been sent to the head unit, so no submenu can be opened. Make sure that the cell exists in the SDLManager.menu array");
return NO;
+ } else if ([SDLGlobals.sharedGlobals.rpcVersion isLessThanVersion:[[SDLVersion alloc] initWithMajor:6 minor:0 patch:0]]) {
+ SDLLogE(@"The openMenu / openSubmenu is not supported on this head unit.");
+ return NO;
}
- SDLShowAppMenu *subMenu = [[SDLShowAppMenu alloc] initWithMenuID:cell.cellId];
- [self.connectionManager sendConnectionRequest:subMenu withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
- if ([response.resultCode isEqualToEnum:SDLResultWarnings]) {
- SDLLogW(@"Warning opening application menu to submenu cell %@, with error: %@", cell, error);
- } else if (![response.resultCode isEqualToEnum:SDLResultSuccess]) {
- SDLLogE(@"Error opening application menu to submenu cell %@, with error: %@", cell, error);
- } else {
- SDLLogD(@"Successfully opened application menu to submenu cell: %@", cell);
+ // Create the operation
+ SDLMenuShowOperation *showMenuOp = [[SDLMenuShowOperation alloc] initWithConnectionManager:self.connectionManager toMenuCell:cell completionHandler:^(NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogE(@"Opening menu with error: %@, info: %@. Failed subcell (if nil, attempted to open to main menu): %@", error, error.userInfo, cell);
}
}];
- return YES;
-}
-
-#pragma mark - Build Deletes, Keeps, Adds
-
-- (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray<SDLMenuCell *> *)oldKeptCells newKeptCells:(NSArray<SDLMenuCell *> *)newKeptCells atIndex:(NSUInteger)startIndex {
- if (oldKeptCells.count == 0 || startIndex >= oldKeptCells.count) {
- self.inProgressUpdate = nil;
- return;
- }
-
- if (oldKeptCells[startIndex].subCells.count > 0) {
- SDLDynamicMenuUpdateRunScore *tempScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldKeptCells[startIndex].subCells updatedMenuCells:newKeptCells[startIndex].subCells];
- NSArray<NSNumber *> *deleteMenuStatus = tempScore.oldStatus;
- NSArray<NSNumber *> *addMenuStatus = tempScore.updatedStatus;
-
- NSArray<SDLMenuCell *> *cellsToDelete = [self sdl_filterDeleteMenuItemsWithOldMenuItems:oldKeptCells[startIndex].subCells basedOnStatusList:deleteMenuStatus];
- NSArray<SDLMenuCell *> *cellsToAdd = [self sdl_filterAddMenuItemsWithNewMenuItems:newKeptCells[startIndex].subCells basedOnStatusList:addMenuStatus];
-
- NSArray<SDLMenuCell *> *oldKeeps = [self sdl_filterKeepMenuItemsWithOldMenuItems:oldKeptCells[startIndex].subCells basedOnStatusList:deleteMenuStatus];
- NSArray<SDLMenuCell *> *newKeeps = [self sdl_filterKeepMenuItemsWithNewMenuItems:newKeptCells[startIndex].subCells basedOnStatusList:addMenuStatus];
-
- [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:newKeptCells[startIndex].cellId];
- [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps];
-
- __weak typeof(self) weakself = self;
- [self sdl_sendDeleteCurrentMenu:cellsToDelete withCompletionHandler:^(NSError * _Nullable error) {
- [weakself sdl_sendUpdatedMenu:cellsToAdd usingMenu:weakself.menuCells[startIndex].subCells withCompletionHandler:^(NSError * _Nullable error) {
- // After the first set of submenu cells were added and deleted we must find the next set of subcells untll we loop through all the elemetns
- [weakself sdl_startSubMenuUpdatesWithOldKeptCells:oldKeptCells newKeptCells:newKeptCells atIndex:(startIndex + 1)];
- }];
- }];
- } else {
- // After the first set of submenu cells were added and deleted we must find the next set of subcells untll we loop through all the elemetns
- [self sdl_startSubMenuUpdatesWithOldKeptCells:oldKeptCells newKeptCells:newKeptCells atIndex:(startIndex + 1)];
- }
-}
-
-- (NSArray<SDLMenuCell *> *)sdl_filterDeleteMenuItemsWithOldMenuItems:(NSArray<SDLMenuCell *> *)oldMenuCells basedOnStatusList:(NSArray<NSNumber *> *)oldStatusList {
- NSMutableArray<SDLMenuCell *> *deleteCells = [[NSMutableArray alloc] init];
- // The index of the status should corrleate 1-1 with the number of items in the menu
- // [2,0,2,0] => [A,B,C,D] = [B,D]
- for (NSUInteger index = 0; index < oldStatusList.count; index++) {
- if (oldStatusList[index].integerValue == MenuCellStateDelete) {
- [deleteCells addObject:oldMenuCells[index]];
- }
- }
- return [deleteCells copy];
-}
-
-- (NSArray<SDLMenuCell *> *)sdl_filterAddMenuItemsWithNewMenuItems:(NSArray<SDLMenuCell *> *)newMenuCells basedOnStatusList:(NSArray<NSNumber *> *)newStatusList {
- NSMutableArray<SDLMenuCell *> *addCells = [[NSMutableArray alloc] init];
- // The index of the status should corrleate 1-1 with the number of items in the menu
- // [2,1,2,1] => [A,B,C,D] = [B,D]
- for (NSUInteger index = 0; index < newStatusList.count; index++) {
- if (newStatusList[index].integerValue == MenuCellStateAdd) {
- [addCells addObject:newMenuCells[index]];
+ // Cancel previous open menu operations
+ for (NSOperation *operation in self.transactionQueue.operations) {
+ if ([operation isMemberOfClass:[SDLMenuShowOperation class]]) {
+ [operation cancel];
}
}
- return [addCells copy];
-}
-
-- (NSArray<SDLMenuCell *> *)sdl_filterKeepMenuItemsWithOldMenuItems:(NSArray<SDLMenuCell *> *)oldMenuCells basedOnStatusList:(NSArray<NSNumber *> *)keepStatusList {
- NSMutableArray<SDLMenuCell *> *keepMenuCells = [[NSMutableArray alloc] init];
- for (NSUInteger index = 0; index < keepStatusList.count; index++) {
- if (keepStatusList[index].integerValue == MenuCellStateKeep) {
- [keepMenuCells addObject:oldMenuCells[index]];
- }
- }
- return [keepMenuCells copy];
-}
-
-- (NSArray<SDLMenuCell *> *)sdl_filterKeepMenuItemsWithNewMenuItems:(NSArray<SDLMenuCell *> *)newMenuCells basedOnStatusList:(NSArray<NSNumber *> *)keepStatusList {
- NSMutableArray<SDLMenuCell *> *keepMenuCells = [[NSMutableArray alloc] init];
- for (NSUInteger index = 0; index < keepStatusList.count; index++) {
- if (keepStatusList[index].integerValue == MenuCellStateKeep) {
- [keepMenuCells addObject:newMenuCells[index]];
- }
- }
- return [keepMenuCells copy];
-}
+ // Add the new open menu operation to the queue
+ [self.transactionQueue addOperation:showMenuOp];
-- (void)transferCellIDFromOldCells:(NSArray<SDLMenuCell *> *)oldCells toKeptCells:(NSArray<SDLMenuCell *> *)newCells {
- if (oldCells.count == 0) { return; }
- for (NSUInteger i = 0; i < newCells.count; i++) {
- newCells[i].cellId = oldCells[i].cellId;
- }
+ return YES;
}
#pragma mark - Updating System
-- (void)sdl_startDynamicMenuUpdate {
- SDLDynamicMenuUpdateRunScore *runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells];
-
- NSArray<NSNumber *> *deleteMenuStatus = runScore.oldStatus;
- NSArray<NSNumber *> *addMenuStatus = runScore.updatedStatus;
-
- NSArray<SDLMenuCell *> *cellsToDelete = [self sdl_filterDeleteMenuItemsWithOldMenuItems:self.oldMenuCells basedOnStatusList:deleteMenuStatus];
- NSArray<SDLMenuCell *> *cellsToAdd = [self sdl_filterAddMenuItemsWithNewMenuItems:self.menuCells basedOnStatusList:addMenuStatus];
- // These arrays should ONLY contain KEEPS. These will be used for SubMenu compares
- NSArray<SDLMenuCell *> *oldKeeps = [self sdl_filterKeepMenuItemsWithOldMenuItems:self.oldMenuCells basedOnStatusList:deleteMenuStatus];
- NSArray<SDLMenuCell *> *newKeeps = [self sdl_filterKeepMenuItemsWithNewMenuItems:self.menuCells basedOnStatusList:addMenuStatus];
-
- // Cells that will be added need new ids
- [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound];
-
- // Since we are creating a new Menu but keeping old cells we must firt transfer the old cellIDs to the new menus kept cells.
- [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps];
-
- // Upload the artworks
- NSArray<SDLArtwork *> *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:cellsToAdd];
- if (artworksToBeUploaded.count > 0) {
- [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
- if (error != nil) {
- SDLLogE(@"Error uploading menu artworks: %@", error);
- }
- SDLLogD(@"Menu artworks uploaded");
- // Update cells with artworks once they're uploaded
- __weak typeof(self) weakself = self;
- [self sdl_updateMenuWithCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd completionHandler:^(NSError * _Nullable error) {
- [weakself sdl_startSubMenuUpdatesWithOldKeptCells:oldKeeps newKeptCells:newKeeps atIndex:0];
- }];
- }];
- } else {
- // Cells have no artwork to load
- __weak typeof(self) weakself = self;
- [self sdl_updateMenuWithCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd completionHandler:^(NSError * _Nullable error) {
- [weakself sdl_startSubMenuUpdatesWithOldKeptCells:oldKeeps newKeptCells:newKeeps atIndex:0];
- }];
- }
-}
-
-- (void)sdl_startNonDynamicMenuUpdate {
- [self sdl_updateIdsOnMenuCells:self.menuCells parentId:ParentIdNotFound];
-
- NSArray<SDLArtwork *> *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells];
- if (artworksToBeUploaded.count > 0) {
- [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
- if (error != nil) {
- SDLLogE(@"Error uploading menu artworks: %@", error);
- }
-
- SDLLogD(@"Menu artworks uploaded");
- [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil];
- }];
- } else {
- // Cells have no artwork to load
- [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil];
+- (void)sdl_updateMenuReplaceOperationsWithNewCurrentMenu {
+ for (NSOperation *operation in self.transactionQueue.operations) {
+ if ([operation isMemberOfClass:[SDLMenuReplaceOperation class]]) {
+ SDLMenuReplaceOperation *op = (SDLMenuReplaceOperation *)operation;
+ op.currentMenu = self.currentMenuCells;
+ }
}
}
-- (void)sdl_updateMenuWithCellsToDelete:(NSArray<SDLMenuCell *> *)deleteCells cellsToAdd:(NSArray<SDLMenuCell *> *)addCells completionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler {
- if (self.currentHMILevel == nil
- || [self.currentHMILevel isEqualToEnum:SDLHMILevelNone]
- || [self.currentSystemContext isEqualToEnum:SDLSystemContextMenu]) {
- self.waitingOnHMIUpdate = YES;
- self.waitingUpdateMenuCells = self.menuCells;
- return;
- }
-
- if (self.inProgressUpdate != nil) {
- // There's an in progress update, we need to put this on hold
- self.hasQueuedUpdate = YES;
- return;
+- (void)sdl_updateMenuReplaceOperationsWithNewWindowCapability {
+ for (NSOperation *operation in self.transactionQueue.operations) {
+ if ([operation isMemberOfClass:[SDLMenuReplaceOperation class]]) {
+ SDLMenuReplaceOperation *op = (SDLMenuReplaceOperation *)operation;
+ op.windowCapability = self.windowCapability;
+ }
}
- __weak typeof(self) weakself = self;
- [self sdl_sendDeleteCurrentMenu:deleteCells withCompletionHandler:^(NSError * _Nullable error) {
- [weakself sdl_sendUpdatedMenu:addCells usingMenu:weakself.menuCells withCompletionHandler:^(NSError * _Nullable error) {
- weakself.inProgressUpdate = nil;
-
- if (completionHandler != nil) {
- completionHandler(error);
- }
-
- if (weakself.hasQueuedUpdate) {
- [weakself sdl_updateMenuWithCellsToDelete:deleteCells cellsToAdd:addCells completionHandler:nil];
- weakself.hasQueuedUpdate = NO;
- }
- }];
- }];
}
-#pragma mark Delete Old Menu Items
-
-- (void)sdl_sendDeleteCurrentMenu:(nullable NSArray<SDLMenuCell *> *)deleteMenuCells withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler {
- if (deleteMenuCells.count == 0) {
- completionHandler(nil);
- return;
- }
-
- NSArray<SDLRPCRequest *> *deleteMenuCommands = [self sdl_deleteCommandsForCells:deleteMenuCells];
- [self.connectionManager sendRequests:deleteMenuCommands progressHandler:nil completionHandler:^(BOOL success) {
- if (!success) {
- SDLLogW(@"Unable to delete all old menu commands");
- } else {
- SDLLogD(@"Finished deleting old menu");
+- (void)sdl_updateMenuReplaceOperationsWithNewMenuConfiguration {
+ for (NSOperation *operation in self.transactionQueue.operations) {
+ if ([operation isMemberOfClass:[SDLMenuReplaceOperation class]]) {
+ SDLMenuReplaceOperation *op = (SDLMenuReplaceOperation *)operation;
+ op.menuConfiguration = self.currentMenuConfiguration;
}
-
- completionHandler(nil);
- }];
-}
-
-#pragma mark Send New Menu Items
-
-/**
- Creates add commands
-
- @param updatedMenu The cells you will be adding
- @param menu The list of all cells. This may be different then self.menuCells since this function is called on subcell cells as well. When comparing 2 sub menu cells this function will be passed the list of all subcells on that cell.
- @param completionHandler handler
- */
-- (void)sdl_sendUpdatedMenu:(NSArray<SDLMenuCell *> *)updatedMenu usingMenu:(NSArray<SDLMenuCell *> *)menu withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler {
- if (self.menuCells.count == 0 || updatedMenu.count == 0) {
- SDLLogD(@"There are no cells to update.");
- completionHandler(nil);
- return;
- }
-
- NSArray<SDLRPCRequest *> *mainMenuCommands = nil;
- NSArray<SDLRPCRequest *> *subMenuCommands = nil;
-
- if (![self sdl_shouldRPCsIncludeImages:self.menuCells] || ![self.windowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
- // Send artwork-less menu
- mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:NO usingIndexesFrom:menu];
- subMenuCommands = [self sdl_subMenuCommandsForCells:updatedMenu withArtwork:NO];
- } else {
- // Send full artwork menu
- mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:YES usingIndexesFrom:menu];
- subMenuCommands = [self sdl_subMenuCommandsForCells:updatedMenu withArtwork:YES];
}
-
- self.inProgressUpdate = [mainMenuCommands arrayByAddingObjectsFromArray:subMenuCommands];
-
- __block NSMutableDictionary<SDLRPCRequest *, NSError *> *errors = [NSMutableDictionary dictionary];
- __weak typeof(self) weakSelf = self;
- [self.connectionManager sendRequests:mainMenuCommands progressHandler:^void(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
- if (error != nil) {
- errors[request] = error;
- }
- } completionHandler:^(BOOL success) {
- if (!success) {
- SDLLogE(@"Failed to send main menu commands: %@", errors);
- completionHandler([NSError sdl_menuManager_failedToUpdateWithDictionary:errors]);
- return;
- }
-
- [weakSelf.connectionManager sendRequests:subMenuCommands progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
- if (error != nil) {
- errors[request] = error;
- }
- } completionHandler:^(BOOL success) {
- if (!success) {
- SDLLogE(@"Failed to send sub menu commands: %@", errors);
- completionHandler([NSError sdl_menuManager_failedToUpdateWithDictionary:errors]);
- return;
- }
-
- SDLLogD(@"Finished updating menu");
- completionHandler(nil);
- }];
- }];
}
#pragma mark - Helpers
@@ -532,96 +295,6 @@ UInt32 const MenuCellIdMin = 1;
}
}
-- (NSArray<SDLMenuCell *> *)sdl_removeUnusedProperties:(NSArray<SDLMenuCell *> *)menuCells {
- NSArray<SDLMenuCell *> *removePropertiesCopy = [[NSArray alloc] initWithArray:menuCells copyItems:YES];
- for (SDLMenuCell *cell in removePropertiesCopy) {
- // Strip away fields that cannot be used to determine uniqueness visually including fields not supported by the HMI
- cell.voiceCommands = nil;
-
- // Don't check SDLImageFieldNameSubMenuIcon because it was added in 7.0 when the feature was added in 5.0. Just assume that if CommandIcon is not available, the submenu icon is not either.
- if (![self.windowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
- cell.icon = nil;
- }
-
- if (cell.subCells != nil) {
- if (![self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuSubMenuSecondaryText]) {
- cell.secondaryText = nil;
- }
- if (![self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuSubMenuTertiaryText]) {
- cell.tertiaryText = nil;
- }
- if (![self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuSubMenuSecondaryImage]) {
- cell.secondaryArtwork = nil;
- }
- cell.subCells = [self sdl_removeUnusedProperties:cell.subCells];
- } else {
- if (![self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandSecondaryText]) {
- cell.secondaryText = nil;
- }
- if (![self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandTertiaryText]) {
- cell.tertiaryText = nil;
- }
- if (![self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuCommandSecondaryImage]) {
- cell.secondaryArtwork = nil;
- }
- }
- }
-
- return removePropertiesCopy;
-}
-
-/// Checks if 2 or more cells have the same text/title. In case this condition is true, this function will handle the presented issue by adding "(count)".
-/// E.g. Choices param contains 2 cells with text/title "Address" will be handled by updating the uniqueText/uniqueTitle of the second cell to "Address (2)".
-/// @param choices The choices to be uploaded.
-- (void)sdl_addUniqueNamesToCellsWithDuplicatePrimaryText:(nullable NSArray<SDLMenuCell *> *)choices {
- // Tracks how many of each cell primary text there are so that we can append numbers to make each unique as necessary
- NSMutableDictionary<NSString *, NSNumber *> *dictCounter = [[NSMutableDictionary alloc] init];
- for (SDLMenuCell *cell in choices) {
- NSString *cellName = cell.title;
- NSNumber *counter = dictCounter[cellName];
- if (counter != nil) {
- counter = @(counter.intValue + 1);
- dictCounter[cellName] = counter;
- } else {
- dictCounter[cellName] = @1;
- }
-
- counter = dictCounter[cellName];
- if (counter.intValue > 1) {
- cell.uniqueTitle = [NSString stringWithFormat: @"%@ (%d)", cell.title, counter.intValue];
- }
-
- if (cell.subCells.count > 0) {
- [self sdl_addUniqueNamesToCellsWithDuplicatePrimaryText:cell.subCells];
- }
- }
-}
-
-- (void)sdl_addUniqueNamesBasedOnStrippedCells:(NSArray<SDLMenuCell *> *)strippedCells toUnstrippedCells:(NSArray<SDLMenuCell *> *)unstrippedCells {
- NSParameterAssert(strippedCells.count == unstrippedCells.count);
- // Tracks how many of each cell primary text there are so that we can append numbers to make each unique as necessary
- NSMutableDictionary<SDLMenuCell *, NSNumber *> *dictCounter = [[NSMutableDictionary alloc] init];
- for (NSUInteger i = 0; i < strippedCells.count; i++) {
- SDLMenuCell *cell = strippedCells[i];
- NSNumber *counter = dictCounter[cell];
- if (counter != nil) {
- counter = @(counter.intValue + 1);
- dictCounter[cell] = counter;
- } else {
- dictCounter[cell] = @1;
- }
-
- counter = dictCounter[cell];
- if (counter.intValue > 1) {
- unstrippedCells[i].uniqueTitle = [NSString stringWithFormat: @"%@ (%d)", unstrippedCells[i].title, counter.intValue];
- }
-
- if (cell.subCells.count > 0) {
- [self sdl_addUniqueNamesBasedOnStrippedCells:cell.subCells toUnstrippedCells:unstrippedCells[i].subCells];
- }
- }
-}
-
/// Check for cell lists with completely duplicate information, or any duplicate voiceCommands
///
/// @param cells The cells you will be adding
@@ -658,211 +331,6 @@ UInt32 const MenuCellIdMin = 1;
return YES;
}
-#pragma mark Artworks
-
-/// Get an array of artwork that needs to be uploaded form a list of menu cells
-/// @param cells The menu cells to get artwork from
-/// @returns The array of artwork that needs to be uploaded
-- (NSArray<SDLArtwork *> *)sdl_findAllArtworksToBeUploadedFromCells:(NSArray<SDLMenuCell *> *)cells {
- if (![self.windowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
- return @[];
- }
-
- NSMutableSet<SDLArtwork *> *mutableArtworks = [NSMutableSet set];
- for (SDLMenuCell *cell in cells) {
- if ([self.fileManager fileNeedsUpload:cell.icon]) {
- [mutableArtworks addObject:cell.icon];
- }
-
- if (cell.subCells.count > 0 && [self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuSubMenuSecondaryImage]) {
- if ([self.fileManager fileNeedsUpload:cell.secondaryArtwork]) {
- [mutableArtworks addObject:cell.secondaryArtwork];
- }
- } else if (cell.subCells.count == 0 && [self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuCommandSecondaryImage]) {
- if ([self.fileManager fileNeedsUpload:cell.secondaryArtwork]) {
- [mutableArtworks addObject:cell.secondaryArtwork];
- }
- }
-
- if (cell.subCells.count > 0) {
- [mutableArtworks addObjectsFromArray:[self sdl_findAllArtworksToBeUploadedFromCells:cell.subCells]];
- }
- }
-
- return [mutableArtworks allObjects];
-}
-
-/// Determine if cells should or should not be uploaded to the head unit with artworks.
-///
-/// No artworks will be uploaded if:
-///
-/// 1. If any cell has a dynamic artwork that is not uploaded
-/// 2. If any cell contains a secondary artwork may be used on the head unit, and the cell has a dynamic secondary artwork that is not uploaded
-/// 3. If any cell's subcells fails check (1) or (2)
-/// @param cells The cells to check
-/// @return True if the cells should be uploaded with artwork, false if they should not
-- (BOOL)sdl_shouldRPCsIncludeImages:(NSArray<SDLMenuCell *> *)cells {
- for (SDLMenuCell *cell in cells) {
- SDLArtwork *artwork = cell.icon;
- SDLArtwork *secondaryArtwork = cell.secondaryArtwork;
- if (artwork != nil && !artwork.isStaticIcon && ![self.fileManager hasUploadedFile:artwork]) {
- return NO;
- } else if (cell.subCells.count > 0 && [self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuSubMenuSecondaryImage]) {
- if (secondaryArtwork != nil && !secondaryArtwork.isStaticIcon && ![self.fileManager hasUploadedFile:secondaryArtwork]) {
- return NO;
- }
- } else if (cell.subCells.count == 0 && [self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuCommandSecondaryImage]) {
- if (secondaryArtwork != nil && !secondaryArtwork.isStaticIcon && ![self.fileManager hasUploadedFile:secondaryArtwork]) {
- return NO;
- }
- } else if (cell.subCells.count > 0 && ![self sdl_shouldRPCsIncludeImages:cell.subCells]) {
- return NO;
- }
- }
-
- return YES;
-}
-
-#pragma mark IDs
-
-/// Assign cell ids on an array of menu cells given a parent id (or no parent id)
-/// @param menuCells The array of menu cells to update
-/// @param parentId The parent id to assign if needed
-- (void)sdl_updateIdsOnMenuCells:(NSArray<SDLMenuCell *> *)menuCells parentId:(UInt32)parentId {
- for (SDLMenuCell *cell in menuCells) {
- cell.cellId = self.lastMenuId++;
- cell.parentCellId = parentId;
- if (cell.subCells.count > 0) {
- [self sdl_updateIdsOnMenuCells:cell.subCells parentId:cell.cellId];
- }
- }
-}
-
-#pragma mark Deletes
-
-/// Create an array of DeleteCommand and DeleteSubMenu RPCs from an array of menu cells
-/// @param cells The array of menu cells to use
-- (NSArray<SDLRPCRequest *> *)sdl_deleteCommandsForCells:(NSArray<SDLMenuCell *> *)cells {
- NSMutableArray<SDLRPCRequest *> *mutableDeletes = [NSMutableArray array];
- for (SDLMenuCell *cell in cells) {
- if (cell.subCells == nil) {
- SDLDeleteCommand *delete = [[SDLDeleteCommand alloc] initWithId:cell.cellId];
- [mutableDeletes addObject:delete];
- } else {
- SDLDeleteSubMenu *delete = [[SDLDeleteSubMenu alloc] initWithId:cell.cellId];
- [mutableDeletes addObject:delete];
- }
- }
-
- return [mutableDeletes copy];
-}
-
-#pragma mark Commands / SubMenu RPCs
-
-/// This method will receive the cells to be added and the updated menu array. It will then build an array of add commands using the correct index to position the new items in the correct location.
-/// e.g. If the new menu array is [A, B, C, D] but only [C, D] are new we need to pass [A, B , C , D] so C and D can be added to index 2 and 3 respectively.
-///
-/// @param cells that will be added to the menu, this array must contain only cells that are not already in the menu.
-/// @param shouldHaveArtwork artwork bool
-/// @param menu the new menu array, this array should contain all the values the developer has set to be included in the new menu. This is used for placing the newly added cells in the correct location.
-/// @return list of SDLRPCRequest addCommands
-- (NSArray<SDLRPCRequest *> *)sdl_mainMenuCommandsForCells:(NSArray<SDLMenuCell *> *)cells withArtwork:(BOOL)shouldHaveArtwork usingIndexesFrom:(NSArray<SDLMenuCell *> *)menu {
- NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
-
- for (NSUInteger menuInteger = 0; menuInteger < menu.count; menuInteger++) {
- for (NSUInteger updateCellsIndex = 0; updateCellsIndex < cells.count; updateCellsIndex++) {
- if ([menu[menuInteger] isEqual:cells[updateCellsIndex]]) {
- if (cells[updateCellsIndex].subCells.count > 0) {
- [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cells[updateCellsIndex] withArtwork:shouldHaveArtwork position:(UInt16)menuInteger]];
- } else {
- [mutableCommands addObject:[self sdl_commandForMenuCell:cells[updateCellsIndex] withArtwork:shouldHaveArtwork position:(UInt16)menuInteger]];
- }
- }
- }
- }
-
- return [mutableCommands copy];
-}
-
-/// Creates SDLAddSubMenu RPCs for the passed array of menu cells, AND all of those cells' subcell RPCs, both SDLAddCommands and SDLAddSubMenus
-/// @param cells The cells to create RPCs for
-/// @param shouldHaveArtwork Whether artwork should be applied to the RPCs
-/// @returns An array of RPCs of SDLAddSubMenus and their associated subcell RPCs
-- (NSArray<SDLRPCRequest *> *)sdl_subMenuCommandsForCells:(NSArray<SDLMenuCell *> *)cells withArtwork:(BOOL)shouldHaveArtwork {
- NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
- for (SDLMenuCell *cell in cells) {
- if (cell.subCells.count > 0) {
- [mutableCommands addObjectsFromArray:[self sdl_allCommandsForCells:cell.subCells withArtwork:shouldHaveArtwork]];
- }
- }
-
- return [mutableCommands copy];
-}
-
-/// Creates SDLAddCommand and SDLAddSubMenu RPCs for a passed array of cells, AND all of those cells' subcell RPCs, both SDLAddCommands and SDLAddSubmenus
-/// @param cells The cells to create RPCs for
-/// @param shouldHaveArtwork Whether artwork should be applied to the RPCs
-/// @returns An array of RPCs of SDLAddCommand and SDLAddSubMenus for the array of menu cells and their subcells, recursively
-- (NSArray<SDLRPCRequest *> *)sdl_allCommandsForCells:(NSArray<SDLMenuCell *> *)cells withArtwork:(BOOL)shouldHaveArtwork {
- NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
-
- for (NSUInteger cellIndex = 0; cellIndex < cells.count; cellIndex++) {
- if (cells[cellIndex].subCells.count > 0) {
- [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cells[cellIndex] withArtwork:shouldHaveArtwork position:(UInt16)cellIndex]];
- [mutableCommands addObjectsFromArray:[self sdl_allCommandsForCells:cells[cellIndex].subCells withArtwork:shouldHaveArtwork]];
- } else {
- [mutableCommands addObject:[self sdl_commandForMenuCell:cells[cellIndex] withArtwork:shouldHaveArtwork position:(UInt16)cellIndex]];
- }
- }
-
- return [mutableCommands copy];
-}
-
-/// An individual SDLAddCommand RPC for a given SDLMenuCell
-/// @param cell The cell to create the RPC for
-/// @param shouldHaveArtwork Whether artwork should be applied to the RPC
-/// @param position The position the SDLAddCommand RPC should be given
-/// @returns The SDLAddCommand RPC
-- (SDLAddCommand *)sdl_commandForMenuCell:(SDLMenuCell *)cell withArtwork:(BOOL)shouldHaveArtwork position:(UInt16)position {
- SDLAddCommand *command = [[SDLAddCommand alloc] init];
-
- SDLMenuParams *params = [[SDLMenuParams alloc] init];
- params.menuName = cell.uniqueTitle;
- params.parentID = cell.parentCellId != UINT32_MAX ? @(cell.parentCellId) : nil;
- params.position = @(position);
- params.secondaryText = (cell.secondaryText.length > 0 && [self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandSecondaryText]) ? cell.secondaryText : nil;
- params.tertiaryText = (cell.tertiaryText.length > 0 && [self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandTertiaryText]) ? cell.tertiaryText : nil;
-
- command.menuParams = params;
- command.vrCommands = (cell.voiceCommands.count == 0) ? nil : cell.voiceCommands;
- command.cmdIcon = (cell.icon && shouldHaveArtwork) ? cell.icon.imageRPC : nil;
- command.cmdID = @(cell.cellId);
- command.secondaryImage = (cell.secondaryArtwork && shouldHaveArtwork && ![self.fileManager fileNeedsUpload:cell.secondaryArtwork] && [self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuCommandSecondaryImage]) ? cell.secondaryArtwork.imageRPC : nil;
-
- return command;
-}
-
-/// An individual SDLAddSubMenu RPC for a given SDLMenuCell
-/// @param cell The cell to create the RPC for
-/// @param shouldHaveArtwork Whether artwork should be applied to the RPC
-/// @param position The position the SDLAddSubMenu RPC should be given
-/// @returns The SDLAddSubMenu RPC
-- (SDLAddSubMenu *)sdl_subMenuCommandForMenuCell:(SDLMenuCell *)cell withArtwork:(BOOL)shouldHaveArtwork position:(UInt16)position {
- SDLImage *icon = (shouldHaveArtwork && (cell.icon.name != nil)) ? cell.icon.imageRPC : nil;
- SDLImage *secondaryImage = (shouldHaveArtwork && ![self.fileManager fileNeedsUpload:cell.secondaryArtwork] && (cell.secondaryArtwork.name != nil) && [self.windowCapability hasImageFieldOfName:SDLImageFieldNameMenuSubMenuSecondaryImage]) ? cell.secondaryArtwork.imageRPC : nil;
-
- SDLMenuLayout submenuLayout = nil;
- if (cell.submenuLayout && [self.systemCapabilityManager.defaultMainWindowCapability.menuLayoutsAvailable containsObject:cell.submenuLayout]) {
- submenuLayout = cell.submenuLayout;
- } else {
- submenuLayout = self.menuConfiguration.defaultSubmenuLayout;
- }
-
- NSString *secondaryText = (cell.secondaryText.length > 0 && [self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuSubMenuSecondaryText]) ? cell.secondaryText : nil;
- NSString *tertiaryText = (cell.tertiaryText.length > 0 && [self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuSubMenuTertiaryText]) ? cell.tertiaryText : nil;
- return [[SDLAddSubMenu alloc] initWithMenuID:cell.cellId menuName:cell.uniqueTitle position:@(position) menuIcon:icon menuLayout:submenuLayout parentID:nil secondaryText:secondaryText tertiaryText:tertiaryText secondaryImage:secondaryImage];
-}
-
#pragma mark - Calling handlers
/// Call a handler for a currently displayed SDLMenuCell based on the incoming SDLOnCommand notification
@@ -889,46 +357,22 @@ UInt32 const MenuCellIdMin = 1;
- (void)sdl_commandNotification:(SDLRPCNotificationNotification *)notification {
SDLOnCommand *onCommand = (SDLOnCommand *)notification.notification;
-
- [self sdl_callHandlerForCells:self.menuCells command:onCommand];
+ [self sdl_callHandlerForCells:self.currentMenuCells command:onCommand];
}
- (void)sdl_displayCapabilityDidUpdate {
self.windowCapability = self.systemCapabilityManager.defaultMainWindowCapability;
+ [self sdl_updateMenuReplaceOperationsWithNewWindowCapability];
}
- (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification {
SDLOnHMIStatus *hmiStatus = (SDLOnHMIStatus *)notification.notification;
+ if ((hmiStatus.windowID != nil) && (hmiStatus.windowID.integerValue != SDLPredefinedWindowsDefaultWindow)) { return; }
- if (hmiStatus.windowID != nil && hmiStatus.windowID.integerValue != SDLPredefinedWindowsDefaultWindow) {
- return;
- }
-
- SDLHMILevel oldHMILevel = self.currentHMILevel;
self.currentHMILevel = hmiStatus.hmiLevel;
-
- // Auto-send an updated menu if we were in NONE and now we are not, and we need an update
- if ([oldHMILevel isEqualToString:SDLHMILevelNone] && ![self.currentHMILevel isEqualToString:SDLHMILevelNone] &&
- ![self.currentSystemContext isEqualToEnum:SDLSystemContextMenu]) {
- if (self.waitingOnHMIUpdate) {
- [self setMenuCells:self.waitingUpdateMenuCells];
- self.waitingUpdateMenuCells = @[];
- return;
- }
- }
-
- // If we don't check for this and only update when not in the menu, there can be IN_USE errors, especially with submenus. We also don't want to encourage changing out the menu while the user is using it for usability reasons.
- SDLSystemContext oldSystemContext = self.currentSystemContext;
self.currentSystemContext = hmiStatus.systemContext;
- if ([oldSystemContext isEqualToEnum:SDLSystemContextMenu]
- && ![self.currentSystemContext isEqualToEnum:SDLSystemContextMenu]
- && ![self.currentHMILevel isEqualToEnum:SDLHMILevelNone]) {
- if (self.waitingOnHMIUpdate) {
- [self setMenuCells:self.waitingUpdateMenuCells];
- self.waitingUpdateMenuCells = @[];
- }
- }
+ [self sdl_updateTransactionQueueSuspended];
}
@end
diff --git a/SmartDeviceLink/private/SDLMenuManagerPrivateConstants.h b/SmartDeviceLink/private/SDLMenuManagerPrivateConstants.h
new file mode 100644
index 000000000..63f7333ee
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMenuManagerPrivateConstants.h
@@ -0,0 +1,15 @@
+//
+// SDLMenuManagerPrivateConstants.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 1/27/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+extern UInt32 const ParentIdNotFound;
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLMenuManagerPrivateConstants.m b/SmartDeviceLink/private/SDLMenuManagerPrivateConstants.m
new file mode 100644
index 000000000..03c7349e8
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMenuManagerPrivateConstants.m
@@ -0,0 +1,15 @@
+//
+// SDLMenuManagerPrivateConstants.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 1/27/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLMenuManagerPrivateConstants.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+UInt32 const ParentIdNotFound = UINT32_MAX;
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLMenuReplaceOperation.h b/SmartDeviceLink/private/SDLMenuReplaceOperation.h
new file mode 100644
index 000000000..05a7d25f6
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMenuReplaceOperation.h
@@ -0,0 +1,36 @@
+//
+// SDLMenuReplaceOperation.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 1/20/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLAsynchronousOperation.h"
+
+#import "SDLAsynchronousOperation.h"
+
+#import "SDLMenuReplaceUtilities.h"
+
+@protocol SDLConnectionManagerType;
+
+@class SDLFileManager;
+@class SDLMenuCell;
+@class SDLMenuConfiguration;
+@class SDLWindowCapability;
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^SDLCurrentMenuUpdatedBlock)(NSArray<SDLMenuCell *> *currentMenuCells, NSError *_Nullable error);
+
+@interface SDLMenuReplaceOperation : SDLAsynchronousOperation
+
+@property (strong, nonatomic) SDLWindowCapability *windowCapability;
+@property (strong, nonatomic) SDLMenuConfiguration *menuConfiguration;
+@property (strong, nonatomic) NSArray<SDLMenuCell *> *currentMenu;
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability menuConfiguration:(SDLMenuConfiguration *)menuConfiguration currentMenu:(NSArray<SDLMenuCell *> *)currentMenu updatedMenu:(NSArray<SDLMenuCell *> *)updatedMenu compatibilityModeEnabled:(BOOL)compatibilityModeEnabled currentMenuUpdatedHandler:(SDLCurrentMenuUpdatedBlock)currentMenuUpdatedHandler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLMenuReplaceOperation.m b/SmartDeviceLink/private/SDLMenuReplaceOperation.m
new file mode 100644
index 000000000..8f656c8a5
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMenuReplaceOperation.m
@@ -0,0 +1,455 @@
+//
+// SDLMenuReplaceDynamicOperation.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 1/20/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLMenuReplaceOperation.h"
+
+#import "SDLArtwork.h"
+#import "SDLConnectionManagerType.h"
+#import "SDLDynamicMenuUpdateAlgorithm.h"
+#import "SDLDynamicMenuUpdateRunScore.h"
+#import "SDLError.h"
+#import "SDLFileManager.h"
+#import "SDLGlobals.h"
+#import "SDLLogMacros.h"
+#import "SDLMenuCell.h"
+#import "SDLMenuConfiguration.h"
+#import "SDLMenuManagerPrivateConstants.h"
+#import "SDLTextFieldName.h"
+#import "SDLVersion.h"
+#import "SDLWindowCapability.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLMenuCell()
+
+@property (assign, nonatomic) UInt32 parentCellId;
+@property (assign, nonatomic) UInt32 cellId;
+@property (strong, nonatomic, readwrite) NSString *uniqueTitle;
+
+@property (copy, nonatomic, readwrite) NSString *title;
+@property (strong, nonatomic, readwrite, nullable) SDLArtwork *icon;
+@property (copy, nonatomic, readwrite, nullable) NSArray<NSString *> *voiceCommands;
+@property (copy, nonatomic, readwrite, nullable) NSString *secondaryText;
+@property (copy, nonatomic, readwrite, nullable) NSString *tertiaryText;
+@property (strong, nonatomic, readwrite, nullable) SDLArtwork *secondaryArtwork;
+@property (copy, nonatomic, readwrite, nullable) NSArray<SDLMenuCell *> *subCells;
+@property (copy, nonatomic, readwrite, nullable) SDLMenuCellSelectionHandler handler;
+
+@end
+
+@interface SDLMenuReplaceOperation ()
+
+// Dependencies
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (strong, nonatomic) NSArray<SDLMenuCell *> *updatedMenu;
+@property (strong, nonatomic) NSMutableArray<SDLMenuCell *> *mutableCurrentMenu;
+@property (assign, nonatomic) BOOL compatibilityModeEnabled;
+@property (copy, nonatomic) SDLCurrentMenuUpdatedBlock currentMenuUpdatedHandler;
+
+// Internal properties
+@property (copy, nonatomic, nullable) NSError *internalError;
+
+@end
+
+@implementation SDLMenuReplaceOperation
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability menuConfiguration:(SDLMenuConfiguration *)menuConfiguration currentMenu:(NSArray<SDLMenuCell *> *)currentMenu updatedMenu:(NSArray<SDLMenuCell *> *)updatedMenu compatibilityModeEnabled:(BOOL)compatibilityModeEnabled currentMenuUpdatedHandler:(SDLCurrentMenuUpdatedBlock)currentMenuUpdatedHandler {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _connectionManager = connectionManager;
+ _fileManager = fileManager;
+ _windowCapability = windowCapability;
+ _menuConfiguration = menuConfiguration;
+ _mutableCurrentMenu = [currentMenu mutableCopy];
+ _updatedMenu = [updatedMenu copy];
+ _compatibilityModeEnabled = compatibilityModeEnabled;
+ _currentMenuUpdatedHandler = currentMenuUpdatedHandler;
+
+ return self;
+}
+
+- (void)start {
+ [super start];
+ if (self.isCancelled) { return; }
+
+ [SDLMenuReplaceUtilities addIdsToMenuCells:self.updatedMenu parentId:ParentIdNotFound];
+
+ // Strip the "current menu" and the new menu of properties that are not displayed on the head unit
+ NSArray<SDLMenuCell *> *updatedStrippedMenu = [self.class sdl_cellsWithRemovedPropertiesFromCells:self.updatedMenu basedOnWindowCapability:self.windowCapability];
+ NSArray<SDLMenuCell *> *currentStrippedMenu = [self.class sdl_cellsWithRemovedPropertiesFromCells:self.mutableCurrentMenu basedOnWindowCapability:self.windowCapability];
+
+ // Generate unique names and ensure that all menus we are tracking have them so that we can properly compare when using the dynamic algorithm
+ BOOL supportsMenuUniqueness = [[SDLGlobals sharedGlobals].rpcVersion isGreaterThanOrEqualToVersion:[SDLVersion versionWithMajor:7 minor:1 patch:0]];
+ [self.class sdl_generateUniqueNamesForCells:updatedStrippedMenu supportsMenuUniqueness:supportsMenuUniqueness];
+ [self.class sdl_applyUniqueNamesOnCells:updatedStrippedMenu toCells:self.updatedMenu];
+
+ SDLDynamicMenuUpdateRunScore *runScore = nil;
+ if (self.compatibilityModeEnabled) {
+ SDLLogV(@"Dynamic menu update inactive. Forcing the deletion of all old cells and adding all new ones, even if they're the same.");
+ runScore = [SDLDynamicMenuUpdateAlgorithm compatibilityRunScoreWithOldMenuCells:currentStrippedMenu updatedMenuCells:updatedStrippedMenu];
+ } else {
+ SDLLogV(@"Dynamic menu update active. Running the algorithm to find the best way to delete / add cells.");
+ runScore = [SDLDynamicMenuUpdateAlgorithm dynamicRunScoreOldMenuCells:currentStrippedMenu updatedMenuCells:updatedStrippedMenu];
+ }
+
+ // If both old and new cells are empty, nothing needs to happen
+ if (runScore.isEmpty) { return [self finishOperation]; }
+
+ // Drop the cells into buckets based on the run score
+ NSArray<SDLMenuCell *> *cellsToDelete = [self sdl_filterDeleteMenuItemsWithOldMenuItems:self.currentMenu basedOnStatusList:runScore.oldStatus];
+ NSArray<SDLMenuCell *> *cellsToAdd = [self sdl_filterAddMenuItemsWithNewMenuItems:self.updatedMenu basedOnStatusList:runScore.updatedStatus];
+ // These arrays should ONLY contain KEEPS. These will be used for SubMenu compares
+ NSArray<SDLMenuCell *> *oldKeeps = [self sdl_filterKeepMenuItems:self.currentMenu basedOnStatusList:runScore.oldStatus];
+ NSArray<SDLMenuCell *> *newKeeps = [self sdl_filterKeepMenuItems:self.updatedMenu basedOnStatusList:runScore.updatedStatus];
+
+ // Old kept cells ids need to be moved to the new kept cells so that submenu changes have correct parent ids
+ [SDLMenuReplaceUtilities transferCellIDsFromCells:oldKeeps toCells:newKeeps];
+
+ // Transfer new cells' handlers to the old cells, which are stored in the current menu
+ [SDLMenuReplaceUtilities transferCellHandlersFromCells:newKeeps toCells:oldKeeps];
+
+ // Upload the artworks, then we will start updating the main menu
+ __weak typeof(self) weakSelf = self;
+ [self sdl_uploadMenuArtworksWithCompletionHandler:^(NSError * _Nullable error) {
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ if (strongSelf.isCancelled) { return [strongSelf finishOperation]; }
+ if (error != nil) { return [strongSelf finishOperationWithError:error]; }
+
+ [strongSelf sdl_updateMenuWithCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd completionHandler:^(NSError * _Nullable error) {
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ if (strongSelf.isCancelled) { return [strongSelf finishOperation]; }
+ if (error != nil) { return [strongSelf finishOperationWithError:error]; }
+
+ [strongSelf sdl_updateSubMenuWithOldKeptCells:oldKeeps newKeptCells:newKeeps keptCellIndex:0 completionHandler:^(NSError * _Nullable error) {
+ return [strongSelf finishOperationWithError:error];
+ }];
+ }];
+ }];
+}
+
+#pragma mark - Update Main Menu / Submenu
+
+- (void)sdl_uploadMenuArtworksWithCompletionHandler:(void(^)(NSError *_Nullable error))handler {
+ NSArray<SDLArtwork *> *artworksToBeUploaded = [SDLMenuReplaceUtilities findAllArtworksToBeUploadedFromCells:self.updatedMenu fileManager:self.fileManager windowCapability:self.windowCapability];
+ if (artworksToBeUploaded.count == 0) { return handler(nil); }
+
+ __weak typeof(self) weakself = self;
+ [self.fileManager uploadArtworks:artworksToBeUploaded progressHandler:^BOOL(NSString * _Nonnull artworkName, float uploadPercentage, NSError * _Nullable error) {
+ // If we're cancelled, stop uploading
+ return !weakself.isCancelled;
+ } completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
+ if (error != nil) { SDLLogE(@"Error uploading menu artworks: %@", error); }
+
+ SDLLogD(@"Menu artwork upload completed, beginning upload of main menu");
+ // Start updating the main menu cells
+ handler(error);
+ }];
+}
+
+/// Takes the main menu cells to delete and add, and deletes the current menu cells, then adds the new menu cells in the correct locations
+/// @param deleteCells The cells that need to be deleted
+/// @param addCells The cells that need to be added
+/// @param handler A handler called when complete
+- (void)sdl_updateMenuWithCellsToDelete:(NSArray<SDLMenuCell *> *)deleteCells cellsToAdd:(NSArray<SDLMenuCell *> *)addCells completionHandler:(void(^)(NSError *_Nullable error))handler {
+ __weak typeof(self) weakSelf = self;
+ [self sdl_sendDeleteMenuCells:deleteCells withCompletionHandler:^(NSError * _Nullable error) {
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+ if (strongSelf.isCancelled) { return handler(error); }
+ [strongSelf sdl_sendAddMenuCells:addCells withPositionsFromMenu:self.updatedMenu completionHandler:^(NSError * _Nullable error) {
+ handler(error);
+ }];
+ }];
+}
+
+/// Takes the submenu cells that are old keeps and new keeps and determines which cells need to be deleted or added
+/// @param oldKeptCells The old kept cells
+/// @param newKeptCells The new kept cells
+/// @param index The index of the main menu to use
+/// @param completionHandler The handler to call when all submenu updates are complete
+- (void)sdl_updateSubMenuWithOldKeptCells:(NSArray<SDLMenuCell *> *)oldKeptCells newKeptCells:(NSArray<SDLMenuCell *> *)newKeptCells keptCellIndex:(NSUInteger)index completionHandler:(void(^)(NSError *_Nullable error))completionHandler {
+ if (oldKeptCells.count == 0 || index >= oldKeptCells.count) { return completionHandler(nil); }
+
+ if (oldKeptCells[index].subCells.count > 0) {
+ SDLDynamicMenuUpdateRunScore *tempScore = [SDLDynamicMenuUpdateAlgorithm dynamicRunScoreOldMenuCells:oldKeptCells[index].subCells updatedMenuCells:newKeptCells[index].subCells];
+ NSArray<NSNumber *> *deleteMenuStatus = tempScore.oldStatus;
+ NSArray<NSNumber *> *addMenuStatus = tempScore.updatedStatus;
+
+ NSArray<SDLMenuCell *> *cellsToDelete = [self sdl_filterDeleteMenuItemsWithOldMenuItems:oldKeptCells[index].subCells basedOnStatusList:deleteMenuStatus];
+ NSArray<SDLMenuCell *> *cellsToAdd = [self sdl_filterAddMenuItemsWithNewMenuItems:newKeptCells[index].subCells basedOnStatusList:addMenuStatus];
+
+ // Transfer ids from subcell keeps to old subcells, which are stored in the current menu
+ NSArray<SDLMenuCell *> *oldSubcellKeeps = [self sdl_filterKeepMenuItems:oldKeptCells[index].subCells basedOnStatusList:deleteMenuStatus];
+ NSArray<SDLMenuCell *> *newSubcellKeeps = [self sdl_filterKeepMenuItems:newKeptCells[index].subCells basedOnStatusList:addMenuStatus];
+ [SDLMenuReplaceUtilities transferCellHandlersFromCells:newSubcellKeeps toCells:oldSubcellKeeps];
+
+ __weak typeof(self) weakself = self;
+ [self sdl_sendDeleteMenuCells:cellsToDelete withCompletionHandler:^(NSError * _Nullable error) {
+ if (weakself.isCancelled) { return completionHandler([NSError sdl_menuManager_replaceOperationCancelled]); }
+ if (error != nil) { return completionHandler(error); }
+
+ [weakself sdl_sendAddMenuCells:cellsToAdd withPositionsFromMenu:newKeptCells[index].subCells completionHandler:^(NSError * _Nullable error) {
+ if (weakself.isCancelled) { return completionHandler([NSError sdl_menuManager_replaceOperationCancelled]); }
+ if (error != nil) { return completionHandler(error); }
+
+ // After the first set of submenu cells were added and deleted we must find the next set of subcells until we loop through all the elements
+ [weakself sdl_updateSubMenuWithOldKeptCells:oldKeptCells newKeptCells:newKeptCells keptCellIndex:(index + 1) completionHandler:^(NSError * _Nullable error) {
+ completionHandler(error);
+ }];
+ }];
+ }];
+ } else {
+ // There are no subcells, we can skip to the next index.
+ [self sdl_updateSubMenuWithOldKeptCells:oldKeptCells newKeptCells:newKeptCells keptCellIndex:(index + 1) completionHandler:^(NSError * _Nullable error) {
+ completionHandler(error);
+ }];
+ }
+}
+
+#pragma mark - Adding / Deleting Cell RPCs
+
+/// Send Delete RPCs for given menu cells
+/// @param deleteMenuCells The menu cells to be deleted
+/// @param completionHandler A handler called when the RPCs are finished with an error if any failed
+- (void)sdl_sendDeleteMenuCells:(nullable NSArray<SDLMenuCell *> *)deleteMenuCells withCompletionHandler:(void(^)(NSError *_Nullable error))completionHandler {
+ if (deleteMenuCells.count == 0) { return completionHandler(nil); }
+
+ __block NSMutableDictionary<SDLRPCRequest *, NSError *> *errors = [NSMutableDictionary dictionary];
+ NSArray<SDLRPCRequest *> *deleteMenuCommands = [SDLMenuReplaceUtilities deleteCommandsForCells:deleteMenuCells];
+ [self.connectionManager sendRequests:deleteMenuCommands progressHandler:^void(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
+ if (error != nil) {
+ errors[request] = error;
+ } else if (response.success.boolValue) {
+ // Find the id of the successful request and remove it from the current menu list wherever it may have been
+ UInt32 commandId = [SDLMenuReplaceUtilities commandIdForRPCRequest:request];
+ [SDLMenuReplaceUtilities removeCellFromList:self.mutableCurrentMenu withCellId:commandId];
+ }
+ } completionHandler:^(BOOL success) {
+ if (!success) {
+ SDLLogE(@"Unable to delete all old menu commands with errors: %@", errors);
+ completionHandler([NSError sdl_menuManager_failedToUpdateWithDictionary:errors]);
+ } else {
+ SDLLogD(@"Finished deleting old menu");
+ completionHandler(nil);
+ }
+ }];
+}
+
+/// Send Add RPCs for given new menu cells compared to old menu cells
+/// @param addMenuCells The new menu cells we want displayed
+/// @param fullMenu The full menu from which the addMenuCells come. This allows us to grab the positions from that menu for the new cells
+/// @param completionHandler A handler called when the RPCs are finished with an error if any failed
+- (void)sdl_sendAddMenuCells:(NSArray<SDLMenuCell *> *)addMenuCells withPositionsFromMenu:(NSArray<SDLMenuCell *> *)fullMenu completionHandler:(void(^)(NSError *_Nullable error))completionHandler {
+ if (addMenuCells.count == 0) {
+ SDLLogV(@"There are no cells to update.");
+ return completionHandler(nil);
+ }
+
+ NSArray<SDLRPCRequest *> *mainMenuCommands = [SDLMenuReplaceUtilities mainMenuCommandsForCells:addMenuCells fileManager:self.fileManager usingPositionsFromFullMenu:fullMenu windowCapability:self.windowCapability defaultSubmenuLayout:self.menuConfiguration.defaultSubmenuLayout];
+ NSArray<SDLRPCRequest *> *subMenuCommands = [SDLMenuReplaceUtilities subMenuCommandsForCells:addMenuCells fileManager:self.fileManager windowCapability:self.windowCapability defaultSubmenuLayout:self.menuConfiguration.defaultSubmenuLayout];
+
+ __block NSMutableDictionary<SDLRPCRequest *, NSError *> *errors = [NSMutableDictionary dictionary];
+ __weak typeof(self) weakSelf = self;
+ [self.connectionManager sendRequests:mainMenuCommands progressHandler:^void(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
+ if (error != nil) {
+ errors[request] = error;
+ } else {
+ // Find the id of the successful request and add it from the current menu list wherever it needs to be
+ UInt32 commandId = [SDLMenuReplaceUtilities commandIdForRPCRequest:request];
+ UInt16 position = [SDLMenuReplaceUtilities positionForRPCRequest:request];
+ [SDLMenuReplaceUtilities addCellWithCellId:commandId position:position fromNewMenuList:addMenuCells toMainMenuList:weakSelf.mutableCurrentMenu];
+ }
+ } completionHandler:^(BOOL success) {
+ if (!success) {
+ SDLLogE(@"Failed to send main menu commands: %@", errors);
+ return completionHandler([NSError sdl_menuManager_failedToUpdateWithDictionary:errors]);
+ } else if (subMenuCommands.count == 0) {
+ SDLLogD(@"Finished sending new cells");
+ return completionHandler(nil);
+ }
+
+ [weakSelf.connectionManager sendRequests:subMenuCommands progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
+ if (error != nil) {
+ errors[request] = error;
+ } else {
+ // Find the id of the successful request and add it from the current menu list wherever it needs to be
+ UInt32 commandId = [SDLMenuReplaceUtilities commandIdForRPCRequest:request];
+ UInt16 position = [SDLMenuReplaceUtilities positionForRPCRequest:request];
+ [SDLMenuReplaceUtilities addCellWithCellId:commandId position:position fromNewMenuList:addMenuCells toMainMenuList:weakSelf.mutableCurrentMenu];
+ }
+ } completionHandler:^(BOOL success) {
+ if (!success) {
+ SDLLogE(@"Failed to send sub menu commands: %@", errors);
+ return completionHandler([NSError sdl_menuManager_failedToUpdateWithDictionary:errors]);
+ }
+
+ SDLLogD(@"Finished sending new cells");
+ completionHandler(nil);
+ }];
+ }];
+}
+
+#pragma mark - Dynamic Menu Helpers
+
+- (NSArray<SDLMenuCell *> *)sdl_filterDeleteMenuItemsWithOldMenuItems:(NSArray<SDLMenuCell *> *)oldMenuCells basedOnStatusList:(NSArray<NSNumber *> *)oldStatusList {
+ NSMutableArray<SDLMenuCell *> *deleteCells = [[NSMutableArray alloc] init];
+ // The index of the status should correlate 1-1 with the number of items in the menu
+ // [2,0,2,0] => [A,B,C,D] = [B,D]
+ for (NSUInteger index = 0; index < oldStatusList.count; index++) {
+ if (oldStatusList[index].integerValue == SDLMenuCellUpdateStateDelete) {
+ [deleteCells addObject:oldMenuCells[index]];
+ }
+ }
+ return [deleteCells copy];
+}
+
+- (NSArray<SDLMenuCell *> *)sdl_filterAddMenuItemsWithNewMenuItems:(NSArray<SDLMenuCell *> *)newMenuCells basedOnStatusList:(NSArray<NSNumber *> *)newStatusList {
+ NSMutableArray<SDLMenuCell *> *addCells = [[NSMutableArray alloc] init];
+ // The index of the status should correlate 1-1 with the number of items in the menu
+ // [2,1,2,1] => [A,B,C,D] = [B,D]
+ for (NSUInteger index = 0; index < newStatusList.count; index++) {
+ if (newStatusList[index].integerValue == SDLMenuCellUpdateStateAdd) {
+ [addCells addObject:newMenuCells[index]];
+ }
+ }
+ return [addCells copy];
+}
+
+- (NSArray<SDLMenuCell *> *)sdl_filterKeepMenuItems:(NSArray<SDLMenuCell *> *)menuCells basedOnStatusList:(NSArray<NSNumber *> *)keepStatusList {
+ NSMutableArray<SDLMenuCell *> *keepMenuCells = [[NSMutableArray alloc] init];
+
+ for (NSUInteger i = 0; i < keepStatusList.count; i++) {
+ if (keepStatusList[i].unsignedIntegerValue == SDLMenuCellUpdateStateKeep) {
+ [keepMenuCells addObject:menuCells[i]];
+ }
+ }
+ return [keepMenuCells copy];
+}
+
+#pragma mark - Menu Uniqueness
+
++ (NSArray<SDLMenuCell *> *)sdl_cellsWithRemovedPropertiesFromCells:(NSArray<SDLMenuCell *> *)menuCells basedOnWindowCapability:(SDLWindowCapability *)windowCapability {
+ NSArray<SDLMenuCell *> *removePropertiesCopy = [[NSArray alloc] initWithArray:menuCells copyItems:YES];
+ for (SDLMenuCell *cell in removePropertiesCopy) {
+ // Strip away fields that cannot be used to determine uniqueness visually including fields not supported by the HMI
+ cell.voiceCommands = nil;
+
+ // Don't check SDLImageFieldNameSubMenuIcon because it was added in 7.0 when the feature was added in 5.0. Just assume that if CommandIcon is not available, the submenu icon is not either.
+ if (![windowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
+ cell.icon = nil;
+ }
+
+ if (cell.subCells != nil) {
+ if (![windowCapability hasTextFieldOfName:SDLTextFieldNameMenuSubMenuSecondaryText]) {
+ cell.secondaryText = nil;
+ }
+ if (![windowCapability hasTextFieldOfName:SDLTextFieldNameMenuSubMenuTertiaryText]) {
+ cell.tertiaryText = nil;
+ }
+ if (![windowCapability hasImageFieldOfName:SDLImageFieldNameMenuSubMenuSecondaryImage]) {
+ cell.secondaryArtwork = nil;
+ }
+ cell.subCells = [self sdl_cellsWithRemovedPropertiesFromCells:cell.subCells basedOnWindowCapability:windowCapability];
+ } else {
+ if (![windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandSecondaryText]) {
+ cell.secondaryText = nil;
+ }
+ if (![windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandTertiaryText]) {
+ cell.tertiaryText = nil;
+ }
+ if (![windowCapability hasImageFieldOfName:SDLImageFieldNameMenuCommandSecondaryImage]) {
+ cell.secondaryArtwork = nil;
+ }
+ }
+ }
+
+ return removePropertiesCopy;
+}
+
++ (void)sdl_generateUniqueNamesForCells:(NSArray<SDLMenuCell *> *)menuCells supportsMenuUniqueness:(BOOL)supportsMenuUniqueness {
+ // Tracks how many of each cell primary text there are so that we can append numbers to make each unique as necessary
+ NSMutableDictionary<id<NSCopying>, NSNumber *> *dictCounter = [[NSMutableDictionary alloc] init];
+ for (NSUInteger i = 0; i < menuCells.count; i++) {
+ id<NSCopying> key = supportsMenuUniqueness ? menuCells[i] : menuCells[i].title;
+ NSNumber *counter = dictCounter[key];
+ if (counter != nil) {
+ counter = @(counter.intValue + 1);
+ dictCounter[key] = counter;
+ } else {
+ dictCounter[key] = @1;
+ }
+
+ counter = dictCounter[key];
+ if (counter.intValue > 1) {
+ menuCells[i].uniqueTitle = [NSString stringWithFormat: @"%@ (%d)", menuCells[i].title, counter.intValue];
+ }
+
+ if (menuCells[i].subCells.count > 0) {
+ [self sdl_generateUniqueNamesForCells:menuCells[i].subCells supportsMenuUniqueness:supportsMenuUniqueness];
+ }
+ }
+}
+
++ (void)sdl_applyUniqueNamesOnCells:(NSArray<SDLMenuCell *> *)fromMenuCells toCells:(NSArray<SDLMenuCell *> *)toMenuCells {
+ NSParameterAssert(fromMenuCells.count == toMenuCells.count);
+
+ for (NSUInteger i = 0; i < fromMenuCells.count; i++) {
+ toMenuCells[i].uniqueTitle = fromMenuCells[i].uniqueTitle;
+ if (fromMenuCells[i].subCells.count > 0) {
+ [self sdl_applyUniqueNamesOnCells:fromMenuCells[i].subCells toCells:toMenuCells[i].subCells];
+ }
+ }
+}
+
+#pragma mark - Getter / Setters
+
+- (void)setCurrentMenu:(NSArray<SDLMenuCell *> *)currentMenu {
+ _mutableCurrentMenu = [currentMenu mutableCopy];
+}
+
+- (NSArray<SDLMenuCell *> *)currentMenu {
+ return [_mutableCurrentMenu copy];
+}
+
+#pragma mark - Operation Overrides
+
+- (void)finishOperationWithError:(nullable NSError *)error {
+ if (error != nil) {
+ self.internalError = error;
+ }
+
+ [self finishOperation];
+}
+
+- (void)finishOperation {
+ SDLLogV(@"Finishing menu manager replace operation");
+ if (self.isCancelled) {
+ self.internalError = [NSError sdl_menuManager_replaceOperationCancelled];
+ }
+
+ self.currentMenuUpdatedHandler(self.currentMenu, self.error);
+ [super finishOperation];
+}
+
+- (nullable NSString *)name {
+ return @"com.sdl.menuManager.replaceMenu.dynamic";
+}
+
+- (NSOperationQueuePriority)queuePriority {
+ return NSOperationQueuePriorityNormal;
+}
+
+- (nullable NSError *)error {
+ return self.internalError;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLMenuReplaceUtilities.h b/SmartDeviceLink/private/SDLMenuReplaceUtilities.h
new file mode 100644
index 000000000..4488d0d4b
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMenuReplaceUtilities.h
@@ -0,0 +1,87 @@
+//
+// SDLMenuReplaceUtilities.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 1/22/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLMenuLayout.h"
+
+@class SDLArtwork;
+@class SDLFileManager;
+@class SDLMenuCell;
+@class SDLMenuConfiguration;
+@class SDLRPCRequest;
+@class SDLWindowCapability;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLMenuReplaceUtilities : NSObject
+
+#pragma mark - Ids
+
++ (void)addIdsToMenuCells:(NSArray<SDLMenuCell *> *)menuCells parentId:(UInt32)parentId;
+
++ (void)transferCellIDsFromCells:(NSArray<SDLMenuCell *> *)fromCells toCells:(NSArray<SDLMenuCell *> *)toCells;
+
++ (void)transferCellHandlersFromCells:(NSArray<SDLMenuCell *> *)fromCells toCells:(NSArray<SDLMenuCell *> *)toCells;
+
+#pragma mark - Artworks
+
+/// Finds all artworks that need to be uploaded from the given list of menu cells
+/// @param cells The cells to check for artwork
+/// @param fileManager The file manager to check if artworks need upload
+/// @param windowCapability The window capability to check available image fields
++ (NSArray<SDLArtwork *> *)findAllArtworksToBeUploadedFromCells:(NSArray<SDLMenuCell *> *)cells fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability;
+
+#pragma mark - RPC Commands
+
+/// Finds and returns the command id for a given RPC request, assuming that request is an SDLDeleteSubMenu, SDLDeleteCommand, SDLAddSubMenu, or SDLAddCommand
+/// @param request The request
++ (UInt32)commandIdForRPCRequest:(SDLRPCRequest *)request;
+
+/// Finds and returns the position for a given RPC request, assuming that request is an SDLAddSubMenu, or SDLAddCommand
+/// @param request The request
++ (UInt16)positionForRPCRequest:(SDLRPCRequest *)request;
+
+/// Generate SDLDeleteCommand and SDLDeleteSubMenu RPCs for the given cells
+/// @param cells The cells for which to generate delete RPCs
++ (NSArray<SDLRPCRequest *> *)deleteCommandsForCells:(NSArray<SDLMenuCell *> *)cells;
+
+/// Generate SDLAddCommand and SDLAddSubMenu RPCs for given main menu cells
+/// @param cells The cells to generate AddCommand / AddSubMenu RPCs for
+/// @param fileManager The file manager to use to check availability of artworks
+/// @param menu The menu from which we will manage indexes
+/// @param windowCapability The window capability with which to check available text fields / image fields
+/// @param defaultSubmenuLayout The default submenu layout to use for displaying submenus
++ (NSArray<SDLRPCRequest *> *)mainMenuCommandsForCells:(NSArray<SDLMenuCell *> *)cells fileManager:(SDLFileManager *)fileManager usingPositionsFromFullMenu:(NSArray<SDLMenuCell *> *)menu windowCapability:(SDLWindowCapability *)windowCapability defaultSubmenuLayout:(SDLMenuLayout)defaultSubmenuLayout;
+
+/// Generate SDLAddCommand and SDLAddSubMenu RPCs for the given submenu cells
+/// @param cells The cells to generate AddCommand / AddSubMenu RPCs for
+/// @param fileManager The file manager to use to check availability of artworks
+/// @param windowCapability The window capability with which to check available text fields / image fields
+/// @param defaultSubmenuLayout The default submenu layout to use for displaying submenus
++ (NSArray<SDLRPCRequest *> *)subMenuCommandsForCells:(NSArray<SDLMenuCell *> *)cells fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability defaultSubmenuLayout:(SDLMenuLayout)defaultSubmenuLayout;
+
+#pragma mark - Updating Menu Cells
+
+/// Find the menu cell given a command id and remove it from the list (or a cell in the list's subcell list, etc.)
+/// @param menuCellList The list to mutate and remove the item from
+/// @param commandId The id of the cell to find and remove
+/// @return YES if the cell was found and removed successfully, NO if it was not
++ (BOOL)removeCellFromList:(NSMutableArray<SDLMenuCell *> *)menuCellList withCellId:(UInt32)commandId;
+
+/// Finds a menu cell from newMenuList with the given commandId and inserts it into the main menu list (or a subcell list) at the given position
+/// @param commandId The command id for the cell to be found
+/// @param position The position to insert the cell into the appropriate list for it to be in
+/// @param newMenuList The complete requested new menu list. We will find the cell to insert from this list.
+/// @param mainMenuList The mutable main menu list. The place to insert the cell will be in this list or one of its cell's subcell list (or one of it's cell's subcell's subcell's list, etc.)
+/// @return YES if the cell was added successfully, NO if the cell was not
++ (BOOL)addCellWithCellId:(UInt32)commandId position:(UInt16)position fromNewMenuList:(NSArray<SDLMenuCell *> *)newMenuList toMainMenuList:(NSMutableArray <SDLMenuCell *> *)mainMenuList;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLMenuReplaceUtilities.m b/SmartDeviceLink/private/SDLMenuReplaceUtilities.m
new file mode 100644
index 000000000..4977a4794
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMenuReplaceUtilities.m
@@ -0,0 +1,344 @@
+//
+// SDLMenuReplaceUtilities.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 1/22/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLMenuReplaceUtilities.h"
+
+#import "SDLAddCommand.h"
+#import "SDLAddSubMenu.h"
+#import "SDLArtwork.h"
+#import "SDLDeleteCommand.h"
+#import "SDLDeleteSubMenu.h"
+#import "SDLFileManager.h"
+#import "SDLImage.h"
+#import "SDLImageFieldName.h"
+#import "SDLMenuCell.h"
+#import "SDLMenuParams.h"
+#import "SDLMenuManagerPrivateConstants.h"
+#import "SDLRPCRequest.h"
+#import "SDLWindowCapability.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
+
+@interface SDLMenuCell ()
+
+@property (assign, nonatomic) UInt32 parentCellId;
+@property (assign, nonatomic) UInt32 cellId;
+@property (copy, nonatomic, readwrite, nullable) NSArray<SDLMenuCell *> *subCells;
+@property (copy, nonatomic, readwrite, nullable) SDLMenuCellSelectionHandler handler;
+
+@end
+
+@interface SDLMenuReplaceUtilities ()
+
+@property (class, assign, nonatomic) UInt32 nextMenuId;
+
+@end
+
+@implementation SDLMenuReplaceUtilities
+static UInt32 _menuId = 0;
+
+#pragma mark Ids
+
++ (void)setNextMenuId:(UInt32)nextMenuId {
+ _menuId = nextMenuId;
+}
+
++ (UInt32)nextMenuId {
+ return ++_menuId;
+}
+
+/// Assign cell ids on an array of menu cells given a parent id (or no parent id)
+/// @param menuCells The array of menu cells to update
+/// @param parentId The parent id to assign if needed
++ (void)addIdsToMenuCells:(NSArray<SDLMenuCell *> *)menuCells parentId:(UInt32)parentId {
+ for (SDLMenuCell *cell in menuCells) {
+ cell.cellId = self.class.nextMenuId;
+ if (parentId != ParentIdNotFound) {
+ cell.parentCellId = parentId;
+ }
+ if (cell.subCells.count > 0) {
+ [self addIdsToMenuCells:cell.subCells parentId:cell.cellId];
+ }
+ }
+}
+
++ (void)transferCellIDsFromCells:(NSArray<SDLMenuCell *> *)fromCells toCells:(NSArray<SDLMenuCell *> *)toCells {
+ if (fromCells.count == 0 || fromCells.count != toCells.count) { return; }
+ for (NSUInteger i = 0; i < toCells.count; i++) {
+ toCells[i].cellId = fromCells[i].cellId;
+ }
+
+ // Update parent ids
+ for (SDLMenuCell *cell in toCells) {
+ if (cell.subCells == nil) { continue; }
+
+ for (SDLMenuCell *subCell in cell.subCells) {
+ subCell.parentCellId = cell.cellId;
+ }
+ }
+}
+
++ (void)transferCellHandlersFromCells:(NSArray<SDLMenuCell *> *)fromCells toCells:(NSArray<SDLMenuCell *> *)toCells {
+ if (fromCells.count == 0 || fromCells.count != toCells.count) { return; }
+ for (NSUInteger i = 0; i < toCells.count; i++) {
+ toCells[i].handler = fromCells[i].handler;
+ }
+}
+
+#pragma mark Artworks
+
++ (NSArray<SDLArtwork *> *)findAllArtworksToBeUploadedFromCells:(NSArray<SDLMenuCell *> *)cells fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability {
+ if (![windowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon]) { return @[]; }
+
+ NSMutableSet<SDLArtwork *> *mutableArtworks = [NSMutableSet set];
+ for (SDLMenuCell *cell in cells) {
+ if ((cell.icon != nil) && [fileManager fileNeedsUpload:cell.icon]) {
+ [mutableArtworks addObject:cell.icon];
+ }
+
+ if ((cell.secondaryArtwork != nil) && [fileManager fileNeedsUpload:cell.secondaryArtwork]) {
+ [mutableArtworks addObject:cell.secondaryArtwork];
+ }
+
+ if (cell.subCells.count > 0) {
+ [mutableArtworks addObjectsFromArray:[self findAllArtworksToBeUploadedFromCells:cell.subCells fileManager:fileManager windowCapability:windowCapability]];
+ }
+ }
+
+ return [mutableArtworks allObjects];
+}
+
+/// If there is an icon and the icon has been uploaded, or if the icon is a static icon, it should include the image
++ (BOOL)sdl_shouldCellIncludePrimaryImageFromCell:(SDLMenuCell *)cell fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability {
+ BOOL supportsImage = (cell.subCells != nil) ? [windowCapability hasImageFieldOfName:SDLImageFieldNameSubMenuIcon] : [windowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon];
+ return (cell.icon != nil) && supportsImage && ([fileManager hasUploadedFile:cell.icon] || cell.icon.isStaticIcon);
+}
+
+/// If there is an icon and the icon has been uploaded, or if the icon is a static icon, it should include the image
++ (BOOL)sdl_shouldCellIncludeSecondaryImageFromCell:(SDLMenuCell *)cell fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability {
+ BOOL supportsImage = (cell.subCells != nil) ? [windowCapability hasImageFieldOfName:SDLImageFieldNameMenuSubMenuSecondaryImage] : [windowCapability hasImageFieldOfName:SDLImageFieldNameMenuCommandSecondaryImage];
+ return (cell.secondaryArtwork != nil) && supportsImage && ([fileManager hasUploadedFile:cell.secondaryArtwork] || cell.secondaryArtwork.isStaticIcon);
+}
+
+#pragma mark - RPC Commands
+#pragma mark Retrieving Values
+
++ (UInt32)commandIdForRPCRequest:(SDLRPCRequest *)request {
+ UInt32 commandId = 0;
+ if ([request isMemberOfClass:[SDLAddCommand class]]) {
+ commandId = ((SDLAddCommand *)request).cmdID.unsignedIntValue;
+ } else if ([request isMemberOfClass:[SDLAddSubMenu class]]) {
+ commandId = ((SDLAddSubMenu *)request).menuID.unsignedIntValue;
+ } else if ([request isMemberOfClass:[SDLDeleteCommand class]]) {
+ commandId = ((SDLDeleteCommand *)request).cmdID.unsignedIntValue;
+ } else if ([request isMemberOfClass:[SDLDeleteSubMenu class]]) {
+ commandId = ((SDLDeleteSubMenu *)request).menuID.unsignedIntValue;
+ }
+
+ return commandId;
+}
+
++ (UInt16)positionForRPCRequest:(SDLRPCRequest *)request {
+ UInt16 position = 0;
+ if ([request isMemberOfClass:[SDLAddCommand class]]) {
+ position = ((SDLAddCommand *)request).menuParams.position.unsignedShortValue;
+ } else if ([request isMemberOfClass:[SDLAddSubMenu class]]) {
+ position = ((SDLAddSubMenu *)request).position.unsignedShortValue;
+ }
+
+ return position;
+}
+
+#pragma mark Generating RPCs
+
++ (NSArray<SDLRPCRequest *> *)deleteCommandsForCells:(NSArray<SDLMenuCell *> *)cells {
+ NSMutableArray<SDLRPCRequest *> *mutableDeletes = [NSMutableArray array];
+ for (SDLMenuCell *cell in cells) {
+ if (cell.subCells != nil) {
+ SDLDeleteSubMenu *delete = [[SDLDeleteSubMenu alloc] initWithId:cell.cellId];
+ [mutableDeletes addObject:delete];
+ } else {
+ SDLDeleteCommand *delete = [[SDLDeleteCommand alloc] initWithId:cell.cellId];
+ [mutableDeletes addObject:delete];
+ }
+ }
+
+ return [mutableDeletes copy];
+}
+
++ (NSArray<SDLRPCRequest *> *)mainMenuCommandsForCells:(NSArray<SDLMenuCell *> *)cells fileManager:(SDLFileManager *)fileManager usingPositionsFromFullMenu:(NSArray<SDLMenuCell *> *)menu windowCapability:(SDLWindowCapability *)windowCapability defaultSubmenuLayout:(SDLMenuLayout)defaultSubmenuLayout {
+ NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
+ for (NSUInteger menuInteger = 0; menuInteger < menu.count; menuInteger++) {
+ for (NSUInteger updateCellsIndex = 0; updateCellsIndex < cells.count; updateCellsIndex++) {
+ if ([menu[menuInteger] isEqual:cells[updateCellsIndex]]) {
+ if (cells[updateCellsIndex].subCells != nil) {
+ [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cells[updateCellsIndex] fileManager:fileManager position:(UInt16)menuInteger windowCapability:windowCapability defaultSubmenuLayout:defaultSubmenuLayout]];
+ } else {
+ [mutableCommands addObject:[self sdl_commandForMenuCell:cells[updateCellsIndex] fileManager:fileManager windowCapability:windowCapability position:(UInt16)menuInteger]];
+ }
+ break;
+ }
+ }
+ }
+
+ return [mutableCommands copy];
+}
+
++ (NSArray<SDLRPCRequest *> *)subMenuCommandsForCells:(NSArray<SDLMenuCell *> *)cells fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability defaultSubmenuLayout:(SDLMenuLayout)defaultSubmenuLayout {
+ NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
+ for (SDLMenuCell *cell in cells) {
+ if (cell.subCells != nil) {
+ [mutableCommands addObjectsFromArray:[self sdl_allCommandsForCells:cell.subCells fileManager:fileManager windowCapability:windowCapability defaultSubmenuLayout:defaultSubmenuLayout]];
+ }
+ }
+
+ return [mutableCommands copy];
+}
+
+#pragma mark Private Helpers
+
++ (NSArray<SDLRPCRequest *> *)sdl_allCommandsForCells:(NSArray<SDLMenuCell *> *)cells fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability defaultSubmenuLayout:(SDLMenuLayout)defaultSubmenuLayout {
+ NSMutableArray<SDLRPCRequest *> *mutableCommands = [NSMutableArray array];
+
+ for (NSUInteger cellIndex = 0; cellIndex < cells.count; cellIndex++) {
+ if (cells[cellIndex].subCells != nil) {
+ [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cells[cellIndex] fileManager:fileManager position:(UInt16)cellIndex windowCapability:windowCapability defaultSubmenuLayout:defaultSubmenuLayout]];
+ [mutableCommands addObjectsFromArray:[self sdl_allCommandsForCells:cells[cellIndex].subCells fileManager:fileManager windowCapability:windowCapability defaultSubmenuLayout:defaultSubmenuLayout]];
+ } else {
+ [mutableCommands addObject:[self sdl_commandForMenuCell:cells[cellIndex] fileManager:fileManager windowCapability:windowCapability position:(UInt16)cellIndex]];
+ }
+ }
+
+ return [mutableCommands copy];
+}
+
++ (SDLAddCommand *)sdl_commandForMenuCell:(SDLMenuCell *)cell fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability position:(UInt16)position {
+ SDLAddCommand *command = [[SDLAddCommand alloc] init];
+
+ SDLMenuParams *params = [[SDLMenuParams alloc] init];
+ params.menuName = cell.uniqueTitle;
+ params.secondaryText = ([windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandSecondaryText] && cell.secondaryText.length > 0) ? cell.secondaryText : nil;
+ params.tertiaryText = ([windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandTertiaryText] && cell.tertiaryText.length > 0) ? cell.tertiaryText : nil;
+ params.parentID = (cell.parentCellId != ParentIdNotFound) ? @(cell.parentCellId) : nil;
+ params.position = @(position);
+
+ command.menuParams = params;
+ command.vrCommands = (cell.voiceCommands.count == 0) ? nil : cell.voiceCommands;
+ command.cmdIcon = [self sdl_shouldCellIncludePrimaryImageFromCell:cell fileManager:fileManager windowCapability:windowCapability] ? cell.icon.imageRPC : nil;
+ command.secondaryImage = [self sdl_shouldCellIncludeSecondaryImageFromCell:cell fileManager:fileManager windowCapability:windowCapability] ? cell.secondaryArtwork.imageRPC : nil;
+ command.cmdID = @(cell.cellId);
+
+ return command;
+}
+
++ (SDLAddSubMenu *)sdl_subMenuCommandForMenuCell:(SDLMenuCell *)cell fileManager:(SDLFileManager *)fileManager position:(UInt16)position windowCapability:(SDLWindowCapability *)windowCapability defaultSubmenuLayout:(SDLMenuLayout)defaultSubmenuLayout {
+ NSString *secondaryText = ([windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandSecondaryText] && cell.secondaryText.length > 0) ? cell.secondaryText : nil;
+ NSString *tertiaryText = ([windowCapability hasTextFieldOfName:SDLTextFieldNameMenuCommandTertiaryText] && cell.tertiaryText.length > 0) ? cell.tertiaryText : nil;
+ SDLImage *icon = [self sdl_shouldCellIncludePrimaryImageFromCell:cell fileManager:fileManager windowCapability:windowCapability] ? cell.icon.imageRPC : nil;
+ SDLImage *secondaryIcon = [self sdl_shouldCellIncludeSecondaryImageFromCell:cell fileManager:fileManager windowCapability:windowCapability] ? cell.secondaryArtwork.imageRPC : nil;
+
+ SDLMenuLayout submenuLayout = nil;
+ if (cell.submenuLayout && [windowCapability.menuLayoutsAvailable containsObject:cell.submenuLayout]) {
+ submenuLayout = cell.submenuLayout;
+ } else {
+ submenuLayout = defaultSubmenuLayout;
+ }
+
+ return [[SDLAddSubMenu alloc] initWithMenuID:cell.cellId menuName:cell.uniqueTitle position:@(position) menuIcon:icon menuLayout:submenuLayout parentID:nil secondaryText:secondaryText tertiaryText:tertiaryText secondaryImage:secondaryIcon];
+}
+
+#pragma mark - Updating Menu Cells In Lists
+
++ (BOOL)removeCellFromList:(NSMutableArray<SDLMenuCell *> *)menuCellList withCellId:(UInt32)commandId {
+ for (SDLMenuCell *menuCell in menuCellList) {
+ if (menuCell.cellId == commandId) {
+ // If the cell id matches the command id, remove it from the list and return
+ [menuCellList removeObject:menuCell];
+ return YES;
+ } else if (menuCell.subCells.count > 0) {
+ // If the menu cell has subcells, we need to recurse and check the subcells
+ NSMutableArray<SDLMenuCell *> *newList = [menuCell.subCells mutableCopy];
+ BOOL foundAndRemovedItem = [self removeCellFromList:newList withCellId:commandId];
+ if (foundAndRemovedItem) {
+ menuCell.subCells = [newList copy];
+ return YES;
+ }
+ }
+ }
+
+ return NO;
+}
+
++ (BOOL)addCellWithCellId:(UInt32)cellId position:(UInt16)position fromNewMenuList:(NSArray<SDLMenuCell *> *)newMenuList toMainMenuList:(NSMutableArray <SDLMenuCell *> *)mainMenuList {
+ SDLMenuCell *addedCell = nil;
+ for (SDLMenuCell *cell in newMenuList) {
+ if (cell.cellId == cellId) {
+ addedCell = cell;
+ break;
+ } else if (cell.subCells.count > 0) {
+ BOOL success = [self addCellWithCellId:cellId position:position fromNewMenuList:cell.subCells toMainMenuList:mainMenuList];
+ if (success) { return YES; }
+ }
+ }
+
+ if (addedCell != nil) {
+ return [self sdl_addMenuCell:addedCell toList:mainMenuList atPosition:position];
+ }
+
+ return NO;
+}
+
++ (BOOL)sdl_addMenuCell:(SDLMenuCell *)cell toList:(NSMutableArray<SDLMenuCell *> *)menuCellList atPosition:(UInt16)position {
+ if (cell.parentCellId == ParentIdNotFound) {
+ // The cell does not have a parent id, just insert it into the main menu
+ [self sdl_insertMenuCell:cell intoList:menuCellList atPosition:position];
+ return YES;
+ }
+
+ // If the cell has a parent id, we need to find the cell with a matching cell id and insert it into its submenu
+ for (SDLMenuCell *menuCell in menuCellList) {
+ if (menuCell.cellId == cell.parentCellId) {
+ // If we found the correct submenu, insert it into that submenu
+ NSMutableArray<SDLMenuCell *> *newList = nil;
+ if (menuCell.subCells != nil) {
+ newList = [menuCell.subCells mutableCopy];
+ } else {
+ newList = [NSMutableArray array];
+ }
+
+ [self sdl_insertMenuCell:cell intoList:newList atPosition:position];
+ menuCell.subCells = [newList copy];
+ return YES;
+ } else if (menuCell.subCells.count > 0) {
+ // Check the subcells of this cell to see if any of those have cell ids that match the parent cell id
+ NSMutableArray<SDLMenuCell *> *newList = [menuCell.subCells mutableCopy];
+ BOOL foundAndAddedItem = [self sdl_addMenuCell:cell toList:newList atPosition:position];
+ if (foundAndAddedItem) {
+ menuCell.subCells = [newList copy];
+ return YES;
+ }
+ }
+ }
+
+ return NO;
+}
+
++ (void)sdl_insertMenuCell:(SDLMenuCell *)cell intoList:(NSMutableArray<SDLMenuCell *> *)cellList atPosition:(UInt16)position {
+ SDLMenuCell *cellToInsert = cell;
+ if (cellToInsert.subCells != nil) {
+ cellToInsert = [cell copy];
+ cellToInsert.subCells = @[];
+ }
+
+ if (position > cellList.count) {
+ [cellList addObject:cellToInsert];
+ } else {
+ [cellList insertObject:cellToInsert atIndex:position];
+ }
+}
+
+@end
diff --git a/SmartDeviceLink/private/SDLMenuShowOperation.h b/SmartDeviceLink/private/SDLMenuShowOperation.h
new file mode 100644
index 000000000..b79e3d163
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMenuShowOperation.h
@@ -0,0 +1,25 @@
+//
+// SDLMenuShowOperation.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 1/21/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLAsynchronousOperation.h"
+#import "SDLConnectionManagerType.h"
+
+@class SDLMenuCell;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLMenuShowOperation : SDLAsynchronousOperation
+typedef void(^SDLMenuShowCompletionBlock)(NSError *_Nullable error);
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager toMenuCell:(nullable SDLMenuCell *)menuCell completionHandler:(SDLMenuShowCompletionBlock)completionHandler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLMenuShowOperation.m b/SmartDeviceLink/private/SDLMenuShowOperation.m
new file mode 100644
index 000000000..c62bfb5c4
--- /dev/null
+++ b/SmartDeviceLink/private/SDLMenuShowOperation.m
@@ -0,0 +1,108 @@
+//
+// SDLMenuShowOperation.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 1/21/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLMenuShowOperation.h"
+
+#import "SDLError.h"
+#import "SDLGlobals.h"
+#import "SDLLogMacros.h"
+#import "SDLMenuCell.h"
+#import "SDLRPCResponse.h"
+#import "SDLResult.h"
+#import "SDLShowAppMenu.h"
+#import "SDLVersion.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLMenuCell()
+
+@property (assign, nonatomic) UInt32 parentCellId;
+@property (assign, nonatomic) UInt32 cellId;
+
+@end
+
+@interface SDLMenuShowOperation ()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (strong, nonatomic, nullable) SDLMenuCell *submenuCell;
+@property (copy, nonatomic) SDLMenuShowCompletionBlock showCompletionHandler;
+
+@property (copy, nonatomic, nullable) NSError *internalError;
+
+@end
+
+@implementation SDLMenuShowOperation
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager toMenuCell:(nullable SDLMenuCell *)menuCell completionHandler:(SDLMenuShowCompletionBlock)completionHandler {
+ self = [super init];
+ if (!self) {
+ completionHandler([NSError sdl_failedToCreateObjectOfClass:[SDLMenuShowOperation class]]);
+ return nil;
+ }
+
+ _connectionManager = connectionManager;
+ _submenuCell = menuCell;
+ _showCompletionHandler = completionHandler;
+
+ return self;
+}
+
+- (void)start {
+ [super start];
+ if (self.isCancelled) { return; }
+
+ SDLShowAppMenu *openMenu = nil;
+ if (self.submenuCell != nil) {
+ openMenu = [[SDLShowAppMenu alloc] initWithMenuID:self.submenuCell.cellId];
+ } else {
+ openMenu = [[SDLShowAppMenu alloc] init];
+ }
+
+ __weak typeof(self) weakself = self;
+ [self.connectionManager sendConnectionRequest:openMenu withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ if ([response.resultCode isEqualToEnum:SDLResultWarnings]) {
+ SDLLogW(@"Warning opening application menu with error: %@", error);
+ } else if (![response.resultCode isEqualToEnum:SDLResultSuccess]) {
+ SDLLogE(@"Error opening application menu with error: %@", error);
+ self.internalError = [NSError sdl_menuManager_openMenuOperationFailed:weakself.submenuCell];
+ } else {
+ SDLLogD(@"Successfully opened application menu");
+ }
+
+ [self finishOperation];
+ }];
+}
+
+#pragma mark - Operation Overrides
+
+- (void)finishOperation {
+ SDLLogV(@"Finishing menu manager configuration update operation");
+ if (self.isCancelled) {
+ self.internalError = [NSError sdl_menuManager_openMenuOperationCancelled];
+ }
+
+ self.showCompletionHandler(self.internalError);
+
+ [super finishOperation];
+}
+
+- (nullable NSString *)name {
+ return @"com.sdl.menuManager.openMenu";
+}
+
+- (NSOperationQueuePriority)queuePriority {
+ return NSOperationQueuePriorityNormal;
+}
+
+- (nullable NSError *)error {
+ return self.internalError;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLPreloadChoicesOperation.h b/SmartDeviceLink/private/SDLPreloadChoicesOperation.h
deleted file mode 100644
index 5434e60dd..000000000
--- a/SmartDeviceLink/private/SDLPreloadChoicesOperation.h
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// SDLPreloadChoicesOperation.h
-// SmartDeviceLink
-//
-// Created by Joel Fischer on 5/23/18.
-// Copyright © 2018 smartdevicelink. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-#import "SDLAsynchronousOperation.h"
-
-@class SDLChoiceCell;
-@class SDLFileManager;
-@class SDLWindowCapability;
-
-@protocol SDLConnectionManagerType;
-
-NS_ASSUME_NONNULL_BEGIN
-
-/// A handler run when the operation completes, containing the failed choice uploads.
-///
-/// @param failedChoiceUploadIDs The IDs of failed choice uploads
-typedef void(^SDLPreloadChoicesCompletionHandler)(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs);
-
-typedef NS_ENUM(NSUInteger, SDLPreloadChoicesOperationState) {
- SDLPreloadChoicesOperationStateWaitingToStart,
- SDLPreloadChoicesOperationStateUploadingArtworks,
- SDLPreloadChoicesOperationStatePreloadingChoices,
- SDLPreloadChoicesOperationStateFinished
-};
-
-@interface SDLPreloadChoicesOperation : SDLAsynchronousOperation
-
-@property (assign, nonatomic) SDLPreloadChoicesOperationState currentState;
-
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)defaultMainWindowCapability isVROptional:(BOOL)isVROptional cellsToPreload:(NSOrderedSet<SDLChoiceCell *> *)cells updateCompletionHandler:(SDLPreloadChoicesCompletionHandler)completionHandler;
-
-- (BOOL)removeChoicesFromUpload:(NSSet<SDLChoiceCell *> *)choices;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLPreloadChoicesOperation.m b/SmartDeviceLink/private/SDLPreloadChoicesOperation.m
deleted file mode 100644
index a9fd94f6d..000000000
--- a/SmartDeviceLink/private/SDLPreloadChoicesOperation.m
+++ /dev/null
@@ -1,243 +0,0 @@
-//
-// SDLPreloadChoicesOperation.m
-// SmartDeviceLink
-//
-// Created by Joel Fischer on 5/23/18.
-// Copyright © 2018 smartdevicelink. All rights reserved.
-//
-
-#import "SDLPreloadChoicesOperation.h"
-
-#import "SDLChoice.h"
-#import "SDLChoiceCell.h"
-#import "SDLConnectionManagerType.h"
-#import "SDLCreateInteractionChoiceSet.h"
-#import "SDLCreateInteractionChoiceSetResponse.h"
-#import "SDLDisplayType.h"
-#import "SDLError.h"
-#import "SDLFileManager.h"
-#import "SDLImage.h"
-#import "SDLLogMacros.h"
-#import "SDLWindowCapability.h"
-#import "SDLWindowCapability+ScreenManagerExtensions.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface SDLChoiceCell()
-
-@property (assign, nonatomic) UInt16 choiceId;
-
-@end
-
-@interface SDLPreloadChoicesOperation()
-
-@property (strong, nonatomic) NSUUID *operationId;
-@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *cellsToUpload;
-@property (strong, nonatomic) SDLWindowCapability *windowCapability;
-@property (strong, nonatomic) NSString *displayName;
-@property (assign, nonatomic, getter=isVROptional) BOOL vrOptional;
-@property (copy, nonatomic) SDLPreloadChoicesCompletionHandler completionHandler;
-
-@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
-@property (weak, nonatomic) SDLFileManager *fileManager;
-@property (copy, nonatomic, nullable) NSError *internalError;
-@property (strong, nonatomic) NSMutableArray<NSNumber *> *failedChoiceUploadIDs;
-
-@end
-
-@implementation SDLPreloadChoicesOperation
-
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)defaultMainWindowCapability isVROptional:(BOOL)isVROptional cellsToPreload:(NSOrderedSet<SDLChoiceCell *> *)cells updateCompletionHandler:(SDLPreloadChoicesCompletionHandler)completionHandler {
- self = [super init];
- if (!self) { return nil; }
-
- _connectionManager = connectionManager;
- _fileManager = fileManager;
- _displayName = displayName;
- _windowCapability = defaultMainWindowCapability;
- _vrOptional = isVROptional;
- _cellsToUpload = [cells mutableCopy];
- _completionHandler = completionHandler;
- _operationId = [NSUUID UUID];
-
- _currentState = SDLPreloadChoicesOperationStateWaitingToStart;
- _failedChoiceUploadIDs = [NSMutableArray array];
-
- return self;
-}
-
-- (void)start {
- [super start];
- if (self.isCancelled) { return; }
-
- [self sdl_preloadCellArtworksWithCompletionHandler:^(NSError * _Nullable error) {
- self.internalError = error;
-
- [self sdl_preloadCells];
- }];
-}
-
-- (BOOL)removeChoicesFromUpload:(NSSet<SDLChoiceCell *> *)choices {
- if (self.isExecuting) { return NO; }
-
- [self.cellsToUpload minusSet:choices];
- return YES;
-}
-
-#pragma mark - Sending Choice Data
-
-- (void)sdl_preloadCellArtworksWithCompletionHandler:(void(^)(NSError *_Nullable))completionHandler {
- _currentState = SDLPreloadChoicesOperationStateUploadingArtworks;
-
- NSMutableArray<SDLArtwork *> *artworksToUpload = [NSMutableArray arrayWithCapacity:self.cellsToUpload.count];
- for (SDLChoiceCell *cell in self.cellsToUpload) {
- if ([self sdl_shouldSendChoicePrimaryImage] && [self.fileManager fileNeedsUpload:cell.artwork]) {
- [artworksToUpload addObject:cell.artwork];
- }
- if ([self sdl_shouldSendChoiceSecondaryImage] && [self.fileManager fileNeedsUpload:cell.secondaryArtwork]) {
- [artworksToUpload addObject:cell.secondaryArtwork];
- }
- }
-
- if (artworksToUpload.count == 0) {
- SDLLogD(@"No choice artworks to be uploaded");
- completionHandler(nil);
- return;
- }
-
- [self.fileManager uploadArtworks:[artworksToUpload copy] completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
- if (error != nil) {
- SDLLogE(@"Error uploading choice artworks: %@", error);
- } else {
- SDLLogD(@"Finished uploading choice artworks");
- SDLLogV(@"%@", artworkNames);
- }
-
- completionHandler(error);
- }];
-}
-
-- (void)sdl_preloadCells {
- _currentState = SDLPreloadChoicesOperationStatePreloadingChoices;
-
- NSMutableArray<SDLCreateInteractionChoiceSet *> *choiceRPCs = [NSMutableArray arrayWithCapacity:self.cellsToUpload.count];
- for (SDLChoiceCell *cell in self.cellsToUpload) {
- SDLCreateInteractionChoiceSet *csCell = [self sdl_choiceFromCell:cell];
- if (csCell != nil) {
- [choiceRPCs addObject:csCell];
- }
- }
- if (choiceRPCs.count == 0) {
- SDLLogE(@"All choice cells to send are nil, so the choice set will not be shown");
- self.internalError = [NSError sdl_choiceSetManager_failedToCreateMenuItems];
- [self finishOperation];
- return;
- }
-
- __weak typeof(self) weakSelf = self;
- __block NSMutableDictionary<SDLRPCRequest *, NSError *> *errors = [NSMutableDictionary dictionary];
- [self.connectionManager sendRequests:[choiceRPCs copy] progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
- if (error != nil) {
- errors[request] = error;
- SDLCreateInteractionChoiceSet *sentRequest = (SDLCreateInteractionChoiceSet *)request;
- [self.failedChoiceUploadIDs addObject:sentRequest.choiceSet.firstObject.choiceID];
- }
- } completionHandler:^(BOOL success) {
- if (!success) {
- SDLLogE(@"Error preloading choice cells: %@", errors);
- weakSelf.internalError = [NSError sdl_choiceSetManager_choiceUploadFailed:errors];
- }
-
- SDLLogD(@"Finished preloading choice cells");
-
- [weakSelf finishOperation];
- }];
-}
-
-#pragma mark - Assembling Choice Data
-
-- (nullable SDLCreateInteractionChoiceSet *)sdl_choiceFromCell:(SDLChoiceCell *)cell {
- NSArray<NSString *> *vrCommands = nil;
- if (cell.voiceCommands == nil) {
- vrCommands = self.isVROptional ? nil : @[[NSString stringWithFormat:@"%hu", cell.choiceId]];
- } else {
- vrCommands = cell.voiceCommands;
- }
-
- NSString *menuName = nil;
- if ([self sdl_shouldSendChoiceText]) {
- menuName = cell.uniqueText;
- }
-
- if(!menuName) {
- SDLLogE(@"Could not convert SDLChoiceCell to SDLCreateInteractionChoiceSet. It will not be shown. Cell: %@", cell);
- return nil;
- }
-
- NSString *secondaryText = [self sdl_shouldSendChoiceSecondaryText] ? cell.secondaryText : nil;
- NSString *tertiaryText = [self sdl_shouldSendChoiceTertiaryText] ? cell.tertiaryText : nil;
-
- SDLImage *image = [self sdl_shouldSendChoicePrimaryImage] ? cell.artwork.imageRPC : nil;
- SDLImage *secondaryImage = [self sdl_shouldSendChoiceSecondaryImage] ? cell.secondaryArtwork.imageRPC : nil;
-
- SDLChoice *choice = [[SDLChoice alloc] initWithId:cell.choiceId menuName:(NSString *_Nonnull)menuName vrCommands:(NSArray<NSString *> * _Nonnull)vrCommands image:image secondaryText:secondaryText secondaryImage:secondaryImage tertiaryText:tertiaryText];
-
- return [[SDLCreateInteractionChoiceSet alloc] initWithId:(UInt32)choice.choiceID.unsignedIntValue choiceSet:@[choice]];
-}
-
-/// Determine if we should send primary text. If textFields is nil, we don't know the capabilities and we will send everything.
-- (BOOL)sdl_shouldSendChoiceText {
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- if ([self.displayName isEqualToString:SDLDisplayTypeGen38Inch]) {
- return YES;
- }
-#pragma clang diagnostic pop
-
- return [self.windowCapability hasTextFieldOfName:SDLTextFieldNameMenuName];
-}
-
-/// Determine if we should send secondary text. If textFields is nil, we don't know the capabilities and we will send everything.
-- (BOOL)sdl_shouldSendChoiceSecondaryText {
- return [self.windowCapability hasTextFieldOfName:SDLTextFieldNameSecondaryText];
-}
-
-/// Determine if we should send teriary text. If textFields is nil, we don't know the capabilities and we will send everything.
-- (BOOL)sdl_shouldSendChoiceTertiaryText {
- return [self.windowCapability hasTextFieldOfName:SDLTextFieldNameTertiaryText];
-}
-
-/// Determine if we should send the primary image. If imageFields is nil, we don't know the capabilities and we will send everything.
-- (BOOL)sdl_shouldSendChoicePrimaryImage {
- return [self.windowCapability hasImageFieldOfName:SDLImageFieldNameChoiceImage];
-}
-
-/// Determine if we should send the secondary image. If imageFields is nil, we don't know the capabilities and we will send everything.
-- (BOOL)sdl_shouldSendChoiceSecondaryImage {
- return [self.windowCapability hasImageFieldOfName:SDLImageFieldNameChoiceSecondaryImage];
-}
-
-#pragma mark - Property Overrides
-
-- (void)finishOperation {
- _currentState = SDLPreloadChoicesOperationStateFinished;
- self.completionHandler(self.failedChoiceUploadIDs);
-
- [super finishOperation];
-}
-
-- (nullable NSString *)name {
- return [NSString stringWithFormat:@"%@ - %@", self.class, self.operationId];
-}
-
-- (NSOperationQueuePriority)queuePriority {
- return NSOperationQueuePriorityNormal;
-}
-
-- (nullable NSError *)error {
- return self.internalError;
-}
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLPreloadPresentChoicesOperation.h b/SmartDeviceLink/private/SDLPreloadPresentChoicesOperation.h
new file mode 100644
index 000000000..45922dbc0
--- /dev/null
+++ b/SmartDeviceLink/private/SDLPreloadPresentChoicesOperation.h
@@ -0,0 +1,41 @@
+//
+// SDLPreloadChoicesOperation.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 5/23/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLAsynchronousOperation.h"
+#import "SDLInteractionMode.h"
+#import "SDLKeyboardDelegate.h"
+#import "SDLTriggerSource.h"
+
+@class SDLChoiceCell;
+@class SDLChoiceSet;
+@class SDLFileManager;
+@class SDLKeyboardProperties;
+@class SDLWindowCapability;
+
+@protocol SDLConnectionManagerType;
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^SDLUploadChoicesCompletionHandler)(NSSet<SDLChoiceCell *> *updatedLoadedCells, NSError *_Nullable error);
+
+@interface SDLPreloadPresentChoicesOperation : SDLAsynchronousOperation
+
+/// The cells that are loaded on the head unit
+@property (strong, nonatomic) NSSet<SDLChoiceCell *> *loadedCells;
+
+// Preload only init
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)defaultMainWindowCapability isVROptional:(BOOL)isVROptional cellsToPreload:(NSArray<SDLChoiceCell *> *)cellsToPreload loadedCells:(NSSet<SDLChoiceCell *> *)loadedCells preloadCompletionHandler:(SDLUploadChoicesCompletionHandler)preloadCompletionHandler;
+
+/// Preload and Present Init
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID displayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)windowCapability isVROptional:(BOOL)isVROptional loadedCells:(NSSet<SDLChoiceCell *> *)loadedCells preloadCompletionHandler:(SDLUploadChoicesCompletionHandler)preloadCompletionHandler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLPreloadPresentChoicesOperation.m b/SmartDeviceLink/private/SDLPreloadPresentChoicesOperation.m
new file mode 100644
index 000000000..a2d42c333
--- /dev/null
+++ b/SmartDeviceLink/private/SDLPreloadPresentChoicesOperation.m
@@ -0,0 +1,632 @@
+//
+// SDLPreloadChoicesOperation.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 5/23/18.
+// Copyright © 2018 smartdevicelink. All rights reserved.
+//
+
+#import "SDLPreloadPresentChoicesOperation.h"
+
+#import "SDLCancelInteraction.h"
+#import "SDLChoice.h"
+#import "SDLChoiceCell.h"
+#import "SDLChoiceSet.h"
+#import "SDLChoiceSetDelegate.h"
+#import "SDLConnectionManagerType.h"
+#import "SDLCreateInteractionChoiceSet.h"
+#import "SDLCreateInteractionChoiceSetResponse.h"
+#import "SDLDisplayType.h"
+#import "SDLError.h"
+#import "SDLFileManager.h"
+#import "SDLGlobals.h"
+#import "SDLImage.h"
+#import "SDLKeyboardProperties.h"
+#import "SDLLogMacros.h"
+#import "SDLOnKeyboardInput.h"
+#import "SDLPreloadPresentChoicesOperationUtilities.h"
+#import "SDLPerformInteraction.h"
+#import "SDLPerformInteractionResponse.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLSetGlobalProperties.h"
+#import "SDLVersion.h"
+#import "SDLWindowCapability.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NS_ENUM(NSUInteger, SDLPreloadPresentChoicesOperationState) {
+ SDLPreloadPresentChoicesOperationStateNotStarted,
+ SDLPreloadPresentChoicesOperationStateUploadingImages,
+ SDLPreloadPresentChoicesOperationStateUploadingChoices,
+ SDLPreloadPresentChoicesOperationStateUpdatingKeyboardProperties,
+ SDLPreloadPresentChoicesOperationStatePresentingChoices,
+ SDLPreloadPresentChoicesOperationStateCancellingPresentChoices,
+ SDLPreloadPresentChoicesOperationStateResettingKeyboardProperties,
+ SDLPreloadPresentChoicesOperationStateFinishing
+};
+
+@interface SDLChoiceCell()
+
+@property (assign, nonatomic) UInt16 choiceId;
+@property (copy, nonatomic, readwrite, nullable) NSString *secondaryText;
+@property (copy, nonatomic, readwrite, nullable) NSString *tertiaryText;
+@property (copy, nonatomic, readwrite, nullable) NSArray<NSString *> *voiceCommands;
+@property (strong, nonatomic, readwrite, nullable) SDLArtwork *artwork;
+@property (strong, nonatomic, readwrite, nullable) SDLArtwork *secondaryArtwork;
+
+@property (assign, nonatomic) NSUInteger uniqueTextId;
+
+@end
+
+@interface SDLChoiceSet()
+
+@property (copy, nonatomic) SDLChoiceSetCanceledHandler canceledHandler;
+
+@end
+
+@interface SDLPreloadPresentChoicesOperation()
+
+// Dependencies
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (strong, nonatomic) SDLWindowCapability *windowCapability;
+
+// Preload Dependencies
+@property (strong, nonatomic) NSMutableOrderedSet<SDLChoiceCell *> *cellsToUpload;
+@property (strong, nonatomic) NSString *displayName;
+@property (assign, nonatomic, getter=isVROptional) BOOL vrOptional;
+@property (copy, nonatomic) SDLUploadChoicesCompletionHandler preloadCompletionHandler;
+
+// Present Dependencies
+@property (strong, nonatomic) SDLChoiceSet *choiceSet;
+@property (strong, nonatomic, nullable) SDLInteractionMode presentationMode;
+@property (strong, nonatomic, nullable) SDLKeyboardProperties *originalKeyboardProperties;
+@property (strong, nonatomic, nullable) SDLKeyboardProperties *customKeyboardProperties;
+@property (weak, nonatomic, nullable) id<SDLKeyboardDelegate> keyboardDelegate;
+@property (assign, nonatomic) UInt16 cancelId;
+
+// Internal operation properties
+@property (assign, nonatomic) SDLPreloadPresentChoicesOperationState currentState;
+@property (strong, nonatomic) NSUUID *operationId;
+@property (copy, nonatomic, nullable) NSError *internalError;
+
+// Mutable state
+@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *mutableLoadedCells;
+
+// Present completion handler properties
+@property (strong, nonatomic, nullable) SDLChoiceCell *selectedCell;
+@property (strong, nonatomic, nullable) SDLTriggerSource selectedTriggerSource;
+@property (assign, nonatomic) NSUInteger selectedCellRow;
+
+@end
+
+@implementation SDLPreloadPresentChoicesOperation
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)windowCapability isVROptional:(BOOL)isVROptional cellsToPreload:(NSArray<SDLChoiceCell *> *)cellsToPreload loadedCells:(NSSet<SDLChoiceCell *> *)loadedCells preloadCompletionHandler:(SDLUploadChoicesCompletionHandler)preloadCompletionHandler {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _currentState = SDLPreloadPresentChoicesOperationStateNotStarted;
+ _operationId = [NSUUID UUID];
+
+ _connectionManager = connectionManager;
+ _fileManager = fileManager;
+ _cancelId = UINT16_MAX;
+ _displayName = displayName;
+ _windowCapability = windowCapability;
+ _vrOptional = isVROptional;
+
+ _cellsToUpload = [NSMutableOrderedSet orderedSetWithArray:cellsToPreload];
+ _mutableLoadedCells = [loadedCells mutableCopy];
+ _preloadCompletionHandler = preloadCompletionHandler;
+
+ return self;
+}
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID displayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)windowCapability isVROptional:(BOOL)isVROptional loadedCells:(NSSet<SDLChoiceCell *> *)loadedCells preloadCompletionHandler:(SDLUploadChoicesCompletionHandler)preloadCompletionHandler {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _currentState = SDLPreloadPresentChoicesOperationStateNotStarted;
+ _operationId = [NSUUID UUID];
+
+ _connectionManager = connectionManager;
+ _fileManager = fileManager;
+ _choiceSet = choiceSet;
+ _presentationMode = mode;
+
+ __weak typeof(self) weakSelf = self;
+ _choiceSet.canceledHandler = ^{
+ [weakSelf sdl_cancelInteraction];
+ };
+
+ _originalKeyboardProperties = originalKeyboardProperties;
+ _customKeyboardProperties = originalKeyboardProperties;
+ _keyboardDelegate = keyboardDelegate;
+ _cancelId = cancelID;
+
+ _displayName = displayName;
+ _windowCapability = windowCapability;
+ _vrOptional = isVROptional;
+ _mutableLoadedCells = [loadedCells mutableCopy];
+ _cellsToUpload = [NSMutableOrderedSet orderedSetWithArray:choiceSet.choices];
+ _preloadCompletionHandler = preloadCompletionHandler;
+
+ _selectedCellRow = NSNotFound;
+
+ return self;
+}
+
+- (void)start {
+ [super start];
+ if (self.isCancelled) { return; }
+
+ // If we have no loaded cells, reset choice ids to ensure reconnections restart numbering
+ if (self.loadedCells.count == 0) {
+ SDLPreloadPresentChoicesOperationUtilities.choiceId = 0;
+ SDLPreloadPresentChoicesOperationUtilities.reachedMaxId = NO;
+ }
+
+ // Remove cells that are already loaded so that we don't try to re-upload them
+ [self.cellsToUpload minusSet:self.loadedCells];
+
+ // If loaded cells is full and we need to upload cells, just fail the operation since we can't successfully upload or present
+ if ((self.loadedCells.count == UINT16_MAX) && (self.cellsToUpload.count > 0)) {
+ return [self finishOperation:[NSError sdl_choiceSetManager_noIdsAvailable]];
+ }
+
+ // Assign Ids, then make cells to upload unique so that they upload properly (if necessary)
+ [SDLPreloadPresentChoicesOperationUtilities assignIdsToCells:self.cellsToUpload loadedCells:self.loadedCells];
+ [SDLPreloadPresentChoicesOperationUtilities makeCellsToUploadUnique:self.cellsToUpload basedOnLoadedCells:self.mutableLoadedCells windowCapability:self.windowCapability];
+
+ // If we have a choice set, we need to replace the choices with the cells that we're uploading (with new ids and unique text) and the cells that are already on the head unit (with the correct cell ids and unique text)
+ if (self.choiceSet != nil) {
+ [SDLPreloadPresentChoicesOperationUtilities updateChoiceSet:self.choiceSet withLoadedCells:self.loadedCells cellsToUpload:self.cellsToUpload.set];
+ }
+
+ // Start uploading cell artworks, then cells themselves, then determine if we want to present, then update keyboard properties if necessary, then present the choice set, then revert keyboard properties if necessary
+ [self sdl_uploadCellArtworksWithCompletionHandler:^(NSError * _Nullable uploadArtError) {
+ // If some artworks failed to upload, we are still going to try to load the cells
+ if (self.isCancelled || uploadArtError != nil) { return [self finishOperation:uploadArtError]; }
+
+ [self sdl_uploadCellsWithCompletionHandler:^(NSError * _Nullable uploadCellsError) {
+ // If this operation has been cancelled or if there was an error with loading the cells, we don't want to present, so we'll end the operation
+ if (self.isCancelled || uploadCellsError != nil) { return [self finishOperation:uploadCellsError]; }
+
+ // If necessary, present the choice set
+ if (self.choiceSet == nil) { return [self finishOperation]; }
+ [self sdl_updateKeyboardPropertiesWithCompletionHandler:^(NSError * _Nullable updateKeyboardPropertiesError) {
+ if (self.isCancelled || updateKeyboardPropertiesError != nil) { return [self finishOperation]; }
+
+ [self sdl_presentChoiceSetWithCompletionHandler:^(NSError * _Nullable presentError) {
+ [self sdl_resetKeyboardPropertiesWithCompletionHandler:^(NSError * _Nullable resetKeyboardPropertiesError) {
+ if (presentError != nil) { return [self finishOperation:presentError]; }
+ return [self finishOperation:resetKeyboardPropertiesError];
+ }];
+ }];
+ }];
+ }];
+ }];
+}
+
+#pragma mark - Getters / Setters
+
+- (void)setLoadedCells:(NSSet<SDLChoiceCell *> *)loadedCells {
+ _mutableLoadedCells = [loadedCells mutableCopy];
+}
+
+- (NSSet<SDLChoiceCell *> *)loadedCells {
+ return [_mutableLoadedCells copy];
+}
+
+#pragma mark - Uploading Choice Data
+
+- (void)sdl_uploadCellArtworksWithCompletionHandler:(void(^)(NSError *_Nullable error))completionHandler {
+ self.currentState = SDLPreloadPresentChoicesOperationStateUploadingImages;
+
+ NSArray<SDLArtwork *> *artworksToUpload = [self.class sdl_findAllArtworksToBeUploadedFromCells:self.cellsToUpload.array fileManager:self.fileManager windowCapability:self.windowCapability];
+ if (artworksToUpload.count == 0) {
+ SDLLogD(@"No choice artworks to be uploaded");
+ return completionHandler(nil);
+ }
+
+ [self.fileManager uploadArtworks:[artworksToUpload copy] completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogE(@"Error uploading choice artworks: %@", error);
+ } else {
+ SDLLogD(@"Finished uploading choice artworks");
+ SDLLogV(@"%@", artworkNames);
+ }
+
+ completionHandler(error);
+ }];
+}
+
+- (void)sdl_uploadCellsWithCompletionHandler:(void(^)(NSError *_Nullable error))completionHandler {
+ self.currentState = SDLPreloadPresentChoicesOperationStateUploadingChoices;
+ if (self.cellsToUpload.count == 0) { return completionHandler(nil); }
+
+ NSMutableArray<SDLCreateInteractionChoiceSet *> *choiceRPCs = [NSMutableArray arrayWithCapacity:self.cellsToUpload.count];
+ for (SDLChoiceCell *cell in self.cellsToUpload) {
+ SDLCreateInteractionChoiceSet *csCell = [self.class sdl_choiceFromCell:cell windowCapability:self.windowCapability displayName:self.displayName isVROptional:self.isVROptional];
+ if (csCell != nil) {
+ [choiceRPCs addObject:csCell];
+ }
+ }
+ if (choiceRPCs.count == 0) {
+ SDLLogE(@"All choice cells to send are nil, so the choice set will not be shown");
+ return completionHandler([NSError sdl_choiceSetManager_failedToCreateMenuItems]);
+ }
+
+ __weak typeof(self) weakSelf = self;
+ __block NSMutableDictionary<SDLRPCRequest *, NSError *> *errors = [NSMutableDictionary dictionary];
+ [self.connectionManager sendRequests:[choiceRPCs copy] progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) {
+ SDLCreateInteractionChoiceSet *sentRequest = (SDLCreateInteractionChoiceSet *)request;
+ if (error != nil) {
+ errors[request] = error;
+ } else {
+ [weakSelf.mutableLoadedCells addObject:[self sdl_cellFromChoiceId:(UInt16)sentRequest.interactionChoiceSetID.unsignedIntValue]];
+ }
+ } completionHandler:^(BOOL success) {
+ NSError *preloadError = nil;
+ if (!success) {
+ SDLLogE(@"Error preloading choice cells: %@", errors);
+ preloadError = [NSError sdl_choiceSetManager_choiceUploadFailed:errors];
+ }
+
+ SDLLogD(@"Finished preloading choice cells");
+
+ return completionHandler(preloadError);
+ }];
+}
+
+#pragma mark - Artwork
+
+/// Get an array of artwork that needs to be uploaded form a list of menu cells
+/// @param cells The menu cells to get artwork from
+/// @param fileManager The file manager to use for checking artwork availability
+/// @param windowCapability The window capability to use to check if artwork fields are supported
+/// @returns The array of artwork that needs to be uploaded
++ (NSArray<SDLArtwork *> *)sdl_findAllArtworksToBeUploadedFromCells:(NSArray<SDLChoiceCell *> *)cells fileManager:(SDLFileManager *)fileManager windowCapability:(SDLWindowCapability *)windowCapability {
+ NSMutableSet<SDLArtwork *> *mutableArtworks = [NSMutableSet set];
+ for (SDLChoiceCell *cell in cells) {
+ if ([windowCapability hasImageFieldOfName:SDLImageFieldNameChoiceImage] && [fileManager fileNeedsUpload:cell.artwork]) {
+ [mutableArtworks addObject:cell.artwork];
+ }
+
+ if ([windowCapability hasImageFieldOfName:SDLImageFieldNameChoiceSecondaryImage] && [fileManager fileNeedsUpload:cell.secondaryArtwork]) {
+ [mutableArtworks addObject:cell.secondaryArtwork];
+ }
+ }
+
+ return [mutableArtworks allObjects];
+}
+
+#pragma mark - Presenting Choice Set
+
+#pragma mark Updating Keyboard Properties
+
+- (void)sdl_updateKeyboardPropertiesWithCompletionHandler:(void(^)(NSError *_Nullable))completionHandler {
+ self.currentState = SDLPreloadPresentChoicesOperationStateUpdatingKeyboardProperties;
+ if (self.keyboardDelegate == nil) { return completionHandler(nil); }
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_keyboardInputNotification:) name:SDLDidReceiveKeyboardInputNotification object:nil];
+
+ // Check if we're using a keyboard (searchable) choice set and setup keyboard properties if we need to
+ if (self.keyboardDelegate != nil && [self.keyboardDelegate respondsToSelector:@selector(customKeyboardConfiguration)]) {
+ SDLKeyboardProperties *customProperties = self.keyboardDelegate.customKeyboardConfiguration;
+ if (customProperties != nil) {
+ self.customKeyboardProperties = customProperties;
+ }
+ }
+
+ // Create the keyboard configuration based on the window capability's keyboard capabilities
+ SDLKeyboardProperties *modifiedKeyboardConfig = [self.windowCapability createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:self.customKeyboardProperties];
+ if (modifiedKeyboardConfig == nil) { return completionHandler(nil); }
+
+ SDLSetGlobalProperties *setProperties = [[SDLSetGlobalProperties alloc] init];
+ setProperties.keyboardProperties = modifiedKeyboardConfig;
+
+ [self.connectionManager sendConnectionRequest:setProperties withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogE(@"Error setting keyboard properties to new value: %@, with error: %@", request, error);
+ }
+
+ return completionHandler(error);
+ }];
+}
+
+- (void)sdl_resetKeyboardPropertiesWithCompletionHandler:(void(^)(NSError *_Nullable))completionHandler {
+ self.currentState = SDLPreloadPresentChoicesOperationStateResettingKeyboardProperties;
+ if (self.keyboardDelegate == nil || self.originalKeyboardProperties == nil) { return completionHandler(nil); }
+
+ SDLSetGlobalProperties *setProperties = [[SDLSetGlobalProperties alloc] init];
+ setProperties.keyboardProperties = self.originalKeyboardProperties;
+
+ [self.connectionManager sendConnectionRequest:setProperties withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogE(@"Error resetting keyboard properties to values: %@, with error: %@", request, error);
+ }
+
+ completionHandler(error);
+ }];
+}
+
+#pragma mark Present
+
+- (void)sdl_presentChoiceSetWithCompletionHandler:(void(^)(NSError *_Nullable error))completionHandler {
+ self.currentState = SDLPreloadPresentChoicesOperationStatePresentingChoices;
+
+ __weak typeof(self) weakself = self;
+ [self.connectionManager sendConnectionRequest:[self sdl_performInteractionFromChoiceSet] withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ if (error != nil) {
+ SDLLogE(@"Presenting choice set request: %@, failed with response: %@, error: %@", request, response, error);
+ return completionHandler(error);
+ }
+
+ SDLPerformInteractionResponse *performResponse = response;
+ [weakself sdl_setSelectedCellWithId:performResponse.choiceID];
+ weakself.selectedTriggerSource = performResponse.triggerSource;
+
+ return completionHandler(error);
+ }];
+}
+
+#pragma mark Cancel
+
+/**
+ * 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.
+ */
+- (void)sdl_cancelInteraction {
+ if (self.isFinished) {
+ SDLLogW(@"This operation has already finished so it can not be canceled.");
+ return;
+ } else if (self.isCancelled) {
+ SDLLogW(@"This operation has already been canceled. It will be finished at some point during the operation.");
+ return;
+ } else if (self.isExecuting) {
+ if (self.currentState != SDLPreloadPresentChoicesOperationStatePresentingChoices) {
+ SDLLogD(@"Canceling the operation before a present.");
+ return [self cancel];
+ } else if ([SDLGlobals.sharedGlobals.rpcVersion isLessThanVersion:[[SDLVersion alloc] initWithMajor:6 minor:0 patch:0]]) {
+ SDLLogW(@"Canceling a currently displaying choice set is not supported on this head unit. Trying to cancel the operation.");
+ return [self cancel];
+ }
+
+ self.currentState = SDLPreloadPresentChoicesOperationStateCancellingPresentChoices;
+ SDLLogD(@"Canceling the presented choice set interaction");
+
+ __weak typeof(self) weakSelf = self;
+ SDLCancelInteraction *cancelInteraction = [[SDLCancelInteraction alloc] initWithPerformInteractionCancelID:self.cancelId];
+ [self.connectionManager sendConnectionRequest:cancelInteraction withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ if (error != nil) {
+ weakSelf.internalError = error;
+ SDLLogE(@"Error canceling the presented choice set: %@, with error: %@", request, error);
+ return;
+ }
+ SDLLogD(@"The presented choice set was canceled successfully");
+ }];
+ } else {
+ SDLLogD(@"Canceling a choice set that has not yet been sent to Core");
+ [self cancel];
+ }
+}
+
+#pragma mark Present Helpers
+
+- (void)sdl_setSelectedCellWithId:(NSNumber<SDLInt> *)cellId {
+ for (NSUInteger i = 0; i < self.choiceSet.choices.count; i++) {
+ SDLChoiceCell *thisCell = self.choiceSet.choices[i];
+ if (thisCell.choiceId == cellId.unsignedIntValue) {
+ self.selectedCell = thisCell;
+ self.selectedCellRow = i;
+ break;
+ }
+ }
+}
+
+- (SDLPerformInteraction *)sdl_performInteractionFromChoiceSet {
+ NSParameterAssert(self.choiceSet != nil);
+
+ SDLLayoutMode layoutMode = nil;
+ switch (self.choiceSet.layout) {
+ case SDLChoiceSetLayoutList:
+ layoutMode = self.keyboardDelegate ? SDLLayoutModeListWithSearch : SDLLayoutModeListOnly;
+ break;
+ case SDLChoiceSetLayoutTiles:
+ layoutMode = self.keyboardDelegate ? SDLLayoutModeIconWithSearch : SDLLayoutModeIconOnly;
+ break;
+ }
+
+ NSMutableArray<NSNumber<SDLInt> *> *choiceIds = [NSMutableArray arrayWithCapacity:self.choiceSet.choices.count];
+ for (SDLChoiceCell *cell in self.choiceSet.choices) {
+ [choiceIds addObject:@(cell.choiceId)];
+ }
+
+ SDLPerformInteraction *performInteraction = [[SDLPerformInteraction alloc] init];
+ performInteraction.interactionMode = self.presentationMode;
+ performInteraction.initialText = self.choiceSet.title;
+ performInteraction.initialPrompt = self.choiceSet.initialPrompt;
+ performInteraction.helpPrompt = self.choiceSet.helpPrompt;
+ performInteraction.timeoutPrompt = self.choiceSet.timeoutPrompt;
+ performInteraction.vrHelp = self.choiceSet.helpList;
+ performInteraction.timeout = @((NSUInteger)(self.choiceSet.timeout * 1000));
+ performInteraction.interactionLayout = layoutMode;
+ performInteraction.interactionChoiceSetIDList = [choiceIds copy];
+ performInteraction.cancelID = @(self.cancelId);
+
+ return performInteraction;
+}
+
+#pragma mark Finding Cells
+
+- (nullable SDLChoiceCell *)sdl_cellFromChoiceId:(UInt16)choiceId {
+ for (SDLChoiceCell *cell in self.cellsToUpload) {
+ if (cell.choiceId == choiceId) { return cell; }
+ }
+
+ return nil;
+}
+
+#pragma mark - Assembling Choice RPCs
+
++ (nullable SDLCreateInteractionChoiceSet *)sdl_choiceFromCell:(SDLChoiceCell *)cell windowCapability:(SDLWindowCapability *)windowCapability displayName:(NSString *)displayName isVROptional:(BOOL)isVROptional {
+ NSArray<NSString *> *vrCommands = nil;
+ if (cell.voiceCommands == nil) {
+ vrCommands = isVROptional ? nil : @[[NSString stringWithFormat:@"%hu", cell.choiceId]];
+ } else {
+ vrCommands = cell.voiceCommands;
+ }
+
+ NSString *menuName = nil;
+ if ([self sdl_shouldSendChoiceTextBasedOnWindowCapability:windowCapability displayName:displayName]) {
+ menuName = cell.uniqueText;
+ }
+
+ if (menuName == nil) {
+ SDLLogE(@"Could not convert SDLChoiceCell to SDLCreateInteractionChoiceSet because there was no menu name. This could be because the head unit does not support text field 'menuName', which means it does not support Choice Sets. It will not be shown. Cell: %@", cell);
+ return nil;
+ }
+
+ NSString *secondaryText = [self sdl_shouldSendChoiceSecondaryTextBasedOnWindowCapability:windowCapability] ? cell.secondaryText : nil;
+ NSString *tertiaryText = [self sdl_shouldSendChoiceTertiaryTextBasedOnWindowCapability:windowCapability] ? cell.tertiaryText : nil;
+
+ SDLImage *image = [self sdl_shouldSendChoicePrimaryImageBasedOnWindowCapability:windowCapability] ? cell.artwork.imageRPC : nil;
+ SDLImage *secondaryImage = [self sdl_shouldSendChoiceSecondaryImageBasedOnWindowCapability:windowCapability] ? cell.secondaryArtwork.imageRPC : nil;
+
+ SDLChoice *choice = [[SDLChoice alloc] initWithId:cell.choiceId menuName:menuName vrCommands:vrCommands image:image secondaryText:secondaryText secondaryImage:secondaryImage tertiaryText:tertiaryText];
+
+ return [[SDLCreateInteractionChoiceSet alloc] initWithId:(UInt32)choice.choiceID.unsignedIntValue choiceSet:@[choice]];
+}
+
+/// Determine if we should send primary text. If textFields is nil, we don't know the capabilities and we will send everything.
++ (BOOL)sdl_shouldSendChoiceTextBasedOnWindowCapability:(SDLWindowCapability *)windowCapability displayName:(NSString *)displayName {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ if ([displayName isEqualToString:SDLDisplayTypeGen38Inch]) {
+ return YES;
+ }
+#pragma clang diagnostic pop
+
+ return [windowCapability hasTextFieldOfName:SDLTextFieldNameMenuName];
+}
+
+/// Determine if we should send secondary text. If textFields is nil, we don't know the capabilities and we will send everything.
++ (BOOL)sdl_shouldSendChoiceSecondaryTextBasedOnWindowCapability:(SDLWindowCapability *)windowCapability {
+ return [windowCapability hasTextFieldOfName:SDLTextFieldNameSecondaryText];
+}
+
+/// Determine if we should send tertiary text. If textFields is nil, we don't know the capabilities and we will send everything.
++ (BOOL)sdl_shouldSendChoiceTertiaryTextBasedOnWindowCapability:(SDLWindowCapability *)windowCapability {
+ return [windowCapability hasTextFieldOfName:SDLTextFieldNameTertiaryText];
+}
+
+/// Determine if we should send the primary image. If imageFields is nil, we don't know the capabilities and we will send everything.
++ (BOOL)sdl_shouldSendChoicePrimaryImageBasedOnWindowCapability:(SDLWindowCapability *)windowCapability {
+ return [windowCapability hasImageFieldOfName:SDLImageFieldNameChoiceImage];
+}
+
+/// Determine if we should send the secondary image. If imageFields is nil, we don't know the capabilities and we will send everything.
++ (BOOL)sdl_shouldSendChoiceSecondaryImageBasedOnWindowCapability:(SDLWindowCapability *)windowCapability {
+ return [windowCapability hasImageFieldOfName:SDLImageFieldNameChoiceSecondaryImage];
+}
+
+#pragma mark - SDL Notifications
+
+- (void)sdl_keyboardInputNotification:(SDLRPCNotificationNotification *)notification {
+ if (self.isCancelled) { return [self finishOperation]; }
+
+ if (self.keyboardDelegate == nil) { return; }
+ SDLOnKeyboardInput *onKeyboard = notification.notification;
+
+ if ([self.keyboardDelegate respondsToSelector:@selector(keyboardDidSendEvent:text:)]) {
+ [self.keyboardDelegate keyboardDidSendEvent:onKeyboard.event text:onKeyboard.data];
+ }
+
+ __weak typeof(self) weakself = self;
+ if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventVoice] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventSubmitted]) {
+ // Submit voice or text
+ [self.keyboardDelegate userDidSubmitInput:onKeyboard.data withEvent:onKeyboard.event];
+ } else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventKeypress]) {
+ // Notify of keypress
+ if ([self.keyboardDelegate respondsToSelector:@selector(updateAutocompleteWithInput:autoCompleteResultsHandler:)]) {
+ [self.keyboardDelegate updateAutocompleteWithInput:onKeyboard.data autoCompleteResultsHandler:^(NSArray<NSString *> * _Nullable updatedAutoCompleteList) {
+ __strong typeof(self) strongself = weakself;
+ NSArray<NSString *> *newList = nil;
+ if (updatedAutoCompleteList.count > 100) {
+ newList = [updatedAutoCompleteList subarrayWithRange:NSMakeRange(0, 100)];
+ } else {
+ newList = updatedAutoCompleteList;
+ }
+
+ strongself.customKeyboardProperties.autoCompleteList = (newList.count > 0) ? newList : @[];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ strongself.customKeyboardProperties.autoCompleteText = (newList.count > 0) ? newList.firstObject : nil;
+#pragma clang diagnostic pop
+ [strongself sdl_updateKeyboardPropertiesWithCompletionHandler:^(NSError * _Nullable error) {}];
+ }];
+ }
+
+ if ([self.keyboardDelegate respondsToSelector:@selector(updateCharacterSetWithInput:completionHandler:)]) {
+ [self.keyboardDelegate updateCharacterSetWithInput:onKeyboard.data completionHandler:^(NSArray<NSString *> *updatedCharacterSet) {
+ __strong typeof(self) strongself = weakself;
+ strongself.customKeyboardProperties.limitedCharacterList = updatedCharacterSet;
+ [strongself sdl_updateKeyboardPropertiesWithCompletionHandler:^(NSError * _Nullable error) {}];
+ }];
+ }
+ } else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventAborted] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventCancelled]) {
+ // Notify of abort / cancellation
+ [self.keyboardDelegate keyboardDidAbortWithReason:onKeyboard.event];
+ } else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskDisabled]) {
+ // Notify of key mask change
+ if ([self.keyboardDelegate respondsToSelector:@selector(keyboardDidUpdateInputMask:)]) {
+ BOOL isEnabled = [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ [self.keyboardDelegate keyboardDidUpdateInputMask:isEnabled];
+ }
+ }
+}
+
+#pragma mark - Property Overrides
+
+- (void)finishOperation {
+ [self finishOperation:nil];
+}
+
+- (void)finishOperation:(nullable NSError *)error {
+ self.currentState = SDLPreloadPresentChoicesOperationStateFinishing;
+
+ self.internalError = error;
+ self.preloadCompletionHandler(self.loadedCells, self.internalError);
+
+ if (self.choiceSet.delegate == nil) {
+ SDLLogD(@"Preload finished, no choice set delegate was set, so no present will occur.");
+ } else if (error != nil) {
+ SDLLogW(@"Choice set did error: %@", self.internalError);
+ [self.choiceSet.delegate choiceSet:self.choiceSet didReceiveError:self.internalError];
+ } else if (self.selectedCell != nil) {
+ SDLLogD(@"Choice set did present successfully: %@, selected choice: %@, trigger source: %@, row index: %ld", self.choiceSet, self.selectedCell, self.selectedTriggerSource, self.selectedCellRow);
+ [self.choiceSet.delegate choiceSet:self.choiceSet didSelectChoice:self.selectedCell withSource:self.selectedTriggerSource atRowIndex:self.selectedCellRow];
+ } else {
+ SDLLogE(@"Present finished, but an unhandled state occurred and callback failed");
+ }
+
+ [super finishOperation];
+}
+
+- (nullable NSString *)name {
+ return [NSString stringWithFormat:@"%@ - %@", self.class, self.operationId];
+}
+
+- (NSOperationQueuePriority)queuePriority {
+ return NSOperationQueuePriorityNormal;
+}
+
+- (nullable NSError *)error {
+ return self.internalError;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLPreloadPresentChoicesOperationUtilities.h b/SmartDeviceLink/private/SDLPreloadPresentChoicesOperationUtilities.h
new file mode 100644
index 000000000..72be60d9a
--- /dev/null
+++ b/SmartDeviceLink/private/SDLPreloadPresentChoicesOperationUtilities.h
@@ -0,0 +1,32 @@
+//
+// SDLPreloadPresentChoiceSetOperationUtilities.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 8/27/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLChoiceCell;
+@class SDLChoiceSet;
+@class SDLWindowCapability;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLPreloadPresentChoicesOperationUtilities : NSObject
+
+@property (class, assign, nonatomic) UInt16 choiceId;
+@property (class, assign, nonatomic) BOOL reachedMaxId;
+
+/// Assigns a unique id to each choice item.
+/// @param cells An array of choices
+/// @param loadedCells The already loaded cells with ids to avoid
++ (void)assignIdsToCells:(NSOrderedSet<SDLChoiceCell *> *)cells loadedCells:(NSSet<SDLChoiceCell *> *)loadedCells;
+
++ (void)makeCellsToUploadUnique:(NSMutableOrderedSet<SDLChoiceCell *> *)cellsToUpload basedOnLoadedCells:(NSMutableSet<SDLChoiceCell *> *)loadedCells windowCapability:(SDLWindowCapability *)windowCapability;
++ (void)updateChoiceSet:(SDLChoiceSet *)choiceSet withLoadedCells:(NSSet<SDLChoiceCell *> *)loadedCells cellsToUpload:(NSSet<SDLChoiceCell *> *)cellsToUpload;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLPreloadPresentChoicesOperationUtilities.m b/SmartDeviceLink/private/SDLPreloadPresentChoicesOperationUtilities.m
new file mode 100644
index 000000000..a3a3a3f68
--- /dev/null
+++ b/SmartDeviceLink/private/SDLPreloadPresentChoicesOperationUtilities.m
@@ -0,0 +1,233 @@
+//
+// SDLPreloadPresentChoiceSetOperationUtilities.m
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 8/27/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLPreloadPresentChoicesOperationUtilities.h"
+
+#import "SDLChoiceCell.h"
+#import "SDLChoiceSet.h"
+#import "SDLGlobals.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
+#import "SDLVersion.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLChoiceCell()
+
+@property (assign, nonatomic) UInt16 choiceId;
+@property (copy, nonatomic, readwrite, nullable) NSString *secondaryText;
+@property (copy, nonatomic, readwrite, nullable) NSString *tertiaryText;
+@property (copy, nonatomic, readwrite, nullable) NSArray<NSString *> *voiceCommands;
+@property (strong, nonatomic, readwrite, nullable) SDLArtwork *artwork;
+@property (strong, nonatomic, readwrite, nullable) SDLArtwork *secondaryArtwork;
+
+@property (assign, nonatomic) NSUInteger uniqueTextId;
+
+@end
+
+@implementation SDLPreloadPresentChoicesOperationUtilities
+
+// HAX: Choice ID starts at 1 instead of 0 because of an HMI bug that existed until 2021 (https://github.com/smartdevicelink/generic_hmi/commit/b292fbbec095b9ce11b520d47ec95b6fcff8e247)
+static UInt16 _choiceId = 1;
+static BOOL _reachedMaxId = NO;
+
+#pragma mark Getters / Setters
+
++ (UInt16)choiceId {
+ return _choiceId;
+}
+
++ (void)setChoiceId:(UInt16)choiceId {
+ _choiceId = choiceId;
+}
+
++ (BOOL)reachedMaxId {
+ return _reachedMaxId;
+}
+
++ (void)setReachedMaxId:(BOOL)reachedMaxId {
+ _reachedMaxId = reachedMaxId;
+}
+
+#pragma mark - Cell Ids
+
++ (void)assignIdsToCells:(NSOrderedSet<SDLChoiceCell *> *)cells loadedCells:(NSSet<SDLChoiceCell *> *)loadedCells {
+ NSMutableArray<NSNumber *> *usedIds = [NSMutableArray array];
+ for (SDLChoiceCell *loadedCell in loadedCells) { [usedIds addObject:@(loadedCell.choiceId)]; }
+ NSMutableArray<NSNumber *> *sortedUsedIds = [usedIds sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]].mutableCopy;
+
+ // Loop through the cells we need ids for. Get and assign those ids.
+ for (UInt16 i = 0; i < cells.count; i++) {
+ UInt16 cellId = [self sdl_nextChoiceIdBasedOnUsedIds:sortedUsedIds];
+ cells[i].choiceId = cellId;
+
+ // Insert the ids into the usedIds sorted array in the correct position
+ for (NSUInteger j = 0; j < sortedUsedIds.count; j++) {
+ if (sortedUsedIds[j].unsignedShortValue > cellId) {
+ [sortedUsedIds insertObject:@(cellId) atIndex:j];
+ break;
+ } else if (j == (sortedUsedIds.count - 1)) {
+ [sortedUsedIds addObject:@(cellId)];
+ break;
+ }
+ }
+ }
+}
+
+/// Find the next available choice id. Takes into account the loaded cells to ensure there are not duplicates
+/// @param usedIds The already loaded cell ids
+/// @return The choice id between 0 - 65535, or NSNotFound if no cell ids were available
++ (UInt16)sdl_nextChoiceIdBasedOnUsedIds:(NSArray<NSNumber *> *)usedIds {
+ // Check if we are entirely full, or if we've advanced beyond the max value, loop back
+ if (_choiceId == UINT16_MAX) {
+ _choiceId = 1;
+ _reachedMaxId = YES;
+ }
+
+ if (_reachedMaxId) {
+ // We've looped all the way around, so we need to check loaded cells
+ // Sort the set of cells by the choice id so that we can more easily check which slots are available
+ if (usedIds.count >= (UINT16_MAX + 1)) {
+ // If we've maxed out our slots, return the max value
+ _choiceId = UINT16_MAX;
+ return _choiceId;
+ }
+
+ // If the last value isn't the max value, just keep grabbing towards the max value
+ UInt16 lastUsedId = usedIds.lastObject.unsignedShortValue;
+ if (lastUsedId < UINT16_MAX) {
+ _choiceId = lastUsedId + 1;
+ return _choiceId;
+ }
+
+ // All our easy options are gone. Find and grab an empty slot from within the sorted list
+ for (UInt16 i = 0; i < usedIds.count; i++) {
+ UInt16 loopId = usedIds[i].unsignedShortValue;
+ if (i != loopId) {
+ // This slot is open because the cell id does not match an open sorted slot
+ _choiceId = i;
+ return _choiceId;
+ }
+ }
+
+ // This *shouldn't* be possible
+ _choiceId = UINT16_MAX;
+ return _choiceId;
+ } else {
+ // We haven't looped all the way around yet, so we'll just take the current number, then advance the item
+ return _choiceId++;
+ }
+}
+
+#pragma mark - Choice Uniqueness
+
++ (void)makeCellsToUploadUnique:(NSMutableOrderedSet<SDLChoiceCell *> *)cellsToUpload basedOnLoadedCells:(NSMutableSet<SDLChoiceCell *> *)loadedCells windowCapability:(SDLWindowCapability *)windowCapability {
+ if (cellsToUpload.count == 0) { return; }
+
+ // If we're on < RPC 7.1, all primary texts need to be unique, so we don't need to check removed properties and duplicate cells
+ // On > RPC 7.1, at this point all cells are unique when considering all properties, but we also need to check if any cells will _appear_ as duplicates when displayed on the screen. To check that, we'll remove properties from the set cells based on the system capabilities (we probably don't need to consider them changing between now and when they're actually sent to the HU) and check for uniqueness again. Then we'll add unique identifiers to primary text if there are duplicates. Then we transfer the primary text identifiers back to the main cells and add those to an operation to be sent.
+ NSArray<SDLChoiceCell *> *strippedCellsToUpload = [[NSArray alloc] initWithArray:cellsToUpload.array copyItems:YES];
+ NSArray<SDLChoiceCell *> *strippedLoadedCells = [[NSArray alloc] initWithArray:loadedCells.allObjects copyItems:YES];
+ BOOL supportsChoiceUniqueness = [[SDLGlobals sharedGlobals].rpcVersion isGreaterThanOrEqualToVersion:[SDLVersion versionWithMajor:7 minor:1 patch:0]];
+ if (supportsChoiceUniqueness) {
+ [self sdl_removeUnusedProperties:strippedCellsToUpload basedOnWindowCapability:windowCapability];
+ [self sdl_removeUnusedProperties:strippedLoadedCells basedOnWindowCapability:windowCapability];
+ }
+
+ // Now remove duplicate cells that are already on the head unit, then add unique names to the ones to upload
+ [self sdl_addUniqueNamesToCells:strippedCellsToUpload loadedCells:strippedLoadedCells supportsChoiceUniqueness:supportsChoiceUniqueness];
+ [self sdl_transferUniqueNamesFromCells:strippedCellsToUpload toCells:cellsToUpload];
+}
+
++ (void)updateChoiceSet:(SDLChoiceSet *)choiceSet withLoadedCells:(NSSet<SDLChoiceCell *> *)loadedCells cellsToUpload:(NSSet<SDLChoiceCell *> *)cellsToUpload {
+ NSMutableArray<SDLChoiceCell *> *choiceSetCells = [NSMutableArray array];
+ for (SDLChoiceCell *cell in choiceSet.choices) {
+ [choiceSetCells addObject:([loadedCells member:cell] ?: [cellsToUpload member:cell])];
+ }
+
+ choiceSet.choices = [choiceSetCells copy];
+}
+
++ (void)sdl_removeUnusedProperties:(NSArray<SDLChoiceCell *> *)choiceCells basedOnWindowCapability:(SDLWindowCapability *)windowCapability {
+ for (SDLChoiceCell *cell in choiceCells) {
+ // Strip away fields that cannot be used to determine uniqueness visually including fields not supported by the HMI
+ cell.voiceCommands = nil;
+
+ if (![windowCapability hasImageFieldOfName:SDLImageFieldNameChoiceImage]) {
+ cell.artwork = nil;
+ }
+ if (![windowCapability hasTextFieldOfName:SDLTextFieldNameSecondaryText]) {
+ cell.secondaryText = nil;
+ }
+ if (![windowCapability hasTextFieldOfName:SDLTextFieldNameTertiaryText]) {
+ cell.tertiaryText = nil;
+ }
+ if (![windowCapability hasImageFieldOfName:SDLImageFieldNameChoiceSecondaryImage]) {
+ cell.secondaryArtwork = nil;
+ }
+ }
+}
+
+/// Checks if 2 or more cells have the same text/title. In case this condition is true, this function will handle the presented issue by adding "(count)".
+/// E.g. Choices param contains 2 cells with text/title "Address" will be handled by updating the uniqueText/uniqueTitle of the second cell to "Address (2)".
+/// @param cellsToUpload The choices to be uploaded.
+/// @param loadedCells The cells already on the head unit
++ (void)sdl_addUniqueNamesToCells:(NSArray<SDLChoiceCell *> *)cellsToUpload loadedCells:(NSArray<SDLChoiceCell *> *)loadedCells supportsChoiceUniqueness:(BOOL)supportsChoiceUniqueness {
+ // Tracks how many of each cell primary text there are so that we can append numbers to make each unique as necessary
+ NSMutableDictionary<id<NSCopying>, NSMutableArray<NSNumber *> *> *dictCounter = [[NSMutableDictionary alloc] init];
+
+ // Include cells from loaded cells to ensure that new cells get the correct title
+ for (SDLChoiceCell *loadedCell in loadedCells) {
+ id<NSCopying> cellKey = supportsChoiceUniqueness ? loadedCell : loadedCell.text;
+ NSNumber *cellUniqueId = @(loadedCell.uniqueTextId);
+ if (dictCounter[cellKey] == nil) {
+ dictCounter[cellKey] = [NSMutableArray arrayWithObject:cellUniqueId];
+ } else {
+ [dictCounter[cellKey] addObject:cellUniqueId];
+ }
+ }
+
+ // Sort the arrays so that the numbers are in order
+ for (id<NSCopying> cellKey in dictCounter.keyEnumerator) {
+ [dictCounter[cellKey] sortUsingComparator:^NSComparisonResult(NSNumber *_Nonnull obj1, NSNumber *_Nonnull obj2) {
+ if (obj1.unsignedIntegerValue > obj2.unsignedIntegerValue) { return NSOrderedDescending; }
+ if (obj1.unsignedIntegerValue < obj2.unsignedIntegerValue) { return NSOrderedAscending; }
+
+ return NSOrderedSame;
+ }];
+ }
+
+ // Run through cellsToUpload and add unique text as needed
+ for (SDLChoiceCell *cell in cellsToUpload) {
+ id<NSCopying> cellKey = supportsChoiceUniqueness ? cell : cell.text;
+ if (dictCounter[cellKey] == nil) {
+ dictCounter[cellKey] = [NSMutableArray arrayWithObject:@(cell.uniqueTextId)];
+ } else {
+ // There are already some duplicates, loop through to find the lowest unused duplicate number
+ NSUInteger lowestMissingUniqueId = dictCounter[cellKey].lastObject.unsignedIntegerValue + 1;
+ for (NSUInteger i = 1; i < dictCounter[cellKey].count + 1; i++) {
+ if (i != dictCounter[cellKey][i - 1].unsignedIntegerValue) {
+ lowestMissingUniqueId = i;
+ break;
+ }
+ }
+
+ cell.uniqueTextId = lowestMissingUniqueId;
+ [dictCounter[cellKey] insertObject:@(cell.uniqueTextId) atIndex:(cell.uniqueTextId - 1)];
+ }
+ }
+}
+
++ (void)sdl_transferUniqueNamesFromCells:(NSArray<SDLChoiceCell *> *)fromCells toCells:(NSOrderedSet<SDLChoiceCell *> *)toCells {
+ for (NSUInteger i = 0; i < fromCells.count; i++) {
+ toCells[i].uniqueTextId = fromCells[i].uniqueTextId;
+ }
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h b/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h
deleted file mode 100644
index b2589a280..000000000
--- a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// SDLPresentChoiceSetOperation.h
-// SmartDeviceLink
-//
-// Created by Joel Fischer on 5/24/18.
-// Copyright © 2018 smartdevicelink. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-#import "SDLAsynchronousOperation.h"
-#import "SDLInteractionMode.h"
-#import "SDLTriggerSource.h"
-
-@class SDLChoiceCell;
-@class SDLChoiceSet;
-@class SDLKeyboardProperties;
-@class SDLWindowCapability;
-
-@protocol SDLConnectionManagerType;
-@protocol SDLKeyboardDelegate;
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface SDLPresentChoiceSetOperation : SDLAsynchronousOperation
-
-/**
- The choice set to be displayed.
- */
-@property (strong, nonatomic, readonly) SDLChoiceSet *choiceSet;
-
-/**
- The choice set item the user selected.
- */
-@property (strong, nonatomic, readonly, nullable) SDLChoiceCell *selectedCell;
-
-/**
- How the user selected the choice set item: either from the menu or through voice-recognition.
- */
-@property (strong, nonatomic, readonly, nullable) SDLTriggerSource selectedTriggerSource;
-
-/**
- The row number of the choice set item the user selected.
- */
-@property (assign, nonatomic, readonly) NSUInteger selectedCellRow;
-
-/**
- An operation to present a choice set.
-
- @param connectionManager The connection manager
- @param choiceSet The choice set to be displayed
- @param mode If the set should be presented for the user to interact via voice, touch, or both
- @param originalKeyboardProperties The keyboard configuration
- @param keyboardDelegate The keyboard delegate called when the user interacts with the keyboard
- @param cancelID A unique ID for this specific choice set that allows cancellation through the `CancelInteraction` RPC.
- @return A SDLPresentChoiceSetOperation object
- */
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID windowCapability:(SDLWindowCapability *)windowCapability;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m b/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m
deleted file mode 100644
index 121383ce7..000000000
--- a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m
+++ /dev/null
@@ -1,348 +0,0 @@
-//
-// SDLPresentChoiceSetOperation.m
-// SmartDeviceLink
-//
-// Created by Joel Fischer on 5/24/18.
-// Copyright © 2018 smartdevicelink. All rights reserved.
-//
-
-#import "SDLPresentChoiceSetOperation.h"
-
-#import "SDLCancelInteraction.h"
-#import "SDLChoiceCell.h"
-#import "SDLChoiceSet.h"
-#import "SDLChoiceSetDelegate.h"
-#import "SDLConnectionManagerType.h"
-#import "SDLGlobals.h"
-#import "SDLKeyboardDelegate.h"
-#import "SDLKeyboardProperties.h"
-#import "SDLLogMacros.h"
-#import "SDLNotificationConstants.h"
-#import "SDLOnKeyboardInput.h"
-#import "SDLPerformInteraction.h"
-#import "SDLPerformInteractionResponse.h"
-#import "SDLRPCNotificationNotification.h"
-#import "SDLSetGlobalProperties.h"
-#import "SDLVersion.h"
-#import "SDLWindowCapability+ScreenManagerExtensions.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface SDLChoiceCell()
-
-@property (assign, nonatomic) UInt16 choiceId;
-
-@end
-
-@interface SDLChoiceSet()
-
-@property (copy, nonatomic) SDLChoiceSetCanceledHandler canceledHandler;
-
-
-@end
-
-@interface SDLPresentChoiceSetOperation()
-
-@property (strong, nonatomic) NSUUID *operationId;
-@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
-@property (strong, nonatomic, readwrite) SDLChoiceSet *choiceSet;
-@property (strong, nonatomic) SDLInteractionMode presentationMode;
-@property (strong, nonatomic, nullable) SDLKeyboardProperties *originalKeyboardProperties;
-@property (strong, nonatomic, nullable) SDLKeyboardProperties *keyboardProperties;
-@property (weak, nonatomic) id<SDLKeyboardDelegate> keyboardDelegate;
-
-@property (strong, nonatomic, readonly) SDLPerformInteraction *performInteraction;
-@property (strong, nonatomic, readonly) SDLLayoutMode layoutMode;
-@property (strong, nonatomic, readonly) NSArray<NSNumber<SDLInt> *> *choiceIds;
-@property (assign, nonatomic) UInt16 cancelId;
-@property (assign, nonatomic) BOOL updatedKeyboardProperties;
-
-@property (copy, nonatomic, nullable) NSError *internalError;
-@property (strong, nonatomic, readwrite, nullable) SDLChoiceCell *selectedCell;
-@property (strong, nonatomic, readwrite, nullable) SDLTriggerSource selectedTriggerSource;
-@property (assign, nonatomic, readwrite) NSUInteger selectedCellRow;
-@property (strong, nonatomic) SDLWindowCapability *windowCapability;
-
-@end
-
-@implementation SDLPresentChoiceSetOperation
-
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID windowCapability:(SDLWindowCapability *)windowCapability {
- self = [super init];
- if (!self) { return self; }
-
- _connectionManager = connectionManager;
- _choiceSet = choiceSet;
-
- __weak typeof(self) weakSelf = self;
- self.choiceSet.canceledHandler = ^{
- [weakSelf sdl_cancelInteraction];
- };
-
- _presentationMode = mode;
- _operationId = [NSUUID UUID];
-
- _originalKeyboardProperties = originalKeyboardProperties;
- _keyboardProperties = originalKeyboardProperties;
- _keyboardDelegate = keyboardDelegate;
- _cancelId = cancelID;
-
- _selectedCellRow = NSNotFound;
- _windowCapability = windowCapability;
-
- return self;
-}
-
-- (void)start {
- [super start];
- if (self.isCancelled) { return; }
-
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_keyboardInputNotification:) name:SDLDidReceiveKeyboardInputNotification object:nil];
-
- [self sdl_start];
-}
-
-- (void)sdl_start {
- // Check if we're using a keyboard (searchable) choice set and setup keyboard properties if we need to
- if (self.keyboardDelegate != nil && [self.keyboardDelegate respondsToSelector:@selector(customKeyboardConfiguration)]) {
- SDLKeyboardProperties *customProperties = self.keyboardDelegate.customKeyboardConfiguration;
- if (customProperties != nil) {
- self.keyboardProperties = customProperties;
- }
- }
-
- [self sdl_updateKeyboardPropertiesWithCompletionHandler:^{
- if (self.isCancelled) {
- [self finishOperation];
- return;
- }
-
- [self sdl_presentChoiceSet];
- }];
-}
-
-#pragma mark - Sending Requests
-
-- (void)sdl_updateKeyboardPropertiesWithCompletionHandler:(nullable void(^)(void))completionHandler {
- // Create the keyboard configuration based on the window capability's keyboard capabilities
- SDLKeyboardProperties *modifiedKeyboardConfig = [self.windowCapability createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:self.keyboardProperties];
- if (modifiedKeyboardConfig == nil) {
- if (completionHandler != nil) {
- completionHandler();
- }
- return;
- }
- SDLSetGlobalProperties *setProperties = [[SDLSetGlobalProperties alloc] init];
- setProperties.keyboardProperties = modifiedKeyboardConfig;
-
- __weak typeof(self) weakself = self;
- [self.connectionManager sendConnectionRequest:setProperties withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
- if (error != nil) {
- SDLLogE(@"Error setting keyboard properties to new value: %@, with error: %@", request, error);
- }
-
- weakself.updatedKeyboardProperties = YES;
-
- if (completionHandler != nil) {
- completionHandler();
- }
- }];
-}
-
-- (void)sdl_presentChoiceSet {
- __weak typeof(self) weakself = self;
- [self.connectionManager sendConnectionRequest:self.performInteraction withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
- if (error != nil) {
- SDLLogE(@"Presenting choice set failed with response: %@, error: %@", response, error);
- weakself.internalError = error;
-
- [weakself finishOperation];
- return;
- }
-
- SDLPerformInteractionResponse *performResponse = (SDLPerformInteractionResponse *)response;
- [weakself sdl_setSelectedCellWithId:performResponse.choiceID];
- weakself.selectedTriggerSource = performResponse.triggerSource;
-
- [weakself finishOperation];
- }];
-}
-
-#pragma mark - Helpers
-
-- (void)sdl_setSelectedCellWithId:(NSNumber<SDLInt> *)cellId {
- __weak typeof(self) weakself = self;
- [self.choiceSet.choices enumerateObjectsUsingBlock:^(SDLChoiceCell * _Nonnull cell, NSUInteger i, BOOL * _Nonnull stop) {
- if (cell.choiceId == cellId.unsignedIntValue) {
- weakself.selectedCell = cell;
- weakself.selectedCellRow = i;
- }
- }];
-}
-
-/**
- * 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.
- */
-- (void)sdl_cancelInteraction {
- if (self.isFinished) {
- SDLLogW(@"This operation has already finished so it can not be canceled.");
- return;
- } else if (self.isCancelled) {
- SDLLogW(@"This operation has already been canceled. It will be finished at some point during the operation.");
- return;
- } else if (self.isExecuting) {
- if ([SDLGlobals.sharedGlobals.rpcVersion isLessThanVersion:[[SDLVersion alloc] initWithMajor:6 minor:0 patch:0]]) {
- SDLLogE(@"Canceling a choice set is not supported on this head unit");
- return;
- }
-
- SDLLogD(@"Canceling the presented choice set interaction");
-
- SDLCancelInteraction *cancelInteraction = [[SDLCancelInteraction alloc] initWithPerformInteractionCancelID:self.cancelId];
-
- __weak typeof(self) weakSelf = self;
- [self.connectionManager sendConnectionRequest:cancelInteraction withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
- if (error != nil) {
- weakSelf.internalError = error;
- SDLLogE(@"Error canceling the presented choice set: %@, with error: %@", request, error);
- return;
- }
- SDLLogD(@"The presented choice set was canceled successfully");
- }];
- } else {
- SDLLogD(@"Canceling a choice set that has not yet been sent to Core");
- [self cancel];
- }
-}
-
-#pragma mark - Getters
-
-- (SDLPerformInteraction *)performInteraction {
- SDLPerformInteraction *performInteraction = [[SDLPerformInteraction alloc] init];
- performInteraction.interactionMode = self.presentationMode;
- performInteraction.initialText = self.choiceSet.title;
- performInteraction.initialPrompt = self.choiceSet.initialPrompt;
- performInteraction.helpPrompt = self.choiceSet.helpPrompt;
- performInteraction.timeoutPrompt = self.choiceSet.timeoutPrompt;
- performInteraction.vrHelp = self.choiceSet.helpList;
- performInteraction.timeout = @((NSUInteger)(self.choiceSet.timeout * 1000));
- performInteraction.interactionLayout = self.layoutMode;
- performInteraction.interactionChoiceSetIDList = self.choiceIds;
- performInteraction.cancelID = @(self.cancelId);
-
- return performInteraction;
-}
-
-- (SDLLayoutMode)layoutMode {
- switch (self.choiceSet.layout) {
- case SDLChoiceSetLayoutList:
- return self.keyboardDelegate ? SDLLayoutModeListWithSearch : SDLLayoutModeListOnly;
- case SDLChoiceSetLayoutTiles:
- return self.keyboardDelegate ? SDLLayoutModeIconWithSearch : SDLLayoutModeIconOnly;
- }
-}
-
-- (NSArray<NSNumber<SDLInt> *> *)choiceIds {
- NSMutableArray<NSNumber<SDLInt> *> *choiceIds = [NSMutableArray arrayWithCapacity:self.choiceSet.choices.count];
- for (SDLChoiceCell *cell in self.choiceSet.choices) {
- [choiceIds addObject:@(cell.choiceId)];
- }
-
- return [choiceIds copy];
-}
-
-#pragma mark - SDL Notifications
-
-- (void)sdl_keyboardInputNotification:(SDLRPCNotificationNotification *)notification {
- if (self.isCancelled) {
- [self finishOperation];
- return;
- }
-
- if (self.keyboardDelegate == nil) { return; }
- SDLOnKeyboardInput *onKeyboard = notification.notification;
-
- if ([self.keyboardDelegate respondsToSelector:@selector(keyboardDidSendEvent:text:)]) {
- [self.keyboardDelegate keyboardDidSendEvent:onKeyboard.event text:onKeyboard.data];
- }
-
- __weak typeof(self) weakself = self;
- if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventVoice] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventSubmitted]) {
- // Submit voice or text
- [self.keyboardDelegate userDidSubmitInput:onKeyboard.data withEvent:onKeyboard.event];
- } else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventKeypress]) {
- // Notify of keypress
- if ([self.keyboardDelegate respondsToSelector:@selector(updateAutocompleteWithInput:autoCompleteResultsHandler:)]) {
- [self.keyboardDelegate updateAutocompleteWithInput:onKeyboard.data autoCompleteResultsHandler:^(NSArray<NSString *> * _Nullable updatedAutoCompleteList) {
- NSArray<NSString *> *newList = nil;
- if (updatedAutoCompleteList.count > 100) {
- newList = [updatedAutoCompleteList subarrayWithRange:NSMakeRange(0, 100)];
- } else {
- newList = updatedAutoCompleteList;
- }
-
- weakself.keyboardProperties.autoCompleteList = (newList.count > 0) ? newList : @[];
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- weakself.keyboardProperties.autoCompleteText = (newList.count > 0) ? newList.firstObject : nil;
-#pragma clang diagnostic pop
- [weakself sdl_updateKeyboardPropertiesWithCompletionHandler:nil];
- }];
- }
-
- if ([self.keyboardDelegate respondsToSelector:@selector(updateCharacterSetWithInput:completionHandler:)]) {
- [self.keyboardDelegate updateCharacterSetWithInput:onKeyboard.data completionHandler:^(NSArray<NSString *> *updatedCharacterSet) {
- weakself.keyboardProperties.limitedCharacterList = updatedCharacterSet;
- [self sdl_updateKeyboardPropertiesWithCompletionHandler:nil];
- }];
- }
- } else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventAborted] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventCancelled]) {
- // Notify of abort / cancellation
- [self.keyboardDelegate keyboardDidAbortWithReason:onKeyboard.event];
- } else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskDisabled]) {
- // Notify of key mask change
- if ([self.keyboardDelegate respondsToSelector:@selector(keyboardDidUpdateInputMask:)]) {
- BOOL isEnabled = [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
- [self.keyboardDelegate keyboardDidUpdateInputMask:isEnabled];
- }
- }
-}
-
-#pragma mark - Property Overrides
-
-- (void)finishOperation {
- [[NSNotificationCenter defaultCenter] removeObserver:self];
-
- if (self.keyboardProperties == nil) {
- [super finishOperation];
- return;
- }
-
- // We need to reset the keyboard properties
- SDLSetGlobalProperties *setProperties = [[SDLSetGlobalProperties alloc] init];
- setProperties.keyboardProperties = self.originalKeyboardProperties;
-
- [self.connectionManager sendConnectionRequest:setProperties withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
- if (error != nil) {
- SDLLogE(@"Error resetting keyboard properties to values: %@, with error: %@", request, error);
- }
-
- [super finishOperation];
- }];
-}
-
-- (nullable NSString *)name {
- return [NSString stringWithFormat:@"%@ - %@", self.class, self.operationId];
-}
-
-- (NSOperationQueuePriority)queuePriority {
- return NSOperationQueuePriorityNormal;
-}
-
-- (nullable NSError *)error {
- return self.internalError;
-}
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLProtocol.m b/SmartDeviceLink/private/SDLProtocol.m
index ea2cc84e0..1ed2faf12 100644
--- a/SmartDeviceLink/private/SDLProtocol.m
+++ b/SmartDeviceLink/private/SDLProtocol.m
@@ -28,6 +28,8 @@
#import "SDLRPCRequest.h"
#import "SDLRPCResponse.h"
#import "SDLSecurityType.h"
+#import "SDLSecurityQueryErrorCode.h"
+#import "SDLSecurityQueryPayload.h"
#import "SDLSystemInfo.h"
#import "SDLTimer.h"
#import "SDLVersion.h"
@@ -775,7 +777,42 @@ NS_ASSUME_NONNULL_BEGIN
// 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.");
+ SDLLogE(@"Security message is malformed, less than 12 bytes. It does not have a security payload header.");
+ }
+
+ // Check the client's message header for any internal errors
+ // NOTE: Before Core v8.0.0, all these messages will be notifications. In Core v8.0.0 and later, received messages will have the proper query type. Therefore, we cannot do things based only on the query type being request or response.
+ SDLSecurityQueryPayload *clientSecurityQueryPayload = [SDLSecurityQueryPayload securityPayloadWithData:clientHandshakeMessage.payload];
+ if (clientSecurityQueryPayload == nil) {
+ SDLLogE(@"Module Security Query could not convert to object.");
+ return;
+ }
+
+ // If the query is of type `Notification` and the id represents a client internal error, we abort the response message and the encryptionManager will not be in state ready.
+ if (clientSecurityQueryPayload.queryID == SDLSecurityQueryIdSendInternalError && clientSecurityQueryPayload.queryType == SDLSecurityQueryTypeNotification) {
+ NSError *jsonDecodeError = nil;
+ NSDictionary<NSString *, id> *securityQueryErrorDictionary = [NSJSONSerialization JSONObjectWithData:clientSecurityQueryPayload.jsonData options:kNilOptions error:&jsonDecodeError];
+ if (jsonDecodeError != nil) {
+ SDLLogE(@"Error decoding module security query response JSON: %@", jsonDecodeError);
+ } else {
+ if (securityQueryErrorDictionary[@"text"] != nil) {
+ SDLSecurityQueryErrorCode errorCodeString = [SDLSecurityQueryError convertErrorIdToStringEnum:securityQueryErrorDictionary[@"id"]];
+ SDLLogE(@"Security Query module internal error: %@, code: %@", securityQueryErrorDictionary[@"text"], errorCodeString);
+ } else {
+ SDLLogE(@"Security Query module error: No information provided");
+ }
+ }
+ return;
+ }
+
+ if (clientSecurityQueryPayload.queryID != SDLSecurityQueryIdSendHandshake) {
+ SDLLogE(@"Security Query module error: Message is not a SEND_HANDSHAKE_DATA REQUEST");
+ return;
+ }
+
+ if (clientSecurityQueryPayload.queryType == SDLSecurityQueryTypeResponse) {
+ SDLLogE(@"Security Query module error: Message is a response, which is not supported");
+ return;
}
// Tear off the binary header of the client protocol message to get at the actual TLS handshake
@@ -788,7 +825,7 @@ NS_ASSUME_NONNULL_BEGIN
// If the handshake went bad and the security library ain't happy, send over the failure to the module. This should result in an ACK with encryption off.
SDLProtocolMessage *serverSecurityMessage = nil;
- if (serverHandshakeData == nil) {
+ if (serverHandshakeData.length == 0) {
SDLLogE(@"Error running TLS handshake procedure. Sending error to module. Error: %@", handshakeError);
serverSecurityMessage = [self.class sdl_serverSecurityFailedMessageWithClientMessageHeader:clientHandshakeMessage.header messageId:++_messageID];
@@ -812,14 +849,10 @@ NS_ASSUME_NONNULL_BEGIN
serverMessageHeader.sessionID = clientHeader.sessionID;
serverMessageHeader.messageID = messageId;
- // For a control service packet, we need a binary header with a function ID corresponding to what type of packet we're sending.
- SDLRPCPayload *serverTLSPayload = [[SDLRPCPayload alloc] init];
- serverTLSPayload.functionID = 0x01; // TLS Handshake message
- serverTLSPayload.rpcType = 0x00;
- serverTLSPayload.correlationID = 0x00;
- serverTLSPayload.binaryData = data;
+ // Assemble a security query payload header for our response
+ SDLSecurityQueryPayload *serverTLSPayload = [[SDLSecurityQueryPayload alloc] initWithQueryType:SDLSecurityQueryTypeResponse queryID:SDLSecurityQueryIdSendHandshake sequenceNumber:0x00 jsonData:nil binaryData:data];
- NSData *binaryData = serverTLSPayload.data;
+ NSData *binaryData = [serverTLSPayload convertToData];
return [SDLProtocolMessage messageWithHeader:serverMessageHeader andPayload:binaryData];
}
@@ -835,12 +868,9 @@ NS_ASSUME_NONNULL_BEGIN
serverMessageHeader.messageID = messageId;
// For a control service packet, we need a binary header with a function ID corresponding to what type of packet we're sending.
- SDLRPCPayload *serverTLSPayload = [[SDLRPCPayload alloc] init];
- serverTLSPayload.functionID = 0x02; // TLS Error message
- serverTLSPayload.rpcType = 0x02;
- serverTLSPayload.correlationID = 0x00;
+ SDLSecurityQueryPayload *serverTLSPayload = [[SDLSecurityQueryPayload alloc] initWithQueryType:SDLSecurityQueryTypeNotification queryID:SDLSecurityQueryIdSendInternalError sequenceNumber:0x00 jsonData:nil binaryData:nil];
- NSData *binaryData = serverTLSPayload.data;
+ NSData *binaryData = [serverTLSPayload convertToData];
// TODO: (Joel F.)[2016-02-15] This is supposed to have some JSON data and json data size
return [SDLProtocolMessage messageWithHeader:serverMessageHeader andPayload:binaryData];
diff --git a/SmartDeviceLink/private/SDLProtocolMessageAssembler.m b/SmartDeviceLink/private/SDLProtocolMessageAssembler.m
index e4a07541c..6df71e5d9 100644
--- a/SmartDeviceLink/private/SDLProtocolMessageAssembler.m
+++ b/SmartDeviceLink/private/SDLProtocolMessageAssembler.m
@@ -28,7 +28,7 @@ NS_ASSUME_NONNULL_BEGIN
// Validate input
if (message.header.sessionID != self.sessionID) {
SDLLogE(@"Message part sent to the wrong assembler. This session id: %d, message session id: %d", self.sessionID, message.header.sessionID);
- return;
+ return completionHandler(NO, nil);
}
if (self.parts == nil) {
diff --git a/SmartDeviceLink/private/SDLSecurityQueryErrorCode.h b/SmartDeviceLink/private/SDLSecurityQueryErrorCode.h
new file mode 100644
index 000000000..7f516c7d3
--- /dev/null
+++ b/SmartDeviceLink/private/SDLSecurityQueryErrorCode.h
@@ -0,0 +1,63 @@
+//
+// SDLSecurityQueryErrorCode.h
+// SmartDeviceLink
+//
+// Created by Frank Elias on 8/12/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLEnum.h"
+
+typedef SDLEnum SDLSecurityQueryErrorCode NS_TYPED_ENUM;
+
+///Internal Security Manager value
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeSuccess;
+
+///Wrong size of query data
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeInvalidQuerySize;
+
+///Unknown Query ID
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeInvalidQueryID;
+
+///SDL does not support encryption
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeNotSupported;
+
+///Received request to protect a service that was protected before
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeServiceAlreadyProtected;
+
+///Received handshake or encrypted data for not protected service
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeServiceNotProtected;
+
+///Decryption failed
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeDecryptionFailed;
+
+///Encryption failed
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeEncryptionFailed;
+
+///SSL invalid data
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeSSLInvalidData;
+
+///In case of all other handshake errors
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeHandshakeFailed;
+
+///Handshake failed because certificate is invalid
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeInvalidCertificate;
+
+///Handshake failed because certificate is expired
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeExpiredCertificate;
+
+///Internal error
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeInternal;
+
+///Error value for testing
+extern SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeUnknownInternalError;
+
+
+@interface SDLSecurityQueryError : NSObject
+
+/**
+ Compare the internal error ID with the App's security query error codes
+ */
++ (SDLSecurityQueryErrorCode)convertErrorIdToStringEnum:(NSNumber *)errorId;
+
+@end
diff --git a/SmartDeviceLink/private/SDLSecurityQueryErrorCode.m b/SmartDeviceLink/private/SDLSecurityQueryErrorCode.m
new file mode 100644
index 000000000..a1a55ea6c
--- /dev/null
+++ b/SmartDeviceLink/private/SDLSecurityQueryErrorCode.m
@@ -0,0 +1,48 @@
+//
+// SDLSecurityQueryErrorCode.m
+// SmartDeviceLink
+//
+// Created by Frank Elias on 8/12/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLSecurityQueryErrorCode.h"
+
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeSuccess = @"Success";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeInvalidQuerySize = @"Wrong size of query data";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeInvalidQueryID = @"Unknown Query ID";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeNotSupported = @"SDL does not support encryption";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeServiceAlreadyProtected = @"Received request to protect a service that was protected before";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeServiceNotProtected = @"Received handshake or encrypted data for not protected service";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeDecryptionFailed = @"Decryption failed";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeEncryptionFailed = @"Encryption failed";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeSSLInvalidData = @"SSL invalid data";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeHandshakeFailed = @"In case of all other handshake errors";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeInvalidCertificate = @"Handshake failed because certificate is invalid";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeExpiredCertificate = @"Handshake failed because certificate is expired";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeInternal = @"Internal error";
+SDLSecurityQueryErrorCode const SDLSecurityQueryErrorCodeUnknownInternalError = @"Error value for testing";
+
+
+@implementation SDLSecurityQueryError
+
++ (SDLSecurityQueryErrorCode)convertErrorIdToStringEnum:(NSNumber *)errorId {
+ switch (errorId.unsignedIntegerValue) {
+ case 0x00: return SDLSecurityQueryErrorCodeSuccess;
+ case 0x01: return SDLSecurityQueryErrorCodeInvalidQuerySize;
+ case 0x02: return SDLSecurityQueryErrorCodeInvalidQueryID;
+ case 0x03: return SDLSecurityQueryErrorCodeNotSupported;
+ case 0x04: return SDLSecurityQueryErrorCodeServiceAlreadyProtected;
+ case 0x05: return SDLSecurityQueryErrorCodeServiceNotProtected;
+ case 0x06: return SDLSecurityQueryErrorCodeDecryptionFailed;
+ case 0x07: return SDLSecurityQueryErrorCodeEncryptionFailed;
+ case 0x08: return SDLSecurityQueryErrorCodeSSLInvalidData;
+ case 0x09: return SDLSecurityQueryErrorCodeHandshakeFailed;
+ case 0x0A: return SDLSecurityQueryErrorCodeInvalidCertificate;
+ case 0x0B: return SDLSecurityQueryErrorCodeExpiredCertificate;
+ case 0xFF: return SDLSecurityQueryErrorCodeInternal;
+ default: return SDLSecurityQueryErrorCodeUnknownInternalError;
+ }
+}
+
+@end
diff --git a/SmartDeviceLink/private/SDLSecurityQueryPayload.h b/SmartDeviceLink/private/SDLSecurityQueryPayload.h
new file mode 100644
index 000000000..27354a47c
--- /dev/null
+++ b/SmartDeviceLink/private/SDLSecurityQueryPayload.h
@@ -0,0 +1,83 @@
+//
+// SDLSecurityQueryPayload.h
+// SmartDeviceLink
+//
+// Created by Frank Elias on 7/28/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "SDLRPCMessageType.h"
+
+/// Enum for different SDL security query types
+typedef NS_ENUM(Byte, SDLSecurityQueryType) {
+ /// A request that will require a response
+ SDLSecurityQueryTypeRequest = 0x00,
+
+ /// A response to a request
+ SDLSecurityQueryTypeResponse = 0x10,
+
+ /// A message that does not have a response
+ SDLSecurityQueryTypeNotification = 0x20,
+
+ /// An invalid query Type
+ SDLSecurityQueryTypeInvalid = 0xFF
+};
+
+/// Enum for each type of SDL security query IDs
+typedef NS_ENUM(UInt32, SDLSecurityQueryId) {
+ /// Send handshake data
+ SDLSecurityQueryIdSendHandshake = 0x000001,
+
+ /// Send internal error
+ SDLSecurityQueryIdSendInternalError = 0x000002,
+
+ /// Invalid query id
+ SDLSecurityQueryIdInvalid = 0xFFFFFF
+};
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLSecurityQueryPayload : NSObject
+
+/// The security query's type, could be of type request, response, or notification
+@property (assign, nonatomic) SDLSecurityQueryType queryType;
+
+/// The security query's ID.
+@property (assign, nonatomic) SDLSecurityQueryId queryID;
+
+/// The message ID is set by the Mobile libraries to track security messages.
+@property (assign, nonatomic) UInt32 sequenceNumber;
+
+/// The JSON data following the binary query header.
+@property (nullable, strong, nonatomic) NSData *jsonData;
+
+/// The binary data that is after the header (96 bits) and the JSON data.
+@property (nullable, strong, nonatomic) NSData *binaryData;
+
+/// Create a security query object from raw data
+/// @param data The data to convert into an SDLSecurityQueryPayload object
+/// @return The SDLSecurityQueryPayload object, or nil if the data is malformed
+- (nullable instancetype)initWithData:(NSData *)data;
+
+/// Create a security query object from security query properties
+/// @param queryType The security query type to be sent
+/// @param queryID The security query ID
+/// @param sequenceNumber The security query sequence number
+/// @param jsonData The JSON data to be set in the security query
+/// @param binaryData The binary data that's after the header and the JSON data
+/// @return The SDLSecurityQueryPayload non-nullable object
+- (instancetype)initWithQueryType:(SDLSecurityQueryType)queryType queryID:(SDLSecurityQueryId)queryID sequenceNumber:(UInt32)sequenceNumber jsonData:(nullable NSData *)jsonData binaryData:(nullable NSData *)binaryData;
+
+/// Create a security query object from raw data
+/// @param data The data to convert into an SDLSecurityQueryPayload object
+/// @return The SDLSecurityQueryPayload object, or nil if the data is malformed
++ (nullable id)securityPayloadWithData:(NSData *)data;
+
+/// Convert the object into raw NSData
+/// @return The raw NSData of the object
+- (NSData *)convertToData;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLSecurityQueryPayload.m b/SmartDeviceLink/private/SDLSecurityQueryPayload.m
new file mode 100644
index 000000000..744e1770a
--- /dev/null
+++ b/SmartDeviceLink/private/SDLSecurityQueryPayload.m
@@ -0,0 +1,166 @@
+//
+// SDLSecurityQueryPayload.m
+// SmartDeviceLink
+//
+// Created by Frank Elias on 7/28/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLSecurityQueryPayload.h"
+
+#import "SDLLogMacros.h"
+
+const NSUInteger SECURITY_QUERY_HEADER_SIZE = 12;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLSecurityQueryPayload
+
+- (nullable instancetype)initWithData:(NSData *)data {
+ if (data == nil || data.length < SECURITY_QUERY_HEADER_SIZE) {
+ SDLLogE(@"Security Payload error: not enough data to form Security Query header. Data length: %lu", (unsigned long)data.length);
+ return nil;
+ }
+
+ self = [super init];
+ if (!self) { return nil; }
+
+ @try {
+ // Setup our pointers for data access
+ Byte *bytePointer = (UInt8 *)data.bytes;
+ UInt32 *ui32Pointer = (UInt32 *)data.bytes;
+
+ // Extract the parts
+ UInt8 queryType = bytePointer[0];
+
+ self.queryType = queryType;
+
+ // Extract the 24 bit query ID in the last 24 bits of the first 32 bits.
+ UInt32 queryID = ui32Pointer[0];
+ queryID = CFSwapInt32BigToHost(queryID) & 0x00FFFFFF;
+ self.queryID = queryID;
+
+ // Extract the 32 bit sequence number from the data after the first 32 bits.
+ UInt32 sequenceNumber = ui32Pointer[1];
+ sequenceNumber = CFSwapInt32BigToHost(sequenceNumber);
+ self.sequenceNumber = sequenceNumber;
+
+ // Extract the 32 bit json data size from the data after the first 64 bits
+ UInt32 jsonDataSize = ui32Pointer[2];
+ jsonDataSize = CFSwapInt32BigToHost(jsonDataSize);
+
+ // Extract the JSON data after the header (96 bits) based on the JSON data size
+ NSData *jsonData = nil;
+ NSUInteger offsetOfJSONData = SECURITY_QUERY_HEADER_SIZE;
+ if (jsonDataSize > 0 && jsonDataSize <= (data.length - SECURITY_QUERY_HEADER_SIZE)) {
+ jsonData = [data subdataWithRange:NSMakeRange(offsetOfJSONData, jsonDataSize)];
+ }
+ self.jsonData = jsonData;
+
+ // Extract the binary data after the header (96 bits) and the JSON data to the end
+ NSData *binaryData = nil;
+ NSUInteger offsetOfBinaryData = SECURITY_QUERY_HEADER_SIZE + jsonDataSize;
+ NSUInteger binaryDataSize = data.length - jsonDataSize - SECURITY_QUERY_HEADER_SIZE;
+ if (binaryDataSize > 0) {
+ binaryData = [data subdataWithRange:NSMakeRange(offsetOfBinaryData, binaryDataSize)];
+ }
+ self.binaryData = binaryData;
+
+ } @catch (NSException *e) {
+ SDLLogE(@"SDLSecurityQueryPayload init error: %@", e);
+ return nil;
+ }
+
+ return self;
+}
+
+- (instancetype)initWithQueryType:(SDLSecurityQueryType)queryType queryID:(SDLSecurityQueryId)queryID sequenceNumber:(UInt32)sequenceNumber jsonData:(nullable NSData *)jsonData binaryData:(nullable NSData *)binaryData {
+ self = [super init];
+ if (!self) { return nil; }
+
+ _queryType = queryType;
+ _queryID = queryID;
+ _sequenceNumber = sequenceNumber;
+ _jsonData = jsonData;
+ _binaryData = binaryData;
+
+ return self;
+}
+
++ (nullable id)securityPayloadWithData:(NSData *)data {
+ return [[SDLSecurityQueryPayload alloc] initWithData:data];
+}
+
+- (NSData *)convertToData {
+ // From the properties, create a data buffer
+ // Query Type - first 8 bits
+ // Query ID - next 24 bits
+ // Sequence Number - next 32 bits
+ // JSON size - next 32 bits
+ UInt8 headerBuffer[SECURITY_QUERY_HEADER_SIZE];
+ *(UInt32 *)&headerBuffer[0] = CFSwapInt32HostToBig(self.queryID);
+ *(UInt32 *)&headerBuffer[4] = CFSwapInt32HostToBig(self.sequenceNumber);
+ *(UInt32 *)&headerBuffer[8] = CFSwapInt32HostToBig((UInt32)self.jsonData.length);
+ headerBuffer[0] &= 0xFF;
+ headerBuffer[0] |= self.queryType;
+
+ // Serialize the header. Append the json data, then the binary data
+ NSUInteger jsonDataSize = self.jsonData.length;
+ NSUInteger binaryDataSize = self.binaryData.length;
+ NSUInteger size = SECURITY_QUERY_HEADER_SIZE + jsonDataSize + binaryDataSize;
+ NSMutableData *dataOut = [NSMutableData dataWithCapacity:size];
+ [dataOut appendBytes:&headerBuffer length:12];
+ [dataOut appendData:self.jsonData];
+ [dataOut appendData:self.binaryData];
+
+ return dataOut;
+}
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"Security Query Header: %@, %@, sequenceNumber: %lu, json size: %lu bytes, binary size: %lu bytes", [self descriptionForQueryID], [self descriptionForQueryType], (unsigned long)self.sequenceNumber, (unsigned long)self.jsonData.length, (unsigned long)self.binaryData.length];
+}
+
+- (NSString *)descriptionForQueryID {
+ NSString *queryIdDescription;
+ switch (self.queryID) {
+ case SDLSecurityQueryIdSendHandshake:
+ queryIdDescription = @"Send Handshake Data";
+ break;
+ case SDLSecurityQueryIdSendInternalError:
+ queryIdDescription = @"Send Internal Error";
+ break;
+ case SDLSecurityQueryIdInvalid:
+ queryIdDescription = @"Invalid Query ID";
+ break;
+ default:
+ queryIdDescription = @"Unknown Query ID";
+ break;
+ }
+ return [NSString stringWithFormat:@"queryID: %lu - %@", (unsigned long)self.queryID, queryIdDescription];
+}
+
+- (NSString *)descriptionForQueryType {
+ NSString *queryTypeDescription;
+ switch (self.queryType) {
+ case SDLSecurityQueryTypeRequest:
+ queryTypeDescription = @"Request";
+ break;
+ case SDLSecurityQueryTypeResponse:
+ queryTypeDescription = @"Response";
+ break;
+ case SDLSecurityQueryTypeNotification:
+ queryTypeDescription = @"Notification";
+ break;
+ case SDLSecurityQueryTypeInvalid:
+ queryTypeDescription = @"Invalid Query Type";
+ break;
+ default:
+ queryTypeDescription = @"Unknown Query Type";
+ break;
+ }
+ return [NSString stringWithFormat:@"queryType: %lu - %@", (unsigned long)self.queryType, queryTypeDescription];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLSequentialRPCRequestOperation.m b/SmartDeviceLink/private/SDLSequentialRPCRequestOperation.m
index 96c44b82c..9fb348986 100644
--- a/SmartDeviceLink/private/SDLSequentialRPCRequestOperation.m
+++ b/SmartDeviceLink/private/SDLSequentialRPCRequestOperation.m
@@ -34,7 +34,12 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager requests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleSequentialRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
self = [super init];
- if (!self) { return nil; }
+ if (!self) {
+ if (completionHandler != nil) {
+ completionHandler(NO);
+ }
+ return nil;
+ }
executing = NO;
finished = NO;
diff --git a/SmartDeviceLink/private/SDLTextAndGraphicManager.m b/SmartDeviceLink/private/SDLTextAndGraphicManager.m
index 37b9f95fa..34c4dcf54 100644
--- a/SmartDeviceLink/private/SDLTextAndGraphicManager.m
+++ b/SmartDeviceLink/private/SDLTextAndGraphicManager.m
@@ -150,11 +150,18 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Upload / Send
- (void)updateWithCompletionHandler:(nullable SDLTextAndGraphicUpdateCompletionHandler)handler {
- if (self.isBatchingUpdates) { return; }
-
- if (self.isDirty) {
+ if (self.isBatchingUpdates) {
+ if (handler != nil) {
+ // This shouldn't be possible, but just in case
+ handler([NSError sdl_textAndGraphicManager_batchingUpdate]);
+ }
+ } else if (self.isDirty) {
self.isDirty = NO;
[self sdl_updateAndCancelPreviousOperations:YES completionHandler:handler];
+ } else {
+ if (handler != nil) {
+ handler([NSError sdl_textAndGraphicManager_nothingToUpdate]);
+ }
}
}
diff --git a/SmartDeviceLink/private/SDLUploadFileOperation.h b/SmartDeviceLink/private/SDLUploadFileOperation.h
index cd3eaa4af..c14cbfe4e 100644
--- a/SmartDeviceLink/private/SDLUploadFileOperation.h
+++ b/SmartDeviceLink/private/SDLUploadFileOperation.h
@@ -11,8 +11,8 @@
#import "SDLAsynchronousOperation.h"
#import "SDLFileManagerConstants.h"
-
@protocol SDLConnectionManagerType;
+@class SDLFileManager;
@class SDLFileWrapper;
@@ -22,16 +22,18 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLUploadFileOperation : SDLAsynchronousOperation
/**
- * Create an instance of an upload files operation which will send a file to a remote system when added to an operation queue.
+ * Create an instance of an upload files operation which will send a file to a remote system when added to an operation queue.
*
- * @param file A file wrapper around the file which will be sent and a completion handler for when the file finishes sending.
- * @param connectionManager The connection manager which will handle transporting the file bytes to the remote system
+ * @param file A file wrapper around the file which will be sent and a completion handler for when the file finishes sending.
+ * @param connectionManager The connection manager which will handle transporting the file bytes to the remote system
+ * @param fileManager The file manager, used to check if the file is uploaded
*
- * @return An instance of SDLUploadFilesOperation
+ * @return An instance of SDLUploadFilesOperation
*/
-- (instancetype)initWithFile:(SDLFileWrapper *)file connectionManager:(id<SDLConnectionManagerType>)connectionManager;
+- (instancetype)initWithFile:(SDLFileWrapper *)file connectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager;
@property (nonatomic, strong, readonly) SDLFileWrapper *fileWrapper;
+@property (nonatomic, weak) SDLFileManager *fileManager;
@end
diff --git a/SmartDeviceLink/private/SDLUploadFileOperation.m b/SmartDeviceLink/private/SDLUploadFileOperation.m
index aa476964a..bda634524 100644
--- a/SmartDeviceLink/private/SDLUploadFileOperation.m
+++ b/SmartDeviceLink/private/SDLUploadFileOperation.m
@@ -11,6 +11,7 @@
#import "SDLConnectionManagerType.h"
#import "SDLError.h"
#import "SDLFile.h"
+#import "SDLFileManager.h"
#import "SDLFileWrapper.h"
#import "SDLGlobals.h"
#import "SDLLogMacros.h"
@@ -39,22 +40,17 @@ static NSUInteger const MaxCRCValue = UINT32_MAX;
@end
-@implementation SDLUploadFileOperation {
- BOOL executing;
- BOOL finished;
-}
+@implementation SDLUploadFileOperation
-- (instancetype)initWithFile:(SDLFileWrapper *)file connectionManager:(id<SDLConnectionManagerType>)connectionManager {
+- (instancetype)initWithFile:(SDLFileWrapper *)file connectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager {
self = [super init];
if (!self) {
return nil;
}
- executing = NO;
- finished = NO;
-
_fileWrapper = file;
_connectionManager = connectionManager;
+ _fileManager = fileManager;
return self;
}
@@ -63,65 +59,56 @@ static NSUInteger const MaxCRCValue = UINT32_MAX;
[super start];
if (self.isCancelled) { return; }
- [self sdl_sendFile:self.fileWrapper.file mtuSize:[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC] withCompletion:self.fileWrapper.completionHandler];
+ SDLFile *file = self.fileWrapper.file;
+
+ // HAX: [#827](https://github.com/smartdevicelink/sdl_ios/issues/827) Older versions of Core had a bug where list files would cache incorrectly. This led to attempted uploads failing due to the system thinking they were already there when they were not. This is only needed if connecting to Core v4.3.1 or less which corresponds to RPC v4.3.1 or less
+ if (!file.persistent && ![self.fileManager hasUploadedFile:file] && [[SDLGlobals sharedGlobals].rpcVersion isLessThanVersion:[SDLVersion versionWithMajor:4 minor:4 patch:0]]) {
+ file.overwrite = YES;
+ }
+
+ if (![self.fileManager fileNeedsUpload:file]) {
+ SDLLogW(@"File is already on the head unit, aborting upload operation");
+ self.fileWrapper.completionHandler(NO, NSNotFound, [NSError sdl_fileManager_cannotOverwriteError]);
+ return [self finishOperation];
+ }
+
+ [self sdl_sendFile:file mtuSize:[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC] withCompletion:self.fileWrapper.completionHandler];
}
/**
- Sends data asynchronously to the SDL Core by breaking the data into smaller packets, each of which is sent via a putfile. To prevent large files from eating up memory, the data packet is deleted once it is sent via a putfile. If the SDL Core receives all the putfiles successfully, a success response with the amount of free storage space left on the SDL Core is returned. Otherwise the error returned by the SDL Core is passed along.
+ Sends data asynchronously to the SDL Core by breaking the data into smaller packets, each of which is sent via a PutFile. To prevent large files from eating up memory, the data packet is deleted once it is sent via a PutFile. If the SDL Core receives all the PutFiles successfully, a success response with the amount of free storage space left on the SDL Core is returned. Otherwise the error returned by the SDL Core is passed along.
@param file The file containing the data to be sent to the SDL Core
@param mtuSize The maximum packet size allowed
@param completion Closure returning whether or not the upload was a success
*/
-- (void)sdl_sendFile:(SDLFile *)file mtuSize:(NSUInteger)mtuSize withCompletion:(SDLFileManagerUploadCompletionHandler)completion {
+- (void)sdl_sendFile:(SDLFile *)file mtuSize:(NSUInteger)mtuSize withCompletion:(SDLFileManagerUploadCompletionHandler)completion {
__block NSError *streamError = nil;
__block NSUInteger bytesAvailable = 2000000000;
__block NSInteger highestCorrelationIDReceived = -1;
- if (self.isCancelled) {
- completion(NO, bytesAvailable, [NSError sdl_fileManager_fileUploadCanceled]);
- [self finishOperation];
- return;
- }
-
if (file == nil) {
completion(NO, bytesAvailable, [NSError sdl_fileManager_fileDoesNotExistError]);
- [self finishOperation];
- return;
+ return [self finishOperation];
}
self.inputStream = [self sdl_openInputStreamWithFile:file];
- if (self.inputStream == nil || ![self.inputStream hasBytesAvailable]) {
+ if (self.inputStream == nil || !self.inputStream.hasBytesAvailable) {
// If the file does not exist or the passed data is nil, return an error
[self sdl_closeInputStream];
completion(NO, bytesAvailable, [NSError sdl_fileManager_fileDoesNotExistError]);
- [self finishOperation];
- return;
+ return [self finishOperation];
}
dispatch_group_t putFileGroup = dispatch_group_create();
dispatch_group_enter(putFileGroup);
- // Wait for all packets be sent before returning whether or not the upload was a success
- __weak typeof(self) weakself = self;
- dispatch_group_notify(putFileGroup, [SDLGlobals sharedGlobals].sdlProcessingQueue, ^{
- typeof(weakself) strongself = weakself;
- [weakself sdl_closeInputStream];
-
- if (streamError != nil || strongself.isCancelled) {
- completion(NO, bytesAvailable, streamError);
- } else {
- completion(YES, bytesAvailable, nil);
- }
-
- [weakself finishOperation];
- });
-
// Break the data into small pieces, each of which will be sent in a separate putfile
NSUInteger maxBulkDataSize = [self.class sdl_getMaxBulkDataSizeForFile:file mtuSize:mtuSize];
NSUInteger currentOffset = 0;
- for (int i = 0; i < (((file.fileSize - 1) / maxBulkDataSize) + 1); i++) {
+ NSUInteger numPutFiles = (((file.fileSize - 1) / maxBulkDataSize) + 1);
+ for (int i = 0; i < numPutFiles; i++) {
dispatch_group_enter(putFileGroup);
// Get a chunk of data from the input stream
@@ -145,19 +132,11 @@ static NSUInteger const MaxCRCValue = UINT32_MAX;
typeof(weakself) strongself = weakself;
SDLPutFileResponse *putFileResponse = (SDLPutFileResponse *)response;
- // Check if the upload process has been cancelled by another packet. If so, stop the upload process.
// TODO: Is this the right way to handle this case? Should we just abort everything in the future? Should we be deleting what we sent? Should we have an automatic retry strategy based on what the error was?
- if (strongself.isCancelled) {
- dispatch_group_leave(putFileGroup);
- BLOCK_RETURN;
- }
-
// If the SDL Core returned an error, cancel the upload the process in the future
if (error != nil || response == nil || !response.success.boolValue || strongself.isCancelled) {
- [strongself cancel];
streamError = error;
- dispatch_group_leave(putFileGroup);
- BLOCK_RETURN;
+ BLOCK_RETURN dispatch_group_leave(putFileGroup);;
}
// If no errors, watch for a response containing the amount of storage left on the SDL Core
@@ -172,6 +151,22 @@ static NSUInteger const MaxCRCValue = UINT32_MAX;
}];
}
dispatch_group_leave(putFileGroup);
+
+ // Wait for all packets be sent before returning whether or not the upload was a success
+ __weak typeof(self) weakself = self;
+ dispatch_group_notify(putFileGroup, [SDLGlobals sharedGlobals].sdlProcessingQueue, ^{
+ typeof(weakself) strongself = weakself;
+ [strongself sdl_closeInputStream];
+
+ if (streamError != nil || strongself.isCancelled) {
+ SDLLogE(@"Error sending PutFile RPCs for upload: %@, error: %@", strongself.fileWrapper.file, streamError);
+ completion(NO, bytesAvailable, streamError);
+ } else {
+ completion(YES, bytesAvailable, nil);
+ }
+
+ [strongself finishOperation];
+ });
}
/**
diff --git a/SmartDeviceLink/private/SDLVoiceCommandManager.m b/SmartDeviceLink/private/SDLVoiceCommandManager.m
index 3d7f51dd5..b4990b263 100644
--- a/SmartDeviceLink/private/SDLVoiceCommandManager.m
+++ b/SmartDeviceLink/private/SDLVoiceCommandManager.m
@@ -12,6 +12,7 @@
#import "SDLConnectionManagerType.h"
#import "SDLDeleteCommand.h"
#import "SDLError.h"
+#import "SDLGlobals.h"
#import "SDLHMILevel.h"
#import "SDLLogMacros.h"
#import "SDLNotificationConstants.h"
@@ -87,6 +88,7 @@ UInt32 const VoiceCommandIdMin = 1900000000;
queue.name = @"SDLVoiceCommandManager Transaction Queue";
queue.maxConcurrentOperationCount = 1;
queue.qualityOfService = NSQualityOfServiceUserInitiated;
+ queue.underlyingQueue = [SDLGlobals sharedGlobals].sdlConcurrentQueue;
queue.suspended = YES;
return queue;
@@ -210,9 +212,7 @@ UInt32 const VoiceCommandIdMin = 1900000000;
- (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification {
SDLOnHMIStatus *hmiStatus = (SDLOnHMIStatus *)notification.notification;
- if (hmiStatus.windowID != nil && hmiStatus.windowID.integerValue != SDLPredefinedWindowsDefaultWindow) {
- return;
- }
+ if ((hmiStatus.windowID != nil) && (hmiStatus.windowID.integerValue != SDLPredefinedWindowsDefaultWindow)) { return; }
self.currentLevel = hmiStatus.hmiLevel;
[self sdl_updateTransactionQueueSuspended];
diff --git a/SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.m b/SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.m
index 8cf04c400..9d80ea8a3 100644
--- a/SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.m
+++ b/SmartDeviceLink/private/SDLVoiceCommandUpdateOperation.m
@@ -39,7 +39,10 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager pendingVoiceCommands:(NSArray<SDLVoiceCommand *> *)pendingVoiceCommands oldVoiceCommands:(NSArray<SDLVoiceCommand *> *)oldVoiceCommands updateCompletionHandler:(SDLVoiceCommandUpdateCompletionHandler)completionHandler {
self = [self init];
- if (!self) { return nil; }
+ if (!self) {
+ completionHandler(@[], [NSError sdl_failedToCreateObjectOfClass:[SDLVoiceCommandUpdateOperation class]]);
+ return nil;
+ }
_connectionManager = connectionManager;
_pendingVoiceCommands = pendingVoiceCommands;
@@ -68,10 +71,7 @@ NS_ASSUME_NONNULL_BEGIN
__weak typeof(self) weakSelf = self;
[self sdl_sendDeleteCurrentVoiceCommands:^{
// If the operation has been canceled, then don't send the new commands and finish the operation
- if (self.isCancelled) {
- [weakSelf finishOperation];
- return;
- }
+ if (self.isCancelled) { return [weakSelf finishOperation]; }
// Send the new commands
[weakSelf sdl_sendCurrentVoiceCommands:^{
diff --git a/SmartDeviceLink/public/SDLAlertAudioData.h b/SmartDeviceLink/public/SDLAlertAudioData.h
index 93b5462aa..85f907a18 100644
--- a/SmartDeviceLink/public/SDLAlertAudioData.h
+++ b/SmartDeviceLink/public/SDLAlertAudioData.h
@@ -10,11 +10,13 @@
NS_ASSUME_NONNULL_BEGIN
+/// Audio data for an SDLAlertView
@interface SDLAlertAudioData : SDLAudioData
/// Whether the alert tone should be played before the prompt (if any) is spoken. Defaults to NO.
@property (assign, nonatomic) BOOL playTone;
+/// Use another init instead. See superclass SDLAudioData.
- (instancetype)init NS_UNAVAILABLE;
@end
diff --git a/SmartDeviceLink/public/SDLAlertView.h b/SmartDeviceLink/public/SDLAlertView.h
index c2524b17a..764995cb7 100644
--- a/SmartDeviceLink/public/SDLAlertView.h
+++ b/SmartDeviceLink/public/SDLAlertView.h
@@ -19,6 +19,7 @@ NS_ASSUME_NONNULL_BEGIN
/// Notifies the subscriber that the alert should be cancelled.
typedef void (^SDLAlertCanceledHandler)(void);
+/// An alert view to be displayed on the remote module. Pass this object to the SDLScreenManager to display.
@interface SDLAlertView : NSObject <NSCopying>
/// Set this to change the default timeout for all alerts. If a timeout is not set on an individual alert object (or if it is set to 0.0), then it will use this timeout instead. See `timeout` for more details. If this is not set by you, it will default to 5 seconds. The minimum is 3 seconds, the maximum is 10 seconds. If this is set below the minimum, it will be capped at 3 seconds. If this is set above the maximum, it will be capped at 10 seconds.
@@ -50,6 +51,7 @@ typedef void (^SDLAlertCanceledHandler)(void);
/// An artwork that will be displayed when the icon appears. This will be uploaded prior to the appearance of the alert if necessary. This will not be uploaded if the head unit does not declare support for alertIcon.
@property (nullable, copy, nonatomic) SDLArtwork *icon;
+/// Use one of the other init methods
- (instancetype)init NS_DESIGNATED_INITIALIZER;
/// Initialize a basic alert with a message and buttons
diff --git a/SmartDeviceLink/public/SDLAppCapabilityType.h b/SmartDeviceLink/public/SDLAppCapabilityType.h
index 73aa1bd83..225dddf15 100644
--- a/SmartDeviceLink/public/SDLAppCapabilityType.h
+++ b/SmartDeviceLink/public/SDLAppCapabilityType.h
@@ -39,4 +39,5 @@
*/
typedef SDLEnum SDLAppCapabilityType NS_TYPED_ENUM;
+/// Video streaming app capability. Used internally.
extern SDLAppCapabilityType const SDLAppCapabilityTypeVideoStreaming;
diff --git a/SmartDeviceLink/public/SDLAudioData.h b/SmartDeviceLink/public/SDLAudioData.h
index a4c0a3667..1b41fb3fc 100644
--- a/SmartDeviceLink/public/SDLAudioData.h
+++ b/SmartDeviceLink/public/SDLAudioData.h
@@ -15,6 +15,7 @@
NS_ASSUME_NONNULL_BEGIN
+/// Audio data for various SDLScreenManager views
@interface SDLAudioData : NSObject <NSCopying>
/// The text-to-speech prompts that will used and/or audio files that will be played. The audio prompts and files will be played in the same order they are added.
@@ -35,6 +36,7 @@ NS_ASSUME_NONNULL_BEGIN
/// @param phoneticType Must be one of `SAPI_PHONEMES`, `LHPLUS_PHONEMES`, `TEXT`, or `PRE_RECORDED` or no object will be created
- (instancetype)initWithPhoneticSpeechSynthesizerString:(NSString *)phoneticString phoneticType:(SDLSpeechCapabilities)phoneticType;
+/// Use another init method instead.
- (instancetype)init NS_UNAVAILABLE;
/// Add additional SDLFiles holding data or pointing to a file on the file system. When this object is passed to an `Alert` or `Speak`, the file will be uploaded if it is not already, then played if the system supports that feature.
diff --git a/SmartDeviceLink/public/SDLBodyInformation.h b/SmartDeviceLink/public/SDLBodyInformation.h
index 081033a1d..8ac6056ef 100644
--- a/SmartDeviceLink/public/SDLBodyInformation.h
+++ b/SmartDeviceLink/public/SDLBodyInformation.h
@@ -13,6 +13,7 @@
NS_ASSUME_NONNULL_BEGIN
+/// Vehicle data body information containing information like the park brake status, the ignition status, gate and roof statuses, etc.
@interface SDLBodyInformation : SDLRPCStruct
/**
diff --git a/SmartDeviceLink/public/SDLChoiceCell.m b/SmartDeviceLink/public/SDLChoiceCell.m
index 8d2d767c8..afbe2e972 100644
--- a/SmartDeviceLink/public/SDLChoiceCell.m
+++ b/SmartDeviceLink/public/SDLChoiceCell.m
@@ -16,13 +16,14 @@ NS_ASSUME_NONNULL_BEGIN
@interface SDLChoiceCell()
@property (assign, nonatomic) UInt16 choiceId;
-@property (nonatomic, readwrite) NSString *uniqueText;
@property (copy, nonatomic, readwrite, nullable) NSString *secondaryText;
@property (copy, nonatomic, readwrite, nullable) NSString *tertiaryText;
@property (copy, nonatomic, readwrite, nullable) NSArray<NSString *> *voiceCommands;
@property (strong, nonatomic, readwrite, nullable) SDLArtwork *artwork;
@property (strong, nonatomic, readwrite, nullable) SDLArtwork *secondaryArtwork;
+@property (assign, nonatomic) NSUInteger uniqueTextId;
+
@end
@implementation SDLChoiceCell
@@ -47,13 +48,23 @@ NS_ASSUME_NONNULL_BEGIN
_voiceCommands = voiceCommands;
_artwork = artwork;
_secondaryArtwork = secondaryArtwork;
- _uniqueText = text;
+ _uniqueTextId = 1;
_choiceId = UINT16_MAX;
return self;
}
+#pragma mark - Getters
+
+- (NSString *)uniqueText {
+ if (self.uniqueTextId != 1) {
+ return [NSString stringWithFormat:@"%@ (%lu)", self.text, (unsigned long)self.uniqueTextId];
+ } else {
+ return self.text;
+ }
+}
+
#pragma mark - Object Equality
@@ -92,11 +103,15 @@ NSUInteger NSUIntRotate(NSUInteger val, NSUInteger howMuch) {
#pragma mark - Etc.
- (id)copyWithZone:(nullable NSZone *)zone {
- return [[SDLChoiceCell allocWithZone:zone] initWithText:_text secondaryText:_secondaryText tertiaryText:_tertiaryText voiceCommands:_voiceCommands artwork:_artwork secondaryArtwork:_secondaryArtwork];
+ SDLChoiceCell *newCell = [[SDLChoiceCell allocWithZone:zone] initWithText:_text secondaryText:_secondaryText tertiaryText:_tertiaryText voiceCommands:_voiceCommands artwork:_artwork secondaryArtwork:_secondaryArtwork];
+ newCell.choiceId = _choiceId;
+ newCell.uniqueTextId = _uniqueTextId;
+
+ return newCell;
}
- (NSString *)description {
- return [NSString stringWithFormat:@"SDLChoiceCell: %u-\"%@ - %@ - %@\", artworkNames: %@ - %@, voice commands: %lu, uniqueText: %@", _choiceId, _text, _secondaryText, _tertiaryText, _artwork.name, _secondaryArtwork.name, (unsigned long)_voiceCommands.count, ([_text isEqualToString:_uniqueText] ? @"NO" : _uniqueText)];
+ return [NSString stringWithFormat:@"SDLChoiceCell: %u-\"%@ - %@ - %@\", artworkNames: %@ - %@, voice commands: %lu, uniqueText: %@", _choiceId, _text, _secondaryText, _tertiaryText, _artwork.name, _secondaryArtwork.name, (unsigned long)_voiceCommands.count, ((_uniqueTextId == 1) ? @"NO" : self.uniqueText)];
}
@end
diff --git a/SmartDeviceLink/public/SDLChoiceSet.m b/SmartDeviceLink/public/SDLChoiceSet.m
index 8baf085a6..85c22bbcd 100644
--- a/SmartDeviceLink/public/SDLChoiceSet.m
+++ b/SmartDeviceLink/public/SDLChoiceSet.m
@@ -145,7 +145,7 @@ static SDLChoiceSetLayout _defaultLayout = SDLChoiceSetLayoutList;
@param choices The choices you will be adding
@return Boolean that indicates whether choices and voice commands are unique or not
*/
--(BOOL)sdl_choiceCellsAreUnique:(NSArray<SDLChoiceCell *> *)choices {
+- (BOOL)sdl_choiceCellsAreUnique:(NSArray<SDLChoiceCell *> *)choices {
NSMutableSet<SDLChoiceCell *> *identicalCellsCheckSet = [NSMutableSet setWithCapacity:choices.count];
NSMutableSet<NSString *> *identicalVoiceCommandsCheckSet = [NSMutableSet set];
NSUInteger allVoiceCommandsCount = 0;
diff --git a/SmartDeviceLink/public/SDLCreateWindow.h b/SmartDeviceLink/public/SDLCreateWindow.h
index ad4475ef2..7d54bab83 100644
--- a/SmartDeviceLink/public/SDLCreateWindow.h
+++ b/SmartDeviceLink/public/SDLCreateWindow.h
@@ -27,7 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithId:(NSUInteger)windowId windowName:(NSString *)windowName windowType:(SDLWindowType)windowType;
/**
- Convinience constructor with all the parameters.
+ Convenience constructor with all the parameters.
@param windowId The type of the window to be created. Main window or widget.
@param windowName The window name to be used by the HMI. @see windowName
diff --git a/SmartDeviceLink/public/SDLDoorStatus.h b/SmartDeviceLink/public/SDLDoorStatus.h
index 9562a9ebf..2915d8ca9 100644
--- a/SmartDeviceLink/public/SDLDoorStatus.h
+++ b/SmartDeviceLink/public/SDLDoorStatus.h
@@ -51,10 +51,12 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status;
+/// The location of the door on the vehicle grid
@property (strong, nonatomic) SDLGrid *location;
+/// The status of the door
@property (strong, nonatomic) SDLDoorStatusType status;
@end
-NS_ASSUME_NONNULL_END \ No newline at end of file
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLDoorStatusType.h b/SmartDeviceLink/public/SDLDoorStatusType.h
index b4e399bfc..9e4357bf3 100644
--- a/SmartDeviceLink/public/SDLDoorStatusType.h
+++ b/SmartDeviceLink/public/SDLDoorStatusType.h
@@ -37,10 +37,14 @@
*/
typedef SDLEnum SDLDoorStatusType NS_TYPED_ENUM;
+/// Door is closed and unlocked
extern SDLDoorStatusType const SDLDoorStatusTypeClosed;
+/// Door is closed and locked
extern SDLDoorStatusType const SDLDoorStatusTypeLocked;
+/// Door is open
extern SDLDoorStatusType const SDLDoorStatusTypeAjar;
+/// Door is removed from the vehicle
extern SDLDoorStatusType const SDLDoorStatusTypeRemoved;
diff --git a/SmartDeviceLink/public/SDLErrorConstants.h b/SmartDeviceLink/public/SDLErrorConstants.h
index e653ad2d4..4f407c353 100644
--- a/SmartDeviceLink/public/SDLErrorConstants.h
+++ b/SmartDeviceLink/public/SDLErrorConstants.h
@@ -13,6 +13,9 @@
/// A typedef declaration of the SDL error domain
typedef NSString SDLErrorDomain;
+/// An error with the iOS system
+extern SDLErrorDomain *const SDLErrorDomainSystem;
+
/// An error in the SDLAudioStreamManager
extern SDLErrorDomain *const SDLErrorDomainAudioStreamManager;
@@ -58,6 +61,12 @@ extern SDLErrorDomain *const SDLErrorDomainTransport;
#pragma mark Error Codes
+/// Error associated with the underlying operating system
+typedef NS_ENUM(NSInteger, SDLSystemError) {
+ /// iOS failed to create an object
+ SDLSystemErrorFailedToCreateObject = -1
+};
+
/**
* Errors associated with the SDLManager class.
*/
@@ -168,7 +177,13 @@ typedef NS_ENUM(NSInteger, SDLFileManagerError) {
*/
typedef NS_ENUM(NSInteger, SDLTextAndGraphicManagerError) {
/// A pending update was superseded by a newer requested update. The old update will not be sent
- SDLTextAndGraphicManagerErrorPendingUpdateSuperseded = -1
+ SDLTextAndGraphicManagerErrorPendingUpdateSuperseded = -1,
+
+ /// The manager is currently batching updates so the update will not yet be sent and the handler will not be called
+ SDLTextAndGraphicManagerErrorCurrentlyBatching = -2,
+
+ /// The manager could find nothing to update
+ SDLTextAndGraphicManagerErrorNothingToUpdate = -3,
};
/**
@@ -193,13 +208,27 @@ typedef NS_ENUM(NSInteger, SDLSubscribeButtonManagerError) {
typedef NS_ENUM(NSInteger, SDLMenuManagerError) {
/// Sending menu-related RPCs returned an error from the remote system
SDLMenuManagerErrorRPCsFailed = -1,
- SDLMenuManagerErrorPendingUpdateSuperseded = -2
+
+ /// A pending menu update was superseded by a later update and did not run
+ SDLMenuManagerErrorPendingUpdateSuperseded = -2,
+
+ /// A pending or in-progress menu update was cancelled
+ SDLMenuManagerErrorOperationCancelled = -3,
+
+ /// A configuration update failed because the configuration is not supported
+ SDLMenuManagerErrorConfigurationUpdateLayoutNotSupported = -4,
+
+ /// A configuration update failed
+ SDLMenuManagerErrorConfigurationUpdateFailed = -5,
+
+ /// An open menu operation failed
+ SDLMenuManagerErrorOpenMenuFailed = -6
};
/// Errors associated with Choice Set Manager class
typedef NS_ENUM(NSInteger, SDLChoiceSetManagerError) {
- /// The choice set has been deleted before it was presented
- SDLChoiceSetManagerErrorPendingPresentationDeleted = -1,
+ /// Some needed choices for presentation are not available
+ SDLChoiceSetManagerErrorNeededChoicesUnavailable = -1,
/// The choice set failed to delete
SDLChoiceSetManagerErrorDeletionFailed = -2,
@@ -211,7 +240,13 @@ typedef NS_ENUM(NSInteger, SDLChoiceSetManagerError) {
SDLChoiceSetManagerErrorFailedToCreateMenuItems = -4,
/// Invalid state
- SDLChoiceSetManagerErrorInvalidState = -5
+ SDLChoiceSetManagerErrorInvalidState = -5,
+
+ /// An operation was cancelled and may or may not have succeeded
+ SDLChoiceSetManagerErrorCancelled = -6,
+
+ /// No new choices could be loaded because the maximum number of choices are loaded (65535)
+ SDLChoiceSetManagerErrorNoIdsAvailable = -7,
};
/// Errors associated with Alert Manager class
@@ -232,7 +267,10 @@ typedef NS_ENUM(NSInteger, SDLSystemCapabilityManagerError) {
SDLSystemCapabilityManagerErrorHMINone = -2,
/// You may not update the system capability type DISPLAYS because it is always subscribed
- SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays = -3
+ SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays = -3,
+
+ /// The module sent an unknown system capability type
+ SDLSystemCapabilityManagerErrorUnknownType = -4,
};
/**
diff --git a/SmartDeviceLink/public/SDLErrorConstants.m b/SmartDeviceLink/public/SDLErrorConstants.m
index ccfc62472..b6e77a210 100644
--- a/SmartDeviceLink/public/SDLErrorConstants.m
+++ b/SmartDeviceLink/public/SDLErrorConstants.m
@@ -10,6 +10,7 @@
#pragma mark Error Domains
+SDLErrorDomain *const SDLErrorDomainSystem = @"com.sdl.system.error";
SDLErrorDomain *const SDLErrorDomainAudioStreamManager = @"com.sdl.extension.pcmAudioStreamManager";
SDLErrorDomain *const SDLErrorDomainCacheFileManager = @"com.sdl.cachefilemanager.error";
SDLErrorDomain *const SDLErrorDomainChoiceSetManager = @"com.sdl.choicesetmanager.error";
diff --git a/SmartDeviceLink/public/SDLFile.m b/SmartDeviceLink/public/SDLFile.m
index b3efaf200..424e7c3b3 100644
--- a/SmartDeviceLink/public/SDLFile.m
+++ b/SmartDeviceLink/public/SDLFile.m
@@ -161,7 +161,18 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - NSCopying
- (id)copyWithZone:(nullable NSZone *)zone {
- return [[self.class allocWithZone:zone] initWithFileURL:_fileURL name:_name persistent:_persistent];
+ SDLFile *fileCopy = [[self.class allocWithZone:zone] init];
+ fileCopy.name = _name.copy;
+ fileCopy.fileURL = _fileURL.copy;
+ fileCopy.fileType = _fileType.copy;
+ fileCopy.persistent = _persistent;
+ fileCopy.isStaticIcon = _isStaticIcon;
+
+ if (_data.length != 0) {
+ fileCopy.data = _data.copy;
+ }
+
+ return fileCopy;
}
#pragma mark - NSObject overrides
@@ -186,9 +197,17 @@ NS_ASSUME_NONNULL_BEGIN
if (!file) { return NO; }
BOOL haveEqualNames = [self.name isEqualToString:file.name];
- BOOL haveEqualData = [self.data isEqualToData:file.data];
BOOL haveEqualFormats = [self.fileType isEqualToEnum:file.fileType];
+ BOOL haveEqualData = NO;
+ if (self.data.length == 0 && file.data.length == 0) {
+ haveEqualData = [self.fileURL isEqual:file.fileURL];
+ } else if (self.data.length > 0 && file.data.length > 0) {
+ haveEqualData = [self.data isEqualToData:file.data];
+ } else {
+ return NO;
+ }
+
return haveEqualNames && haveEqualData && haveEqualFormats;
}
diff --git a/SmartDeviceLink/public/SDLFileManager.h b/SmartDeviceLink/public/SDLFileManager.h
index 4d0ce1ed5..b3edabacf 100644
--- a/SmartDeviceLink/public/SDLFileManager.h
+++ b/SmartDeviceLink/public/SDLFileManager.h
@@ -102,7 +102,7 @@ typedef void (^SDLFileManagerStartupCompletionHandler)(BOOL success, NSError *__
- (void)deleteRemoteFileWithName:(SDLFileName *)name completionHandler:(nullable SDLFileManagerDeleteCompletionHandler)completion NS_SWIFT_NAME(delete(fileName:completionHandler:));
/**
- * 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.
+ * 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 delete request is sent.
*
* @param names The names of the files to be deleted
* @param completionHandler an optional SDLFileManagerMultiDeleteCompletionHandler
@@ -120,7 +120,7 @@ typedef void (^SDLFileManagerStartupCompletionHandler)(BOOL success, NSError *__
/**
* 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.
*
- * The optional progress handler can be used to keep track of the upload progress. After each file upload, the progress handler returns the upload percentage and an error, if one occured during the upload process. The progress handler also includes an option to cancel the upload of all remaining files in queue.
+ * The optional progress handler can be used to keep track of the upload progress. After each file upload, the progress handler returns the upload percentage and an error, if one occurred during the upload process. The progress handler also includes an option to cancel the upload of all remaining files in queue.
*
* @param files An array of SDLFiles to be sent
* @param progressHandler an optional SDLFileManagerMultiUploadProgressHandler
diff --git a/SmartDeviceLink/public/SDLFileManager.m b/SmartDeviceLink/public/SDLFileManager.m
index 2acf44626..acb6f6d99 100644
--- a/SmartDeviceLink/public/SDLFileManager.m
+++ b/SmartDeviceLink/public/SDLFileManager.m
@@ -12,6 +12,7 @@
#import "SDLLogMacros.h"
#import "SDLDeleteFileOperation.h"
#import "SDLError.h"
+#import "SDLErrorConstants.h"
#import "SDLFile.h"
#import "SDLFileManagerConfiguration.h"
#import "SDLFileWrapper.h"
@@ -230,13 +231,8 @@ SDLFileManagerState *const SDLFileManagerStateStartupError = @"StartupError";
#pragma mark - Deleting
- (void)deleteRemoteFileWithName:(SDLFileName *)name completionHandler:(nullable SDLFileManagerDeleteCompletionHandler)handler {
- if ((![self.remoteFileNames containsObject:name]) && (handler != nil)) {
- handler(NO, self.bytesAvailable, [NSError sdl_fileManager_noKnownFileError]);
- return;
- }
-
__weak typeof(self) weakSelf = self;
- SDLDeleteFileOperation *deleteOperation = [[SDLDeleteFileOperation alloc] initWithFileName:name connectionManager:self.connectionManager completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError *_Nullable error) {
+ SDLDeleteFileOperation *deleteOperation = [[SDLDeleteFileOperation alloc] initWithFileName:name connectionManager:self.connectionManager remoteFileNames:self.remoteFileNames completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError *_Nullable error) {
__strong typeof(weakSelf) strongSelf = weakSelf;
// Mutate self based on the changes
@@ -262,10 +258,10 @@ SDLFileManagerState *const SDLFileManagerStateStartupError = @"StartupError";
dispatch_group_t deleteFilesTask = dispatch_group_create();
dispatch_group_enter(deleteFilesTask);
- for(NSString *name in names) {
+ for (NSString *name in names) {
dispatch_group_enter(deleteFilesTask);
[self deleteRemoteFileWithName:name completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
- if(!success) {
+ if (!success) {
failedDeletes[name] = error;
}
dispatch_group_leave(deleteFilesTask);
@@ -273,7 +269,7 @@ SDLFileManagerState *const SDLFileManagerStateStartupError = @"StartupError";
}
dispatch_group_leave(deleteFilesTask);
- // Wait for all files to be deleted
+ // When all files to be deleted
dispatch_group_notify(deleteFilesTask, [SDLGlobals sharedGlobals].sdlProcessingQueue, ^{
if (completionHandler == nil) { return; }
if (failedDeletes.count > 0) {
@@ -334,7 +330,7 @@ SDLFileManagerState *const SDLFileManagerStateStartupError = @"StartupError";
dispatch_group_enter(uploadFilesTask);
__weak typeof(self) weakself = self;
[self uploadFile:file completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
- if(!success) {
+ if (!success) {
failedUploads[file.name] = error;
}
@@ -388,50 +384,38 @@ SDLFileManagerState *const SDLFileManagerStateStartupError = @"StartupError";
return;
}
- // HAX: [#827](https://github.com/smartdevicelink/sdl_ios/issues/827) Older versions of Core had a bug where list files would cache incorrectly. This led to attempted uploads failing due to the system thinking they were already there when they were not. This is only needed if connecting to Core v4.3.1 or less which corresponds to RPC v4.3.1 or less
- if (!file.persistent && ![self hasUploadedFile:file] && [[SDLGlobals sharedGlobals].rpcVersion isLessThanVersion:[SDLVersion versionWithMajor:4 minor:4 patch:0]]) {
- file.overwrite = YES;
- }
-
- // Check our overwrite settings and error out if it would overwrite
- if (!file.overwrite && [self.remoteFileNames containsObject:file.name]) {
- if (handler != nil) {
- handler(NO, self.bytesAvailable, [NSError sdl_fileManager_cannotOverwriteError]);
- }
- return;
- }
-
// If we didn't error out over the overwrite, then continue on
[self sdl_uploadFile:file completionHandler:handler];
}
- (void)sdl_uploadFile:(SDLFile *)file completionHandler:(nullable SDLFileManagerUploadCompletionHandler)handler {
- __block NSString *fileName = file.name;
- __block SDLFileManagerUploadCompletionHandler uploadCompletion = [handler copy];
+ SDLFile *fileCopy = [file copy];
__weak typeof(self) weakSelf = self;
- SDLFileWrapper *fileWrapper = [SDLFileWrapper wrapperWithFile:file completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError *_Nullable error) {
+ SDLFileWrapper *fileWrapper = [SDLFileWrapper wrapperWithFile:fileCopy completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError *_Nullable error) {
if (success) {
weakSelf.bytesAvailable = bytesAvailable;
- [weakSelf.mutableRemoteFileNames addObject:fileName];
- [weakSelf.uploadedEphemeralFileNames addObject:fileName];
- } else {
- weakSelf.failedFileUploadsCount = [weakSelf.class sdl_incrementFailedUploadCountForFileName:file.name failedFileUploadsCount:weakSelf.failedFileUploadsCount];
+ [weakSelf.mutableRemoteFileNames addObject:fileCopy.name];
+
+ if (!file.persistent) {
+ [weakSelf.uploadedEphemeralFileNames addObject:fileCopy.name];
+ }
+ } else if (error.code != SDLFileManagerErrorCannotOverwrite) {
+ weakSelf.failedFileUploadsCount = [weakSelf.class sdl_incrementFailedUploadCountForFileName:fileCopy.name failedFileUploadsCount:weakSelf.failedFileUploadsCount];
- NSUInteger maxUploadCount = [file isMemberOfClass:[SDLArtwork class]] ? weakSelf.maxArtworkUploadAttempts : self.maxFileUploadAttempts;
- if ([weakSelf sdl_canFileBeUploadedAgain:file maxUploadCount:maxUploadCount failedFileUploadsCount:weakSelf.failedFileUploadsCount]) {
+ NSUInteger maxUploadCount = [fileCopy isMemberOfClass:[SDLArtwork class]] ? weakSelf.maxArtworkUploadAttempts : weakSelf.maxFileUploadAttempts;
+ if ([weakSelf sdl_canFileBeUploadedAgain:fileCopy maxUploadCount:maxUploadCount failedFileUploadsCount:weakSelf.failedFileUploadsCount]) {
SDLLogD(@"Attempting to resend file with name %@ after a failed upload attempt", file.name);
- return [weakSelf sdl_uploadFile:file completionHandler:handler];
+ return [weakSelf sdl_uploadFile:fileCopy completionHandler:handler];
}
}
- if (uploadCompletion != nil) {
- uploadCompletion(success, bytesAvailable, error);
+ if (handler != nil) {
+ handler(success, bytesAvailable, error);
}
}];
- SDLUploadFileOperation *uploadOperation = [[SDLUploadFileOperation alloc] initWithFile:fileWrapper connectionManager:self.connectionManager];
-
+ SDLUploadFileOperation *uploadOperation = [[SDLUploadFileOperation alloc] initWithFile:fileWrapper connectionManager:self.connectionManager fileManager:self];
[self.transactionQueue addOperation:uploadOperation];
}
diff --git a/SmartDeviceLink/public/SDLGateStatus.h b/SmartDeviceLink/public/SDLGateStatus.h
index 0aa78a810..69477f190 100644
--- a/SmartDeviceLink/public/SDLGateStatus.h
+++ b/SmartDeviceLink/public/SDLGateStatus.h
@@ -51,8 +51,10 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status;
+/// The location of the gate on the vehicle grid
@property (strong, nonatomic) SDLGrid *location;
+/// The status of the gate
@property (strong, nonatomic) SDLDoorStatusType status;
@end
diff --git a/SmartDeviceLink/public/SDLKeyboardInputMask.h b/SmartDeviceLink/public/SDLKeyboardInputMask.h
index fc16b1756..97b20d0ee 100644
--- a/SmartDeviceLink/public/SDLKeyboardInputMask.h
+++ b/SmartDeviceLink/public/SDLKeyboardInputMask.h
@@ -39,8 +39,11 @@
*/
typedef SDLEnum SDLKeyboardInputMask NS_TYPED_ENUM;
+/// Key mask is enabled. Input characters will not be viewable by the user.
extern SDLKeyboardInputMask const SDLKeyboardInputMaskEnableInputKeyMask;
+/// Key mask is disabled. Input characters will be viewable by the user.
extern SDLKeyboardInputMask const SDLKeyboardInputMaskDisableInputKeyMask;
+/// Key mask can be toggled by the user.
extern SDLKeyboardInputMask const SDLKeyboardInputMaskUserChoiceInputKeyMask;
diff --git a/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h b/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h
index b78218663..a38572fdf 100644
--- a/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h
+++ b/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h
@@ -49,6 +49,7 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (instancetype)initWithKeyboardLayout:(SDLKeyboardLayout)keyboardLayout numConfigurableKeys:(UInt8)numConfigurableKeys;
+/// The keyboard layout of this capability
@property (strong, nonatomic) SDLKeyboardLayout keyboardLayout;
/**
diff --git a/SmartDeviceLink/public/SDLMenuCell.m b/SmartDeviceLink/public/SDLMenuCell.m
index e7651e0c7..845d10f04 100644
--- a/SmartDeviceLink/public/SDLMenuCell.m
+++ b/SmartDeviceLink/public/SDLMenuCell.m
@@ -8,8 +8,10 @@
#import "SDLMenuCell.h"
-#import "SDLArtwork.h"
#import "NSArray+Extensions.h"
+#import "SDLArtwork.h"
+#import "SDLMacros.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
NS_ASSUME_NONNULL_BEGIN
@@ -61,7 +63,6 @@ NS_ASSUME_NONNULL_BEGIN
}
- (instancetype)initWithTitle:(NSString *)title secondaryText:(nullable NSString *)secondaryText tertiaryText:(nullable NSString *)tertiaryText icon:(nullable SDLArtwork *)icon secondaryArtwork:(nullable SDLArtwork *)secondaryArtwork submenuLayout:(nullable SDLMenuLayout)layout subCells:(NSArray<SDLMenuCell *> *)subCells {
-
self = [super init];
if (!self) { return nil; }
@@ -91,24 +92,14 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Object Equality
-- (id)copyWithZone:(nullable NSZone *)zone {
- SDLMenuCell *newCell = [[SDLMenuCell allocWithZone:zone] initWithTitle:_title secondaryText:_secondaryText tertiaryText:_tertiaryText icon:_icon secondaryArtwork:_secondaryArtwork voiceCommands:_voiceCommands handler:_handler];
-
- if (_subCells.count > 0) {
- newCell.subCells = [[NSArray alloc] initWithArray:_subCells copyItems:YES];
- }
-
- return newCell;
-}
-
- (NSUInteger)hash {
return NSUIntRotateCell(self.title.hash, NSUIntBitCell / 2)
^ NSUIntRotateCell(self.icon.name.hash, NSUIntBitCell / 3)
^ NSUIntRotateCell(self.voiceCommands.dynamicHash, NSUIntBitCell / 4)
- ^ NSUIntRotateCell((self.subCells.count != 0), NSUIntBitCell / 5)
- ^ NSUIntRotateCell(self.secondaryText.hash, NSUIntBitCell / 6)
- ^ NSUIntRotateCell(self.tertiaryText.hash, NSUIntBitCell / 7)
- ^ NSUIntRotateCell(self.secondaryArtwork.name.hash, NSUIntBitCell / 8)
+ ^ NSUIntRotateCell((self.subCells != nil), NSUIntBitCell / 5)
+ ^ NSUIntRotateCell(self.secondaryText.hash, NSUIntBitCell / 6)
+ ^ NSUIntRotateCell(self.tertiaryText.hash, NSUIntBitCell / 7)
+ ^ NSUIntRotateCell(self.secondaryArtwork.name.hash, NSUIntBitCell / 8)
^ NSUIntRotateCell(self.submenuLayout.hash, NSUIntBitCell / 9);
}
@@ -116,13 +107,37 @@ NS_ASSUME_NONNULL_BEGIN
if (self == object) { return YES; }
if (![object isMemberOfClass:[self class]]) { return NO; }
- return [self isEqualToChoice:(SDLMenuCell *)object];
+ return [self isEqualToCell:(SDLMenuCell *)object];
+}
+
+- (BOOL)isEqualToCell:(SDLMenuCell *)cell {
+ return (self.hash == cell.hash);
+}
+
+#pragma mark Protected
+
+- (BOOL)sdl_isEqualToCellWithUniqueTitle:(SDLMenuCell *)cell {
+ return ([self sdl_hashWithUniqueTitle] == [cell sdl_hashWithUniqueTitle]);
}
-- (BOOL)isEqualToChoice:(SDLMenuCell *)choice {
- if (choice == nil) { return NO; }
+- (NSUInteger)sdl_hashWithUniqueTitle {
+ return self.hash ^ NSUIntRotateCell(self.uniqueTitle.hash, NSUIntBitCell / 10);
+}
+
+#pragma mark - Copying
+
+- (id)copyWithZone:(nullable NSZone *)zone {
+ SDLMenuCell *newCell = [[SDLMenuCell allocWithZone:zone] initWithTitle:_title secondaryText:_secondaryText tertiaryText:_tertiaryText icon:_icon secondaryArtwork:_secondaryArtwork voiceCommands:_voiceCommands handler:_handler];
+ newCell->_cellId = _cellId;
+ newCell->_parentCellId = _parentCellId;
+ newCell->_uniqueTitle = _uniqueTitle;
- return (self.hash == choice.hash);
+ if (_subCells.count > 0) {
+ newCell.subCells = [[NSArray alloc] initWithArray:_subCells copyItems:YES];
+ newCell->_submenuLayout = _submenuLayout;
+ }
+
+ return newCell;
}
@end
diff --git a/SmartDeviceLink/public/SDLMenuConfiguration.m b/SmartDeviceLink/public/SDLMenuConfiguration.m
index 2049c83bf..b957d72ca 100644
--- a/SmartDeviceLink/public/SDLMenuConfiguration.m
+++ b/SmartDeviceLink/public/SDLMenuConfiguration.m
@@ -8,6 +8,8 @@
#import "SDLMenuConfiguration.h"
+#import "SDLMacros.h"
+
@implementation SDLMenuConfiguration
- (instancetype)init {
@@ -24,6 +26,24 @@
return self;
}
+- (NSUInteger)hash {
+ return NSUIntRotateCell(self.mainMenuLayout.hash, NSUIntBitCell / 2)
+ ^ NSUIntRotateCell(self.defaultSubmenuLayout.hash, NSUIntBitCell / 3);
+}
+
+- (BOOL)isEqual:(id)object {
+ if (self == object) { return YES; }
+ if (![object isMemberOfClass:[self class]]) { return NO; }
+
+ return [self isEqualToConfiguration:(SDLMenuConfiguration *)object];
+}
+
+- (BOOL)isEqualToConfiguration:(SDLMenuConfiguration *)configuration {
+ if (configuration == nil) { return NO; }
+
+ return (self.hash == configuration.hash);
+}
+
- (NSString *)description {
return [NSString stringWithFormat:@"Menu configuration, main menu layout: %@, submenu default layout: %@", _mainMenuLayout, _defaultSubmenuLayout];
}
diff --git a/SmartDeviceLink/public/SDLMenuManagerConstants.h b/SmartDeviceLink/public/SDLMenuManagerConstants.h
index 5e23971e9..5ceab2d4f 100644
--- a/SmartDeviceLink/public/SDLMenuManagerConstants.h
+++ b/SmartDeviceLink/public/SDLMenuManagerConstants.h
@@ -22,18 +22,3 @@ typedef NS_ENUM(NSUInteger, SDLDynamicMenuUpdatesMode) {
/// 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.
SDLDynamicMenuUpdatesModeOnWithCompatibility
};
-
-
-/// Menu cell state
-///
-/// Cell state that tells the menu manager what it should do with a given SDLMenuCell
-typedef NS_ENUM(NSUInteger, MenuCellState) {
- /// Marks the cell to be deleted
- MenuCellStateDelete = 0,
-
- /// Marks the cell to be added
- MenuCellStateAdd,
-
- /// Marks the cell to be kept
- MenuCellStateKeep
-};
diff --git a/SmartDeviceLink/public/SDLRoofStatus.h b/SmartDeviceLink/public/SDLRoofStatus.h
index e2ec90b07..28072d8d5 100644
--- a/SmartDeviceLink/public/SDLRoofStatus.h
+++ b/SmartDeviceLink/public/SDLRoofStatus.h
@@ -60,10 +60,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (instancetype)initWithLocation:(SDLGrid *)location status:(SDLDoorStatusType)status state:(nullable SDLWindowState *)state;
+/// The location of the roof on the vehicle grid
@property (strong, nonatomic) SDLGrid *location;
+/// The status of the roof (e.g. if it is detachable)
@property (strong, nonatomic) SDLDoorStatusType status;
+/// The state of the roof if it has a window
@property (nullable, strong, nonatomic) SDLWindowState *state;
@end
diff --git a/SmartDeviceLink/public/SDLScreenManager.h b/SmartDeviceLink/public/SDLScreenManager.h
index c941eaced..cb707bbd8 100644
--- a/SmartDeviceLink/public/SDLScreenManager.h
+++ b/SmartDeviceLink/public/SDLScreenManager.h
@@ -431,7 +431,7 @@ If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy
///
/// If the alert contains an audio indication with a file that needs to be uploaded, it will be uploaded before presenting the alert. If the alert contains soft buttons with images, they will be uploaded before presenting the alert. If the alert contains an icon, that will be uploaded before presenting the alert.
///
-/// The handler will be called when the alert either dismisses from the screen or it has failed to present. If the error value in the handler is present, then the alert failed to appear or was aborted, if not, then the alert dismissed without error. The `userInfo` object on the error contais an `error` key with more information about the error. If the alert failed to present, the `userInfo` object will contain a `tryAgainTime` key with information on how long to wait before trying to send another alert. The value for `tryAgainTime` may be `nil` if the module did not return a value in its response.
+/// The handler will be called when the alert either dismisses from the screen or it has failed to present. If the error value in the handler is present, then the alert failed to appear or was aborted, if not, then the alert dismissed without error. The `userInfo` object on the error contains an `error` key with more information about the error. If the alert failed to present, the `userInfo` object will contain a `tryAgainTime` key with information on how long to wait before trying to send another alert. The value for `tryAgainTime` may be `nil` if the module did not return a value in its response.
///
/// @param alert Alert to be presented
/// @param handler The handler to be called when the alert either dismisses from the screen or it has failed to present.
diff --git a/SmartDeviceLink/public/SDLScreenManager.m b/SmartDeviceLink/public/SDLScreenManager.m
index ea60f9584..d413cdee6 100644
--- a/SmartDeviceLink/public/SDLScreenManager.m
+++ b/SmartDeviceLink/public/SDLScreenManager.m
@@ -332,11 +332,11 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Menu
- (BOOL)openMenu {
- return [self.menuManager openMenu];
+ return [self.menuManager openMenu:nil];
}
- (BOOL)openSubmenu:(SDLMenuCell *)cell {
- return [self.menuManager openSubmenu:cell];
+ return [self.menuManager openMenu:cell];
}
#pragma mark - Alert
diff --git a/SmartDeviceLink/public/SDLSeatControlCapabilities.h b/SmartDeviceLink/public/SDLSeatControlCapabilities.h
index c20f5db5f..3895a89e1 100644
--- a/SmartDeviceLink/public/SDLSeatControlCapabilities.h
+++ b/SmartDeviceLink/public/SDLSeatControlCapabilities.h
@@ -43,7 +43,7 @@ NS_ASSUME_NONNULL_BEGIN
coolingEnabledAvailable:(BOOL)coolingEnabledAvail heatingLevelAvailable:(BOOL)heatingLevelAvail coolingLevelAvailable:(BOOL)coolingLevelAvail horizontalPositionAvailable:(BOOL)horizontalPositionAvail verticalPositionAvailable:(BOOL)verticalPositionAvail frontVerticalPositionAvailable:(BOOL)frontVerticalPositionAvail backVerticalPositionAvailable:(BOOL)backVerticalPositionAvail backTiltAngleAvailable:(BOOL)backTitlAngleAvail headSupportHorizontalPositionAvailable:(BOOL)headSupportHorizontalPositionAvail headSupportVerticalPositionAvailable:(BOOL)headSupportVerticalPositionAvail massageEnabledAvailable:(BOOL)massageEnabledAvail massageModeAvailable:(BOOL)massageModeAvail massageCushionFirmnessAvailable:(BOOL)massageCushionFirmnessAvail memoryAvailable:(BOOL)memoryAvail;
/**
- * @abstract The short friendly name of the light control module.
+ * @abstract The short friendly name of the seat control module.
* It should not be used to identify a module by mobile application.
*
* Required, Max length 100 chars
diff --git a/SmartDeviceLink/public/SDLSeatStatus.h b/SmartDeviceLink/public/SDLSeatStatus.h
index 29d62c263..dee511504 100644
--- a/SmartDeviceLink/public/SDLSeatStatus.h
+++ b/SmartDeviceLink/public/SDLSeatStatus.h
@@ -50,8 +50,10 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (instancetype)initWithSeatLocation:(SDLSeatLocation *)seatLocation conditionActive:(BOOL)conditionActive;
+/// The location of the seat on the vehicle grid
@property (strong, nonatomic) SDLSeatLocation *seatLocation;
+/// If the seat condition is active (see the containing object parameter, such as 'seatsOccupied')
@property (strong, nonatomic) NSNumber<SDLBool> *conditionActive;
@end
diff --git a/SmartDeviceLink/public/SDLSeekIndicatorType.h b/SmartDeviceLink/public/SDLSeekIndicatorType.h
index 77bc15de2..aca502cca 100644
--- a/SmartDeviceLink/public/SDLSeekIndicatorType.h
+++ b/SmartDeviceLink/public/SDLSeekIndicatorType.h
@@ -37,5 +37,8 @@
*/
typedef SDLEnum SDLSeekIndicatorType NS_TYPED_ENUM;
+/// Seek indicator UI that is appropriate for skipping tracks
extern SDLSeekIndicatorType const SDLSeekIndicatorTypeTrack;
+
+/// Seek indicator UI that is appropriate for skipping time
extern SDLSeekIndicatorType const SDLSeekIndicatorTypeTime;
diff --git a/SmartDeviceLink/public/SDLSeekStreamingIndicator.h b/SmartDeviceLink/public/SDLSeekStreamingIndicator.h
index a9881278f..e801cbc33 100644
--- a/SmartDeviceLink/public/SDLSeekStreamingIndicator.h
+++ b/SmartDeviceLink/public/SDLSeekStreamingIndicator.h
@@ -61,6 +61,7 @@ NS_ASSUME_NONNULL_BEGIN
*/
+ (instancetype)seekIndicatorWithSeekTime:(NSUInteger)seekTime;
+/// The type of seek indicator to be displayed on the module UI
@property (strong, nonatomic) SDLSeekIndicatorType type;
/**
diff --git a/SmartDeviceLink/public/SDLStreamingMediaConfiguration.h b/SmartDeviceLink/public/SDLStreamingMediaConfiguration.h
index 669e59319..0f36df3df 100644
--- a/SmartDeviceLink/public/SDLStreamingMediaConfiguration.h
+++ b/SmartDeviceLink/public/SDLStreamingMediaConfiguration.h
@@ -84,7 +84,7 @@ typedef NS_ENUM(NSUInteger, SDLCarWindowRenderingType) {
@property (assign, nonatomic) BOOL allowMultipleViewControllerOrientations;
/**
- Set a landscape image dimension range and/or aspect ratio range that your rootViewController supports. If the module's screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to `nil`, the default is to support all lanscape streaming ranges. If you wish to disable support for streaming in landscape mode, set a `disabled` video streaming range.
+ Set a landscape image dimension range and/or aspect ratio range that your rootViewController supports. If the module's screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to `nil`, the default is to support all landscape streaming ranges. If you wish to disable support for streaming in landscape mode, set a `disabled` video streaming range.
If desired, you can subscribe to screen size updates via the SDLStreamingVideoDelegate.
@warning If you disable both the supportedLandscapeStreamingRange and supportedPortraitStreamingRange, video will not stream
*/
diff --git a/SmartDeviceLink/public/SDLStreamingVideoDelegate.h b/SmartDeviceLink/public/SDLStreamingVideoDelegate.h
index fc9284c33..d8363753e 100644
--- a/SmartDeviceLink/public/SDLStreamingVideoDelegate.h
+++ b/SmartDeviceLink/public/SDLStreamingVideoDelegate.h
@@ -9,8 +9,11 @@
NS_ASSUME_NONNULL_BEGIN
+/// A delegate method about changes to streaming video for streaming video apps
@protocol SDLStreamingVideoDelegate <NSObject>
+/// Callback notifying of a size update for the video streaming window on the module UI
+/// @param displaySize The new size of the video streaming window on the module
- (void)videoStreamingSizeDidUpdate:(CGSize)displaySize NS_SWIFT_NAME(videoStreamingSizeDidUpdate(toSize:));
@end
diff --git a/SmartDeviceLink/public/SDLSystemCapabilityManager.m b/SmartDeviceLink/public/SDLSystemCapabilityManager.m
index e014bb4ca..849f8f2e8 100644
--- a/SmartDeviceLink/public/SDLSystemCapabilityManager.m
+++ b/SmartDeviceLink/public/SDLSystemCapabilityManager.m
@@ -123,7 +123,7 @@ typedef NSString * SDLServiceID;
self.supportsSubscriptions = NO;
- self.appServicesCapabilitiesDictionary = [NSMutableDictionary dictionary];
+ [self.appServicesCapabilitiesDictionary removeAllObjects];
[self.capabilityObservers removeAllObjects];
[self.subscriptionStatus removeAllObjects];
@@ -386,7 +386,8 @@ typedef NSString * SDLServiceID;
}
- (void)sdl_notifyObserversOfCapabilityType:(SDLSystemCapabilityType)type capability:(nullable SDLSystemCapability *)capability error:(nullable NSError *)error {
- for (SDLSystemCapabilityObserver *observer in self.capabilityObservers[type]) {
+ NSDictionary<SDLSystemCapabilityType, NSMutableArray<SDLSystemCapabilityObserver *> *> *capabilityObservers = [self.capabilityObservers copy];
+ for (SDLSystemCapabilityObserver *observer in capabilityObservers[type]) {
[self sdl_invokeObserver:observer withCapabilityType:type capability:capability error:error];
}
}
@@ -449,11 +450,13 @@ typedef NSString * SDLServiceID;
[self sdl_saveDisplayCapabilityListUpdate:systemCapability.displayCapabilities];
} else {
SDLLogW(@"Received response for unknown System Capability Type: %@", systemCapabilityType);
+ if (handler != nil) {
+ handler(systemCapability, NO, [NSError sdl_systemCapabilityManager_unknownSystemCapabilityType]);
+ }
return NO;
}
SDLLogD(@"Updated system capability manager with new data: %@", systemCapability);
-
[self sdl_callObserversForUpdate:systemCapability error:error handler:handler];
return YES;
}
@@ -584,28 +587,27 @@ typedef NSString * SDLServiceID;
return observerObject.observer;
}
-#pragma mark Unubscribing
+#pragma mark Unsubscribing
- (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) {
- [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ for (SDLSystemCapabilityObserver *capabilityObserver in self.capabilityObservers[type]) {
+ if ([observer isEqual:capabilityObserver.observer] && self.capabilityObservers[type] != nil) {
[self.capabilityObservers[type] removeObject:capabilityObserver];
- }];
-
- [self sdl_removeNilObserversAndUnsubscribeIfNecessary];
- break;
+ [self sdl_removeNilObserversAndUnsubscribeIfNecessary];
+ break;
+ }
}
- }
+ }];
}
- (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:^{
+
+ [SDLGlobals runSyncOnSerialSubQueue:self.readWriteQueue block:^{
+ 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];
@@ -615,24 +617,24 @@ typedef NSString * SDLServiceID;
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;
- }
+ // 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];
+ // 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
@@ -736,9 +738,9 @@ typedef NSString * SDLServiceID;
}
/**
- * Called when a `SetDisplayLayoutResponse` response is received from Core. If the template was set successfully, the the new capabilities for the template are saved.
+ * Called when a `SetDisplayLayoutResponse` response is received from Core. If the template was set successfully, the the new capabilities for the template are saved.
*
- * @param notification The `SetDisplayLayoutResponse` response received from Core
+ * @param notification The `SetDisplayLayoutResponse` response received from Core
*/
- (void)sdl_displayLayoutResponse:(SDLRPCResponseNotification *)notification {
#pragma clang diagnostic push
@@ -786,36 +788,6 @@ 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/public/SDLSystemInfo.h b/SmartDeviceLink/public/SDLSystemInfo.h
index 0a14f7fb8..cfff1ce1e 100644
--- a/SmartDeviceLink/public/SDLSystemInfo.h
+++ b/SmartDeviceLink/public/SDLSystemInfo.h
@@ -12,6 +12,7 @@
NS_ASSUME_NONNULL_BEGIN
+/// Basic information about the connected module system
@interface SDLSystemInfo : NSObject
/// The connected module's vehicle type: it's make, model, trim, and model year
diff --git a/SmartDeviceLink/public/SDLTireStatus.m b/SmartDeviceLink/public/SDLTireStatus.m
index aa1bac556..65f5d7d2a 100644
--- a/SmartDeviceLink/public/SDLTireStatus.m
+++ b/SmartDeviceLink/public/SDLTireStatus.m
@@ -17,7 +17,14 @@ NS_ASSUME_NONNULL_BEGIN
- (SDLWarningLightStatus)pressureTelltale {
NSError *error = nil;
- return [self.store sdl_enumForName:SDLRPCParameterNamePressureTelltale error:&error];
+ SDLWarningLightStatus warningLightStatus = [self.store sdl_enumForName:SDLRPCParameterNamePressureTelltale error:&error];
+ if (warningLightStatus == nil) {
+ [self.store sdl_setObject:SDLWarningLightStatusNotUsed forName:SDLRPCParameterNamePressureTelltale];
+ warningLightStatus = SDLWarningLightStatusNotUsed;
+ SDLLogW(@"SDLTireStatus.pressureTelltale was nil and will be set to .notUsed. In the future, this will change to be nullable.");
+ }
+
+ return warningLightStatus;
}
- (void)setLeftFront:(SDLSingleTireStatus *)leftFront {
@@ -26,7 +33,16 @@ NS_ASSUME_NONNULL_BEGIN
- (SDLSingleTireStatus *)leftFront {
NSError *error = nil;
- return [self.store sdl_objectForName:SDLRPCParameterNameLeftFront ofClass:SDLSingleTireStatus.class error:&error];
+ SDLSingleTireStatus *tireStatus = [self.store sdl_objectForName:SDLRPCParameterNameLeftFront ofClass:SDLSingleTireStatus.class error:&error];
+ if (tireStatus == nil) {
+ SDLSingleTireStatus *newTireStatus = [[SDLSingleTireStatus alloc] init];
+ newTireStatus.status = SDLComponentVolumeStatusUnknown;
+ [self.store sdl_setObject:newTireStatus forName:SDLRPCParameterNameLeftFront];
+ tireStatus = newTireStatus;
+ SDLLogW(@"SDLTireStatus.leftFront was nil and will be set to .unknown. In the future, this will change to be nullable.");
+ }
+
+ return tireStatus;
}
- (void)setRightFront:(SDLSingleTireStatus *)rightFront {
@@ -35,7 +51,16 @@ NS_ASSUME_NONNULL_BEGIN
- (SDLSingleTireStatus *)rightFront {
NSError *error = nil;
- return [self.store sdl_objectForName:SDLRPCParameterNameRightFront ofClass:SDLSingleTireStatus.class error:&error];
+ SDLSingleTireStatus *tireStatus = [self.store sdl_objectForName:SDLRPCParameterNameRightFront ofClass:SDLSingleTireStatus.class error:&error];
+ if (tireStatus == nil) {
+ SDLSingleTireStatus *newTireStatus = [[SDLSingleTireStatus alloc] init];
+ newTireStatus.status = SDLComponentVolumeStatusUnknown;
+ [self.store sdl_setObject:newTireStatus forName:SDLRPCParameterNameRightFront];
+ tireStatus = newTireStatus;
+ SDLLogW(@"SDLTireStatus.rightFront was nil and will be set to .unknown. In the future, this will change to be nullable.");
+ }
+
+ return tireStatus;
}
- (void)setLeftRear:(SDLSingleTireStatus *)leftRear {
@@ -44,7 +69,16 @@ NS_ASSUME_NONNULL_BEGIN
- (SDLSingleTireStatus *)leftRear {
NSError *error = nil;
- return [self.store sdl_objectForName:SDLRPCParameterNameLeftRear ofClass:SDLSingleTireStatus.class error:&error];
+ SDLSingleTireStatus *tireStatus = [self.store sdl_objectForName:SDLRPCParameterNameLeftRear ofClass:SDLSingleTireStatus.class error:&error];
+ if (tireStatus == nil) {
+ SDLSingleTireStatus *newTireStatus = [[SDLSingleTireStatus alloc] init];
+ newTireStatus.status = SDLComponentVolumeStatusUnknown;
+ [self.store sdl_setObject:newTireStatus forName:SDLRPCParameterNameLeftRear];
+ tireStatus = newTireStatus;
+ SDLLogW(@"SDLTireStatus.leftRear was nil and will be set to .unknown. In the future, this will change to be nullable.");
+ }
+
+ return tireStatus;
}
- (void)setRightRear:(SDLSingleTireStatus *)rightRear {
@@ -53,7 +87,16 @@ NS_ASSUME_NONNULL_BEGIN
- (SDLSingleTireStatus *)rightRear {
NSError *error = nil;
- return [self.store sdl_objectForName:SDLRPCParameterNameRightRear ofClass:SDLSingleTireStatus.class error:&error];
+ SDLSingleTireStatus *tireStatus = [self.store sdl_objectForName:SDLRPCParameterNameRightRear ofClass:SDLSingleTireStatus.class error:&error];
+ if (tireStatus == nil) {
+ SDLSingleTireStatus *newTireStatus = [[SDLSingleTireStatus alloc] init];
+ newTireStatus.status = SDLComponentVolumeStatusUnknown;
+ [self.store sdl_setObject:newTireStatus forName:SDLRPCParameterNameRightRear];
+ tireStatus = newTireStatus;
+ SDLLogW(@"SDLTireStatus.rightRear was nil and will be set to .unknown. In the future, this will change to be nullable.");
+ }
+
+ return tireStatus;
}
- (void)setInnerLeftRear:(SDLSingleTireStatus *)innerLeftRear {
@@ -62,7 +105,16 @@ NS_ASSUME_NONNULL_BEGIN
- (SDLSingleTireStatus *)innerLeftRear {
NSError *error = nil;
- return [self.store sdl_objectForName:SDLRPCParameterNameInnerLeftRear ofClass:SDLSingleTireStatus.class error:&error];
+ SDLSingleTireStatus *tireStatus = [self.store sdl_objectForName:SDLRPCParameterNameInnerLeftRear ofClass:SDLSingleTireStatus.class error:&error];
+ if (tireStatus == nil) {
+ SDLSingleTireStatus *newTireStatus = [[SDLSingleTireStatus alloc] init];
+ newTireStatus.status = SDLComponentVolumeStatusUnknown;
+ [self.store sdl_setObject:newTireStatus forName:SDLRPCParameterNameInnerLeftRear];
+ tireStatus = newTireStatus;
+ SDLLogW(@"SDLTireStatus.innerLeftRear was nil and will be set to .unknown. In the future, this will change to be nullable.");
+ }
+
+ return tireStatus;
}
- (void)setInnerRightRear:(SDLSingleTireStatus *)innerRightRear {
@@ -71,7 +123,16 @@ NS_ASSUME_NONNULL_BEGIN
- (SDLSingleTireStatus *)innerRightRear {
NSError *error = nil;
- return [self.store sdl_objectForName:SDLRPCParameterNameInnerRightRear ofClass:SDLSingleTireStatus.class error:&error];
+ SDLSingleTireStatus *tireStatus = [self.store sdl_objectForName:SDLRPCParameterNameInnerRightRear ofClass:SDLSingleTireStatus.class error:&error];
+ if (tireStatus == nil) {
+ SDLSingleTireStatus *newTireStatus = [[SDLSingleTireStatus alloc] init];
+ newTireStatus.status = SDLComponentVolumeStatusUnknown;
+ [self.store sdl_setObject:newTireStatus forName:SDLRPCParameterNameInnerRightRear];
+ tireStatus = newTireStatus;
+ SDLLogW(@"SDLTireStatus.innerRightRear was nil and will be set to .unknown. In the future, this will change to be nullable.");
+ }
+
+ return tireStatus;
}
@end
diff --git a/SmartDeviceLink/public/SDLVideoStreamingRange.h b/SmartDeviceLink/public/SDLVideoStreamingRange.h
index a0bd03163..71cc1bf1d 100644
--- a/SmartDeviceLink/public/SDLVideoStreamingRange.h
+++ b/SmartDeviceLink/public/SDLVideoStreamingRange.h
@@ -11,6 +11,7 @@
NS_ASSUME_NONNULL_BEGIN
+/// A range of supported video streaming sizes from minimum to maximum
@interface SDLVideoStreamingRange : NSObject <NSCopying>
/// The minimum supported normalized aspect ratio, min value is 1.0, defaults to 1.0
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLCheckChoiceVROptionalOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLCheckChoiceVROptionalOperationSpec.m
index 265dad6e4..f811192a4 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLCheckChoiceVROptionalOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLCheckChoiceVROptionalOperationSpec.m
@@ -17,20 +17,17 @@ describe(@"check choice VR optional operation", ^{
__block SDLCheckChoiceVROptionalOperation *testOp = nil;
__block BOOL resultVROptional = NO;
- __block BOOL hasCalledOperationCompletionHandler = NO;
__block NSError *resultError = nil;
beforeEach(^{
resultVROptional = NO;
- hasCalledOperationCompletionHandler = NO;
+ resultError = nil;
testConnectionManager = [[TestConnectionManager alloc] init];
- testOp = [[SDLCheckChoiceVROptionalOperation alloc] initWithConnectionManager:testConnectionManager];
- testOp.completionBlock = ^{
- hasCalledOperationCompletionHandler = YES;
- resultVROptional = testOp.vrOptional;
- resultError = testOp.error;
- };
+ testOp = [[SDLCheckChoiceVROptionalOperation alloc] initWithConnectionManager:testConnectionManager completionHandler:^(BOOL isVROptional, NSError * _Nullable error) {
+ resultVROptional = isVROptional;
+ resultError = error;
+ }];
});
it(@"should have priority of 'very high'", ^{
@@ -80,7 +77,6 @@ describe(@"check choice VR optional operation", ^{
});
it(@"should have called the completion handler with proper data and finish", ^{
- expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
expect(resultVROptional).to(beTrue());
expect(resultError).to(beNil());
expect(@(testOp.finished)).to(equal(@YES));
@@ -99,8 +95,6 @@ describe(@"check choice VR optional operation", ^{
});
it(@"should have sent out a new request", ^{
- expect(hasCalledOperationCompletionHandler).to(beFalse());
-
expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLCreateInteractionChoiceSet class]));
SDLCreateInteractionChoiceSet *receivedRequest = testConnectionManager.receivedRequests.lastObject;
@@ -132,7 +126,6 @@ describe(@"check choice VR optional operation", ^{
});
it(@"should have called the completion handler with proper data and finish", ^{
- expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
expect(resultVROptional).to(beFalse());
expect(resultError).to(beNil());
expect(@(testOp.finished)).to(equal(@YES));
@@ -151,7 +144,6 @@ describe(@"check choice VR optional operation", ^{
});
it(@"should return a failure", ^{
- expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
expect(resultVROptional).to(beFalse());
expect(resultError).toNot(beNil());
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
index 30c97f00a..815b1a0b9 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
@@ -9,8 +9,7 @@
#import "SDLDeleteChoicesOperation.h"
#import "SDLError.h"
#import "SDLGlobals.h"
-#import "SDLPreloadChoicesOperation.h"
-#import "SDLPresentChoiceSetOperation.h"
+#import "SDLPreloadPresentChoicesOperation.h"
#import "SDLPresentKeyboardOperation.h"
#import "SDLRPCNotificationNotification.h"
#import "SDLStateMachine.h"
@@ -19,22 +18,18 @@
#import "TestConnectionManager.h"
-@interface SDLPreloadChoicesOperation()
-
-@property (copy, nonatomic, nullable) NSError *internalError;
-@property (strong, nonatomic, nullable) NSMutableArray<NSNumber *> *failedChoiceUploadIDs;
-
-@end
-
@interface SDLChoiceCell()
@property (assign, nonatomic) UInt16 choiceId;
@end
-@interface SDLPresentChoiceSetOperation()
+@interface SDLPreloadPresentChoicesOperation()
+@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *cellsToUpload;
@property (copy, nonatomic, nullable) NSError *internalError;
+@property (copy, nonatomic) SDLUploadChoicesCompletionHandler preloadCompletionHandler;
+
@property (assign, nonatomic) UInt16 cancelId;
@property (strong, nonatomic, readwrite, nullable) SDLChoiceCell *selectedCell;
@property (strong, nonatomic, readwrite, nullable) SDLTriggerSource selectedTriggerSource;
@@ -42,9 +37,17 @@
@end
+@interface SDLDeleteChoicesOperation()
+
+@property (copy, nonatomic) SDLDeleteChoicesCompletionHandler deleteCompletionHandler;
+
+@end
+
@interface SDLCheckChoiceVROptionalOperation()
+@property (assign, nonatomic, getter=isVROptional) BOOL vrOptional;
@property (copy, nonatomic, nullable) NSError *internalError;
+@property (copy, nonatomic) SDLCheckChoiceVROptionalCompletionHandler vrOptionalCompletionHandler;
@end
@@ -52,17 +55,14 @@
@property (strong, nonatomic, readonly) SDLStateMachine *stateMachine;
@property (strong, nonatomic) NSOperationQueue *transactionQueue;
+@property (copy, nonatomic) dispatch_queue_t readWriteQueue;
@property (assign, nonatomic) UInt16 nextCancelId;
@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
@property (copy, nonatomic, nullable) SDLWindowCapability *currentWindowCapability;
-@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *preloadedMutableChoices;
-@property (strong, nonatomic, readonly) NSSet<SDLChoiceCell *> *pendingPreloadChoices;
-@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *pendingMutablePreloadChoices;
-@property (strong, nonatomic, nullable) SDLChoiceSet *pendingPresentationSet;
-@property (strong, nonatomic, nullable) SDLAsynchronousOperation *pendingPresentOperation;
+@property (copy, nonatomic, readwrite) NSSet<SDLChoiceCell *> *preloadedChoices;
@property (assign, nonatomic, getter=isVROptional) BOOL vrOptional;
@@ -83,7 +83,13 @@ describe(@"choice set manager tests", ^{
__block SDLWindowCapability *enabledWindowCapability = nil;
__block SDLWindowCapability *disabledWindowCapability = nil;
- __block SDLWindowCapability *primaryTextOnlyCapability = nil;
+
+ __block SDLChoiceSet *testChoiceSet = nil;
+ __block SDLChoiceSet *testFailedChoiceSet = nil;
+ __block NSString *testTitle = @"test title";
+ __block id<SDLChoiceSetDelegate> choiceDelegate = nil;
+ __block id<SDLKeyboardDelegate> keyboardDelegate = nil;
+ __block SDLInteractionMode testMode = SDLInteractionModeBoth;
__block SDLChoiceCell *testCell1 = nil;
__block SDLChoiceCell *testCell2 = nil;
@@ -91,9 +97,13 @@ describe(@"choice set manager tests", ^{
__block SDLChoiceCell *testCell4 = nil;
__block SDLChoiceCell *testCell1Duplicate = nil;
__block SDLChoiceCell *testCell1Similar = nil;
- __block SDLVersion *choiceSetUniquenessActiveVersion = nil;
__block SDLArtwork *testArtwork = nil;
+ __block SDLTriggerSource resultTriggerSource = SDLTriggerSourceMenu;
+ __block SDLChoiceCell *resultChoiceCell = nil;
+ __block NSUInteger resultChoiceRow = NSUIntegerMax;
+ __block NSError *resultError = nil;
+
beforeEach(^{
testConnectionManager = [[TestConnectionManager alloc] init];
testFileManager = OCMClassMock([SDLFileManager class]);
@@ -121,11 +131,16 @@ describe(@"choice set manager tests", ^{
];
disabledWindowCapability = [[SDLWindowCapability alloc] init];
disabledWindowCapability.textFields = @[];
- primaryTextOnlyCapability = [[SDLWindowCapability alloc] init];
- primaryTextOnlyCapability.textFields = @[
- [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuName characterSet:SDLCharacterSetUtf8 width:500 rows:1],
- ];
- choiceSetUniquenessActiveVersion = [[SDLVersion alloc] initWithMajor:7 minor:1 patch:0];
+
+ keyboardDelegate = OCMProtocolMock(@protocol(SDLKeyboardDelegate));
+ choiceDelegate = OCMProtocolMock(@protocol(SDLChoiceSetDelegate));
+ testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:testTitle delegate:choiceDelegate choices:@[testCell1, testCell2, testCell3]];
+ testFailedChoiceSet = [[SDLChoiceSet alloc] initWithTitle:testTitle delegate:choiceDelegate choices:@[testCell1, testCell2, testCell3, testCell4]];
+
+ resultTriggerSource = SDLTriggerSourceMenu;
+ resultChoiceCell = nil;
+ resultChoiceRow = NSUIntegerMax;
+ resultError = nil;
});
it(@"should be in the correct startup state", ^{
@@ -212,12 +227,10 @@ describe(@"choice set manager tests", ^{
describe(@"after the bad vr optional response", ^{
beforeEach(^{
SDLCheckChoiceVROptionalOperation *vrOptionalOp = testManager.transactionQueue.operations.lastObject;
- vrOptionalOp.vrOptional = NO;
- vrOptionalOp.internalError = [NSError errorWithDomain:@"test" code:0 userInfo:nil];
- vrOptionalOp.completionBlock();
+ vrOptionalOp.vrOptionalCompletionHandler(NO, [NSError errorWithDomain:@"test" code:0 userInfo:nil]);
});
- it(@"should be ready", ^{
+ it(@"should be in startup error", ^{
expect(testManager.currentState).to(equal(SDLChoiceManagerStateStartupError));
});
});
@@ -225,8 +238,7 @@ describe(@"choice set manager tests", ^{
describe(@"after the vr optional response", ^{
beforeEach(^{
SDLCheckChoiceVROptionalOperation *vrOptionalOp = testManager.transactionQueue.operations.lastObject;
- vrOptionalOp.vrOptional = YES;
- vrOptionalOp.completionBlock();
+ vrOptionalOp.vrOptionalCompletionHandler(YES, nil);
});
it(@"should be ready", ^{
@@ -243,9 +255,7 @@ describe(@"choice set manager tests", ^{
expect(testManager.currentState).to(equal(SDLChoiceManagerStateShutdown));
expect(testManager.vrOptional).to(beTrue());
expect(testManager.currentHMILevel).to(equal(SDLHMILevelNone));
- expect(testManager.pendingPresentationSet).to(beNil());
- expect(testManager.preloadedMutableChoices).to(beEmpty());
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
+ expect(testManager.preloadedChoices).to(beEmpty());
});
});
});
@@ -258,664 +268,128 @@ describe(@"choice set manager tests", ^{
describe(@"preloading choices", ^{
context(@"when some choices are already uploaded", ^{
beforeEach(^{
- testManager.preloadedMutableChoices = [NSMutableSet setWithArray:@[testCell1]];
-
+ testManager.preloadedChoices = [NSSet setWithArray:@[testCell1]];
[testManager preloadChoices:@[testCell1, testCell2, testCell3] withCompletionHandler:^(NSError * _Nullable error) {
}];
});
it(@"should properly start the preload", ^{
- expect(testManager.pendingPreloadChoices).toNot(contain(testCell1));
- expect(testManager.pendingPreloadChoices).to(contain(testCell2));
- expect(testManager.pendingPreloadChoices).to(contain(testCell3));
- expect(testManager.transactionQueue.operations.firstObject).to(beAnInstanceOf([SDLPreloadChoicesOperation class]));
+ expect(testManager.transactionQueue.operations[0]).to(beAnInstanceOf([SDLPreloadPresentChoicesOperation class]));
- SDLPreloadChoicesOperation *testOp = testManager.transactionQueue.operations.firstObject;
- [testOp finishOperation];
+ SDLPreloadPresentChoicesOperation *testOp = testManager.transactionQueue.operations[0];
+ testOp.preloadCompletionHandler([NSSet setWithArray:@[testCell1, testCell2, testCell3]], nil);
expect(testManager.preloadedChoices).to(contain(testCell1));
expect(testManager.preloadedChoices).to(contain(testCell2));
expect(testManager.preloadedChoices).to(contain(testCell3));
- expect(testManager.pendingPreloadChoices).to(haveCount(0));
- });
- });
-
- context(@"when some choices are already uploaded with duplicate titles version >= 7.1.0", ^{
- beforeEach(^{
- [SDLGlobals sharedGlobals].rpcVersion = choiceSetUniquenessActiveVersion;
- });
-
- context(@"if there are duplicate cells once you strip unused cell properties", ^{
- beforeEach(^{
- testManager.currentWindowCapability = primaryTextOnlyCapability;
- [testManager preloadChoices:@[testCell1, testCell1Similar] withCompletionHandler:^(NSError * _Nullable error) { }];
- });
-
- it(@"should update the choiceCells' unique title", ^{
- SDLPreloadChoicesOperation *testOp = testManager.transactionQueue.operations.firstObject;
- [testOp finishOperation];
- NSArray <SDLChoiceCell *> *testArrays = testManager.preloadedChoices.allObjects;
- for (SDLChoiceCell *choiceCell in testArrays) {
- if (choiceCell.secondaryText) {
- expect(choiceCell.uniqueText).to(equal("test1 (2)"));
- } else {
- expect(choiceCell.uniqueText).to(equal("test1"));
- }
- }
- expect(testManager.preloadedChoices).to(haveCount(2));
- expect(testManager.preloadedChoices).to(contain(testCell1));
- expect(testManager.preloadedChoices).to(contain(testCell1Duplicate));
- });
- });
-
- context(@"if all cell properties are used", ^{
- beforeEach(^{
- testManager.currentWindowCapability = enabledWindowCapability;
- [testManager preloadChoices:@[testCell1, testCell1Similar] withCompletionHandler:^(NSError * _Nullable error) { }];
- });
-
- it(@"should not update the choiceCells' unique title", ^{
- SDLPreloadChoicesOperation *testOp = testManager.transactionQueue.operations.firstObject;
- [testOp finishOperation];
- NSArray <SDLChoiceCell *> *testArrays = testManager.preloadedChoices.allObjects;
- for (SDLChoiceCell *choiceCell in testArrays) {
- expect(choiceCell.uniqueText).to(equal("test1"));
- }
- expect(testManager.preloadedChoices).to(haveCount(2));
- expect(testManager.preloadedChoices).to(contain(testCell1));
- expect(testManager.preloadedChoices).to(contain(testCell1Duplicate));
- });
- });
- });
-
- context(@"when some choices are already uploaded with duplicate titles version <= 7.1.0", ^{
- beforeEach(^{
- [SDLGlobals sharedGlobals].rpcVersion = [[SDLVersion alloc] initWithMajor:7 minor:0 patch:0];
- [testManager preloadChoices:@[testCell1, testCell1Similar] withCompletionHandler:^(NSError * _Nullable error) { }];
- });
-
- it(@"append a number to the unique text for choice set cells", ^{
- SDLPreloadChoicesOperation *testOp = testManager.transactionQueue.operations.firstObject;
- [testOp finishOperation];
- NSArray <SDLChoiceCell *> *testArrays = testManager.preloadedChoices.allObjects;
- for (SDLChoiceCell *choiceCell in testArrays) {
- if (choiceCell.secondaryText) {
- expect(choiceCell.uniqueText).to(equal("test1 (2)"));
- } else {
- expect(choiceCell.uniqueText).to(equal("test1"));
- }
- }
- expect(testManager.preloadedChoices).to(haveCount(2));
- expect(testManager.preloadedChoices).to(contain(testCell1));
- expect(testManager.preloadedChoices).to(contain(testCell1Duplicate));
});
});
- context(@"when some choices are already pending", ^{
+ context(@"when the manager shuts down during preloading", ^{
beforeEach(^{
- testManager.pendingMutablePreloadChoices = [NSMutableSet setWithArray:@[testCell1]];
-
[testManager preloadChoices:@[testCell1, testCell2, testCell3] withCompletionHandler:^(NSError * _Nullable error) {
+ resultError = error;
}];
});
- it(@"should properly start the preload", ^{
- expect(testManager.pendingPreloadChoices).to(contain(testCell1));
- expect(testManager.pendingPreloadChoices).to(contain(testCell2));
- expect(testManager.pendingPreloadChoices).to(contain(testCell3));
- expect(testManager.transactionQueue.operations.firstObject).to(beAnInstanceOf([SDLPreloadChoicesOperation class]));
-
- SDLPreloadChoicesOperation *testOp = testManager.transactionQueue.operations.firstObject;
- [testOp finishOperation];
-
- expect(testManager.preloadedChoices).toNot(contain(testCell1));
- expect(testManager.preloadedChoices).to(contain(testCell2));
- expect(testManager.preloadedChoices).to(contain(testCell3));
- expect(testManager.pendingPreloadChoices).to(haveCount(1));
- });
- });
-
- context(@"when the manager shuts down during preloading", ^{
- beforeEach(^{
- testManager.pendingMutablePreloadChoices = [NSMutableSet setWithArray:@[testCell1]];
-
- [testManager preloadChoices:@[testCell1, testCell2, testCell3] withCompletionHandler:^(NSError * _Nullable error) {}];
- });
-
it(@"should leave the list of pending and uploaded choice items empty when the operation finishes", ^{
- expect(testManager.pendingPreloadChoices).to(contain(testCell1));
- expect(testManager.pendingPreloadChoices).to(contain(testCell2));
- expect(testManager.pendingPreloadChoices).to(contain(testCell3));
- expect(testManager.transactionQueue.operations.firstObject).to(beAnInstanceOf([SDLPreloadChoicesOperation class]));
+ expect(testManager.transactionQueue.operations.firstObject).to(beAnInstanceOf([SDLPreloadPresentChoicesOperation class]));
[testManager.stateMachine setToState:SDLChoiceManagerStateShutdown fromOldState:nil callEnterTransition:NO];
- testManager.pendingMutablePreloadChoices = [NSMutableSet set];
- testManager.preloadedMutableChoices = [NSMutableSet set];
+ testManager.preloadedChoices = [NSMutableSet set];
- SDLPreloadChoicesOperation *testOp = testManager.transactionQueue.operations.firstObject;
+ SDLPreloadPresentChoicesOperation *testOp = testManager.transactionQueue.operations.firstObject;
[testOp finishOperation];
- expect(testManager.preloadedMutableChoices).to(beEmpty());
expect(testManager.preloadedChoices).to(beEmpty());
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
- expect(testManager.pendingPreloadChoices).to(beEmpty());
});
});
});
describe(@"deleting choices", ^{
- context(@"used in a pending presentation", ^{
- __block SDLPresentChoiceSetOperation *pendingPresentOp = nil;
- __block id<SDLChoiceSetDelegate> choiceDelegate = nil;
-
- beforeEach(^{
- choiceDelegate = OCMProtocolMock(@protocol(SDLChoiceSetDelegate));
- pendingPresentOp = OCMClassMock([SDLPresentChoiceSetOperation class]);
- OCMStub(pendingPresentOp.choiceSet.choices).andReturn([NSSet setWithArray:@[testCell1]]);
- testManager.pendingPresentOperation = pendingPresentOp;
- testManager.pendingPresentationSet = [[SDLChoiceSet alloc] initWithTitle:@"Test" delegate:choiceDelegate choices:@[testCell1]];
-
- testManager.preloadedMutableChoices = [NSMutableSet setWithObject:testCell1];
-
- [testManager deleteChoices:@[testCell1, testCell2, testCell3]];
- });
-
- it(@"should properly start the deletion", ^{
- expect(testManager.transactionQueue.operations.lastObject).to(beAnInstanceOf([SDLDeleteChoicesOperation class]));
- expect(testManager.pendingPresentationSet).to(beNil());
- OCMVerify([pendingPresentOp cancel]);
- OCMVerify([choiceDelegate choiceSet:[OCMArg any] didReceiveError:[OCMArg any]]);
-
- testManager.transactionQueue.operations.lastObject.completionBlock();
- expect(testManager.preloadedChoices).to(beEmpty());
- });
- });
-
context(@"used in pending preloads", ^{
- __block SDLPreloadChoicesOperation *pendingPreloadOp = nil;
-
beforeEach(^{
- pendingPreloadOp = [[SDLPreloadChoicesOperation alloc] init];
-
- [testManager.transactionQueue addOperation:pendingPreloadOp];
-
- testManager.pendingMutablePreloadChoices = [NSMutableSet setWithObject:testCell1];
+ [testManager preloadChoices:@[testCell1, testCell2, testCell3, testCell4] withCompletionHandler:^(NSError * _Nullable error) {}];
[testManager deleteChoices:@[testCell1, testCell2, testCell3]];
});
- it(@"should properly start the deletion", ^{
- expect(testManager.pendingPreloadChoices).to(beEmpty());
- expect(testManager.transactionQueue.operationCount).to(equal(1)); // No delete operation
+ it(@"should preload the choices, then delete them", ^{
+ expect(testManager.transactionQueue.operationCount).to(equal(2));
+ expect(testManager.transactionQueue.operations[0]).to(beAnInstanceOf(SDLPreloadPresentChoicesOperation.class));
+ expect(testManager.transactionQueue.operations[1]).to(beAnInstanceOf(SDLDeleteChoicesOperation.class));
});
});
context(@"when the manager shuts down during deletion", ^{
- __block SDLPresentChoiceSetOperation *pendingPresentOp = nil;
- __block id<SDLChoiceSetDelegate> choiceDelegate = nil;
-
beforeEach(^{
- choiceDelegate = OCMProtocolMock(@protocol(SDLChoiceSetDelegate));
- pendingPresentOp = OCMClassMock([SDLPresentChoiceSetOperation class]);
- OCMStub(pendingPresentOp.choiceSet.choices).andReturn([NSSet setWithArray:@[testCell1]]);
- testManager.pendingPresentOperation = pendingPresentOp;
- testManager.pendingPresentationSet = [[SDLChoiceSet alloc] initWithTitle:@"Test" delegate:choiceDelegate choices:@[testCell1]];
- testManager.preloadedMutableChoices = [NSMutableSet setWithObject:testCell1];
+ testManager.preloadedChoices = [NSSet setWithArray:@[testCell1, testCell2, testCell3]];
+ [testManager deleteChoices:@[testCell1, testCell2]];
- [testManager deleteChoices:@[testCell1, testCell2, testCell3]];
+ [SDLGlobals runSyncOnSerialSubQueue:testManager.readWriteQueue block:^{
+ [testManager.stateMachine setToState:SDLChoiceManagerStateShutdown fromOldState:SDLChoiceManagerStateReady callEnterTransition:YES];
+ }];
});
it(@"should leave the list of pending and uploaded choice items empty when the operation finishes", ^{
- expect(testManager.transactionQueue.operations.lastObject).to(beAnInstanceOf([SDLDeleteChoicesOperation class]));
- expect(testManager.pendingPresentationSet).to(beNil());
- OCMVerify([pendingPresentOp cancel]);
- OCMVerify([choiceDelegate choiceSet:[OCMArg any] didReceiveError:[OCMArg any]]);
-
- [testManager.stateMachine setToState:SDLChoiceManagerStateShutdown fromOldState:nil callEnterTransition:NO];
- testManager.pendingMutablePreloadChoices = [NSMutableSet set];
- testManager.preloadedMutableChoices = [NSMutableSet set];
-
- testManager.transactionQueue.operations.lastObject.completionBlock();
-
- expect(testManager.preloadedMutableChoices).to(beEmpty());
+ expect(testManager.transactionQueue.operationCount).to(equal(0));
expect(testManager.preloadedChoices).to(beEmpty());
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
- expect(testManager.pendingPreloadChoices).to(beEmpty());
});
});
});
describe(@"presenting a choice set", ^{
- __block SDLChoiceSet *testChoiceSet = nil;
- __block SDLChoiceSet *testFailedChoiceSet = nil;
- __block NSString *testTitle = @"test title";
- __block id<SDLChoiceSetDelegate> choiceDelegate = nil;
- __block id<SDLKeyboardDelegate> keyboardDelegate = nil;
- __block SDLInteractionMode testMode = SDLInteractionModeBoth;
- __block SDLPresentKeyboardOperation *pendingPresentOp = nil;
- __block id strickMockOperationQueue = nil;
- __block SDLChoiceCell *testSelectedCell = nil;
- __block NSError *testError = nil;
- NSUInteger testSelectedCellRow = 1;
-
- beforeEach(^{
- keyboardDelegate = OCMProtocolMock(@protocol(SDLKeyboardDelegate));
- choiceDelegate = OCMProtocolMock(@protocol(SDLChoiceSetDelegate));
- testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:testTitle delegate:choiceDelegate choices:@[testCell1, testCell2, testCell3]];
- testFailedChoiceSet = [[SDLChoiceSet alloc] initWithTitle:testTitle delegate:choiceDelegate choices:@[testCell1, testCell2, testCell3, testCell4]];
- testSelectedCell = testChoiceSet.choices[1];
- testError = [NSError sdl_choiceSetManager_failedToCreateMenuItems];
-
- pendingPresentOp = OCMClassMock([SDLPresentKeyboardOperation class]);
- testManager.pendingPresentOperation = pendingPresentOp;
- testManager.pendingPresentationSet = [[SDLChoiceSet alloc] init];
-
- strickMockOperationQueue = OCMStrictClassMock([NSOperationQueue class]);
- [strickMockOperationQueue setExpectationOrderMatters:YES];
- testManager.transactionQueue = strickMockOperationQueue;
- });
-
- context(@"searchable", ^{
- it(@"should notify the choice delegate when a choice item is selected", ^{
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingPresentationSet).to(equal(testChoiceSet));
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPresentChoiceSetOperation *presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- presentChoicesOperation.selectedCell = testSelectedCell;
- presentChoicesOperation.selectedTriggerSource = testMode;
- presentChoicesOperation.selectedCellRow = testSelectedCellRow;
- presentChoicesOperation.internalError = nil;
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
- OCMExpect([choiceDelegate choiceSet:testChoiceSet didSelectChoice:testSelectedCell withSource:testMode atRowIndex:testSelectedCellRow]);
-
- [testManager presentChoiceSet:testChoiceSet mode:testMode withKeyboardDelegate:keyboardDelegate];
-
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
- OCMVerifyAllWithDelay(choiceDelegate, 0.5);
-
- expect(testManager.pendingPresentationSet).to(beNil());
- expect(testManager.pendingPresentOperation).to(beNil());
-
- expect(testManager.preloadedMutableChoices.count).to(equal(3));
- expect(testManager.preloadedMutableChoices).to(contain(testChoiceSet.choices[0]));
- expect(testManager.preloadedMutableChoices).to(contain(testChoiceSet.choices[1]));
- expect(testManager.preloadedMutableChoices).to(contain(testChoiceSet.choices[2]));
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
- });
-
- it(@"should notify the choice delegate if an error occured during presentation", ^{
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingPresentationSet).to(equal(testChoiceSet));
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPresentChoiceSetOperation *presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- presentChoicesOperation.internalError = testError;
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
- OCMExpect([choiceDelegate choiceSet:[OCMArg any] didReceiveError:testError]);
-
- [testManager presentChoiceSet:testChoiceSet mode:testMode withKeyboardDelegate:keyboardDelegate];
-
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
- OCMVerifyAllWithDelay(choiceDelegate, 0.5);
-
- expect(testManager.pendingPresentationSet).to(beNil());
- expect(testManager.pendingPresentOperation).to(beNil());
-
- expect(testManager.preloadedMutableChoices.count).to(equal(3));
- expect(testManager.preloadedMutableChoices).to(contain(testChoiceSet.choices[0]));
- expect(testManager.preloadedMutableChoices).to(contain(testChoiceSet.choices[1]));
- expect(testManager.preloadedMutableChoices).to(contain(testChoiceSet.choices[2]));
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
- });
-
- it(@"should not add a choice item that fails to the list of preloaded choices", ^{
- NSMutableDictionary<SDLRPCRequest *, NSError *> *testErrors = [NSMutableDictionary dictionary];
- SDLCreateInteractionChoiceSet *failedChoiceSet = [[SDLCreateInteractionChoiceSet alloc] initWithId:0 choiceSet:@[[[SDLChoice alloc] initWithId:1 menuName:@"1" vrCommands:nil]]];
- testErrors[failedChoiceSet] = [NSError sdl_choiceSetManager_choiceUploadFailed:[NSDictionary dictionary]];
- NSError *testInternalError = [NSError sdl_choiceSetManager_choiceUploadFailed:testErrors];
-
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingMutablePreloadChoices.count).to(equal(4));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[0]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[1]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[2]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[3]));
- preloadChoicesOperation.internalError = testInternalError;
- preloadChoicesOperation.failedChoiceUploadIDs = [[NSMutableArray alloc] initWithArray:(@[@1])];
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMReject([strickMockOperationQueue addOperation:[OCMArg isKindOfClass:SDLPresentChoiceSetOperation.class]]);
- OCMExpect([choiceDelegate choiceSet:[OCMArg any] didReceiveError:testInternalError]);
-
- [testManager presentChoiceSet:testFailedChoiceSet mode:testMode withKeyboardDelegate:keyboardDelegate];
-
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
- OCMVerifyAllWithDelay(choiceDelegate, 0.5);
-
- expect(testManager.pendingPresentationSet).toNot(beNil());
- expect(testManager.pendingPresentOperation).toNot(beNil());
-
- expect(testManager.preloadedMutableChoices.count).to(equal(3));
- expect(testManager.preloadedMutableChoices).toNot(contain(testFailedChoiceSet.choices[0]));
- expect(testManager.preloadedMutableChoices).to(contain(testFailedChoiceSet.choices[1]));
- expect(testManager.preloadedMutableChoices).to(contain(testFailedChoiceSet.choices[2]));
- expect(testManager.preloadedMutableChoices).to(contain(testFailedChoiceSet.choices[3]));
-
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
- });
-
- it(@"should not add any of choice items if they all fail to upload to the list of preloaded choices", ^{
- NSMutableDictionary<SDLRPCRequest *, NSError *> *testErrors = [NSMutableDictionary dictionary];
- SDLCreateInteractionChoiceSet *failedChoiceSet1 = [[SDLCreateInteractionChoiceSet alloc] initWithId:0 choiceSet:@[[[SDLChoice alloc] initWithId:1 menuName:@"1" vrCommands:nil]]];
- SDLCreateInteractionChoiceSet *failedChoiceSet2 = [[SDLCreateInteractionChoiceSet alloc] initWithId:0 choiceSet:@[[[SDLChoice alloc] initWithId:2 menuName:@"2" vrCommands:nil]]];
- SDLCreateInteractionChoiceSet *failedChoiceSet3 = [[SDLCreateInteractionChoiceSet alloc] initWithId:0 choiceSet:@[[[SDLChoice alloc] initWithId:3 menuName:@"3" vrCommands:nil]]];
- SDLCreateInteractionChoiceSet *failedChoiceSet4 = [[SDLCreateInteractionChoiceSet alloc] initWithId:0 choiceSet:@[[[SDLChoice alloc] initWithId:4 menuName:@"4" vrCommands:nil]]];
- testErrors[failedChoiceSet1] = [NSError sdl_choiceSetManager_choiceUploadFailed:[NSDictionary dictionary]];
- testErrors[failedChoiceSet2] = [NSError sdl_choiceSetManager_choiceUploadFailed:[NSDictionary dictionary]];
- testErrors[failedChoiceSet3] = [NSError sdl_choiceSetManager_choiceUploadFailed:[NSDictionary dictionary]];
- testErrors[failedChoiceSet4] = [NSError sdl_choiceSetManager_choiceUploadFailed:[NSDictionary dictionary]];
- NSError *testInternalError = [NSError sdl_choiceSetManager_choiceUploadFailed:testErrors];
-
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingMutablePreloadChoices.count).to(equal(4));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[0]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[1]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[2]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[3]));
- preloadChoicesOperation.internalError = testInternalError;
- preloadChoicesOperation.failedChoiceUploadIDs = [[NSMutableArray alloc] initWithArray:(@[@1, @2, @3, @4])];
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMReject([strickMockOperationQueue addOperation:[OCMArg isKindOfClass:SDLPresentChoiceSetOperation.class]]);
- OCMExpect([choiceDelegate choiceSet:[OCMArg any] didReceiveError:testInternalError]);
-
- [testManager presentChoiceSet:testFailedChoiceSet mode:testMode withKeyboardDelegate:keyboardDelegate];
-
- OCMVerifyAllWithDelay(strickMockOperationQueue, 1.0);
- OCMVerifyAllWithDelay(choiceDelegate, 0.5);
-
- expect(testManager.pendingPresentationSet).toNot(beNil());
- expect(testManager.pendingPresentOperation).toNot(beNil());
-
- expect(testManager.preloadedMutableChoices).to(beEmpty());
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
- });
- });
-
- it(@"should skip preloading the choices if all choice items have already been uploaded", ^{
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingMutablePreloadChoices.count).to(equal(3));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testChoiceSet.choices[0]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testChoiceSet.choices[1]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testChoiceSet.choices[2]));
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPresentChoiceSetOperation *presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- presentChoicesOperation.selectedCell = testSelectedCell;
- presentChoicesOperation.selectedTriggerSource = testMode;
- presentChoicesOperation.selectedCellRow = testSelectedCellRow;
- presentChoicesOperation.internalError = nil;
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
- OCMExpect([choiceDelegate choiceSet:testChoiceSet didSelectChoice:testSelectedCell withSource:testMode atRowIndex:testSelectedCellRow]);
-
- [testManager presentChoiceSet:testChoiceSet mode:testMode withKeyboardDelegate:keyboardDelegate];
-
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
- OCMVerifyAllWithDelay(choiceDelegate, 0.5);
-
- expect(testManager.pendingPresentationSet).to(beNil());
- expect(testManager.pendingPresentOperation).to(beNil());
-
- expect(testManager.preloadedMutableChoices.count).to(equal(3));
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
-
- // Present the exact same choices again
- OCMReject([strickMockOperationQueue addOperation:[OCMArg isKindOfClass:SDLPreloadChoicesOperation.class]]);
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPresentChoiceSetOperation *presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- presentChoicesOperation.selectedCell = testSelectedCell;
- presentChoicesOperation.selectedTriggerSource = testMode;
- presentChoicesOperation.selectedCellRow = testSelectedCellRow;
- presentChoicesOperation.internalError = nil;
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
- OCMExpect([choiceDelegate choiceSet:testChoiceSet didSelectChoice:testSelectedCell withSource:testMode atRowIndex:testSelectedCellRow]);
-
- [testManager presentChoiceSet:testChoiceSet mode:testMode withKeyboardDelegate:keyboardDelegate];
-
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
- OCMVerifyAllWithDelay(choiceDelegate, 0.5);
- });
-
- it(@"should upload choices that failed to upload in previous presentations", ^{
- NSMutableDictionary<SDLRPCRequest *, NSError *> *testErrors = [NSMutableDictionary dictionary];
- SDLCreateInteractionChoiceSet *failedChoiceSet = [[SDLCreateInteractionChoiceSet alloc] initWithId:0 choiceSet:@[[[SDLChoice alloc] initWithId:1 menuName:@"1" vrCommands:nil]]];
- testErrors[failedChoiceSet] = [NSError sdl_choiceSetManager_choiceUploadFailed:[NSDictionary dictionary]];
- NSError *testInternalError = [NSError sdl_choiceSetManager_choiceUploadFailed:testErrors];
-
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingMutablePreloadChoices.count).to(equal(4));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[0]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[1]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[2]));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[3]));
- expect(testManager.pendingPresentationSet).to(equal(testFailedChoiceSet));
- preloadChoicesOperation.internalError = testInternalError;
- preloadChoicesOperation.failedChoiceUploadIDs = [[NSMutableArray alloc] initWithArray:(@[@1])];
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMExpect([choiceDelegate choiceSet:[OCMArg any] didReceiveError:testInternalError]);
-
- [testManager presentChoiceSet:testFailedChoiceSet mode:testMode withKeyboardDelegate:keyboardDelegate];
-
- OCMVerifyAllWithDelay(strickMockOperationQueue, 1.0);
- OCMVerifyAllWithDelay(choiceDelegate, 0.5);
-
- expect(testManager.pendingPresentationSet).toNot(beNil());
- expect(testManager.pendingPresentOperation).toNot(beNil());
-
- expect(testManager.preloadedMutableChoices.count).to(equal(3));
- expect(testManager.preloadedMutableChoices).toNot(contain(testFailedChoiceSet.choices[0]));
- expect(testManager.preloadedMutableChoices).to(contain(testFailedChoiceSet.choices[1]));
- expect(testManager.preloadedMutableChoices).to(contain(testFailedChoiceSet.choices[2]));
- expect(testManager.preloadedMutableChoices).to(contain(testFailedChoiceSet.choices[3]));
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
-
- // Present the exact same choices again
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingMutablePreloadChoices.count).to(equal(1));
- expect(testManager.pendingMutablePreloadChoices).to(contain(testFailedChoiceSet.choices[0]));
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPresentChoiceSetOperation *presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- presentChoicesOperation.selectedCell = testSelectedCell;
- presentChoicesOperation.selectedTriggerSource = testMode;
- presentChoicesOperation.selectedCellRow = testSelectedCellRow;
- presentChoicesOperation.internalError = nil;
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
- OCMExpect([choiceDelegate choiceSet:testChoiceSet didSelectChoice:testSelectedCell withSource:testMode atRowIndex:testSelectedCellRow]);
-
- [testManager presentChoiceSet:testChoiceSet mode:testMode withKeyboardDelegate:keyboardDelegate];
-
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
- OCMVerifyAllWithDelay(choiceDelegate, 0.5);
-
- expect(testManager.pendingPresentationSet).to(beNil());
- expect(testManager.pendingPresentOperation).to(beNil());
-
- expect(testManager.preloadedMutableChoices.count).to(equal(4));
- expect(testManager.preloadedMutableChoices).to(contain(testFailedChoiceSet.choices[0]));
- expect(testManager.preloadedMutableChoices).to(contain(testFailedChoiceSet.choices[1]));
- expect(testManager.preloadedMutableChoices).to(contain(testFailedChoiceSet.choices[2]));
- expect(testManager.preloadedMutableChoices).to(contain(testFailedChoiceSet.choices[3]));
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
- });
-
it(@"should not present choices if the manager shuts down after the choices are uploaded but before presentation", ^{
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingPresentationSet).to(equal(testChoiceSet));
- [preloadChoicesOperation finishOperation];
- [testManager.stateMachine setToState:SDLChoiceManagerStateShutdown fromOldState:nil callEnterTransition:NO];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMReject([strickMockOperationQueue addOperation:[OCMArg isKindOfClass:SDLPresentChoiceSetOperation.class]]);
-
+ OCMExpect([choiceDelegate choiceSet:[OCMArg any] didReceiveError:[OCMArg isNotNil]]);
[testManager presentChoiceSet:testChoiceSet mode:testMode withKeyboardDelegate:nil];
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
+ SDLPreloadPresentChoicesOperation *preload = (SDLPreloadPresentChoicesOperation *)testManager.transactionQueue.operations[0];
+ preload.loadedCells = [NSSet setWithArray:testChoiceSet.choices];
- expect(testManager.pendingPresentOperation).toEventually(beNil());
- expect(testManager.pendingPresentationSet).toEventually(beNil());
- });
-
- context(@"non-searchable", ^{
- it(@"should notify the choice delegate when a choice item is selected", ^{
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingPresentationSet).to(equal(testChoiceSet));
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPresentChoiceSetOperation *presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- presentChoicesOperation.selectedCell = testSelectedCell;
- presentChoicesOperation.selectedTriggerSource = testMode;
- presentChoicesOperation.selectedCellRow = testSelectedCellRow;
- presentChoicesOperation.internalError = nil;
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
- OCMExpect([choiceDelegate choiceSet:testChoiceSet didSelectChoice:testSelectedCell withSource:testMode atRowIndex:testSelectedCellRow]);
-
- [testManager presentChoiceSet:testChoiceSet mode:testMode withKeyboardDelegate:nil];
-
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
- OCMVerifyAllWithDelay(choiceDelegate, 0.5);
-
- expect(testManager.pendingPresentationSet).to(beNil());
- expect(testManager.pendingPresentOperation).to(beNil());
- });
+ [SDLGlobals runSyncOnSerialSubQueue:testManager.readWriteQueue block:^{
+ [testManager.stateMachine setToState:SDLChoiceManagerStateShutdown fromOldState:SDLChoiceManagerStateReady callEnterTransition:YES];
+ }];
+ [preload finishOperation];
- it(@"should notify the choice delegate if an error occured during presentation", ^{
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingPresentationSet).to(equal(testChoiceSet));
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPresentChoiceSetOperation *presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- presentChoicesOperation.internalError = testError;
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
- OCMExpect([choiceDelegate choiceSet:[OCMArg any] didReceiveError:testError]);
-
- [testManager presentChoiceSet:testChoiceSet mode:testMode withKeyboardDelegate:nil];
-
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
- OCMVerifyAllWithDelay(choiceDelegate, 0.5);
-
- expect(testManager.pendingPresentationSet).to(beNil());
- expect(testManager.pendingPresentOperation).to(beNil());
- });
+ expect(testManager.preloadedChoices).to(beEmpty());
+ expect(testManager.transactionQueue.operationCount).to(equal(0));
});
describe(@"when the manager shuts down during presentation", ^{
- __block SDLPresentChoiceSetOperation *presentChoicesOperation = nil;
-
it(@"should leave the list of pending and uploaded choice items empty when the operation finishes", ^{
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- expect(testManager.pendingPresentationSet).to(equal(testChoiceSet));
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- presentChoicesOperation.internalError = nil;
- testManager.pendingMutablePreloadChoices = [NSMutableSet set];
- testManager.preloadedMutableChoices = [NSMutableSet set];
-
- [testManager.stateMachine setToState:SDLChoiceManagerStateShutdown fromOldState:nil callEnterTransition:NO];
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
-
[testManager presentChoiceSet:testChoiceSet mode:testMode withKeyboardDelegate:keyboardDelegate];
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
- expect(testManager.preloadedMutableChoices).to(beEmpty());
+ SDLPreloadPresentChoicesOperation *preloadChoicesOperation = (SDLPreloadPresentChoicesOperation *)testManager.transactionQueue.operations.firstObject;
+ [testManager.stateMachine setToState:SDLChoiceManagerStateShutdown fromOldState:nil callEnterTransition:NO];
+ [preloadChoicesOperation finishOperation];
+
expect(testManager.preloadedChoices).to(beEmpty());
- expect(testManager.pendingMutablePreloadChoices).to(beEmpty());
- expect(testManager.pendingPreloadChoices).to(beEmpty());
});
});
-
- afterEach(^{
- [strickMockOperationQueue stopMocking];
- });
});
describe(@"presenting a keyboard", ^{
- __block SDLPresentChoiceSetOperation *pendingPresentOp = nil;
__block NSString *testInitialText = @"Test text";
__block id<SDLKeyboardDelegate> testKeyboardDelegate = nil;
beforeEach(^{
testKeyboardDelegate = OCMProtocolMock(@protocol(SDLKeyboardDelegate));
-
- pendingPresentOp = OCMClassMock([SDLPresentChoiceSetOperation class]);
- testManager.pendingPresentOperation = pendingPresentOp;
- testManager.pendingPresentationSet = [[SDLChoiceSet alloc] init];
});
it(@"should return a cancelID and should properly start the keyboard presentation with presentKeyboardWithInitialText:keyboardDelegate:", ^{
NSNumber *cancelID = [testManager presentKeyboardWithInitialText:testInitialText delegate:testKeyboardDelegate];
expect(cancelID).toNot(beNil());
- OCMVerify([pendingPresentOp cancel]);
expect(testManager.transactionQueue.operations).to(haveCount(1));
- expect(testManager.pendingPresentOperation).to(beAnInstanceOf([SDLPresentKeyboardOperation class]));
+ expect( testManager.transactionQueue.operations[0]).to(beAnInstanceOf([SDLPresentKeyboardOperation class]));
});
- it(@"should return nil and should not start the keyboard presentation if the the keyboard can not be sent to Core", ^{
+ it(@"should return nil and should not start the keyboard presentation if the keyboard can not be sent to Core", ^{
[testManager.stateMachine setToState:SDLChoiceManagerStateCheckingVoiceOptional fromOldState:SDLChoiceManagerStateShutdown callEnterTransition:NO];
NSNumber *cancelID = [testManager presentKeyboardWithInitialText:testInitialText delegate:testKeyboardDelegate];
expect(cancelID).to(beNil());
- OCMReject([pendingPresentOp cancel]);
expect(testManager.transactionQueue.operations).to(haveCount(0));
- expect(testManager.pendingPresentOperation).toNot(beAnInstanceOf([SDLPresentKeyboardOperation class]));
});
});
@@ -923,7 +397,6 @@ describe(@"choice set manager tests", ^{
__block SDLChoiceSet *testChoiceSet = nil;
__block SDLChoiceSet *testChoiceSet2 = nil;
__block id<SDLChoiceSetDelegate> testChoiceDelegate = nil;
- __block id strickMockOperationQueue = nil;
beforeEach(^{
testChoiceDelegate = OCMProtocolMock(@protocol(SDLChoiceSetDelegate));
@@ -931,67 +404,29 @@ describe(@"choice set manager tests", ^{
testChoiceSet2 = [[SDLChoiceSet alloc] initWithTitle:@"choice set 2" delegate:testChoiceDelegate choices:@[testCell2]];
testManager = [[SDLChoiceSetManager alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager systemCapabilityManager:testSystemCapabilityManager];
[testManager.stateMachine setToState:SDLChoiceManagerStateReady fromOldState:SDLChoiceManagerStateCheckingVoiceOptional callEnterTransition:NO];
- strickMockOperationQueue = OCMStrictClassMock([NSOperationQueue class]);
- testManager.transactionQueue = strickMockOperationQueue;
});
it(@"should set the first cancelID correctly", ^{
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
-
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPresentChoiceSetOperation *presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- expect(@(presentChoicesOperation.cancelId)).to(equal(101));
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
-
[testManager presentChoiceSet:testChoiceSet mode:SDLInteractionModeBoth withKeyboardDelegate:nil];
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
+ SDLPreloadPresentChoicesOperation *preloadChoicesOperation = (SDLPreloadPresentChoicesOperation *)testManager.transactionQueue.operations[0];
+ expect(@(preloadChoicesOperation.cancelId)).to(equal(101));
});
it(@"should reset the cancelID correctly once the max has been reached", ^{
- testManager.nextCancelId = 200; // set the max cancelID
-
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPresentChoiceSetOperation *presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- expect(@(presentChoicesOperation.cancelId)).to(equal(200));
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
+ testManager.nextCancelId = 200;
[testManager presentChoiceSet:testChoiceSet mode:SDLInteractionModeBoth withKeyboardDelegate:nil];
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
-
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPreloadChoicesOperation *preloadChoicesOperation = (SDLPreloadChoicesOperation *)value;
- [preloadChoicesOperation finishOperation];
- return [value isKindOfClass:[SDLPreloadChoicesOperation class]];
- }]]);
- OCMExpect([strickMockOperationQueue addOperation:[OCMArg checkWithBlock:^BOOL(id value) {
- SDLPresentChoiceSetOperation *presentChoicesOperation = (SDLPresentChoiceSetOperation *)value;
- expect(@(presentChoicesOperation.cancelId)).to(equal(101));
- presentChoicesOperation.completionBlock();
- return [value isKindOfClass:[SDLPresentChoiceSetOperation class]];
- }]]);
+ SDLPreloadPresentChoicesOperation *presentChoicesOperation = testManager.transactionQueue.operations[0];
+ expect(@(presentChoicesOperation.cancelId)).to(equal(200));
[testManager presentChoiceSet:testChoiceSet2 mode:SDLInteractionModeBoth withKeyboardDelegate:nil];
- OCMVerifyAllWithDelay(strickMockOperationQueue, 0.5);
- });
+ [NSThread sleepForTimeInterval:0.5];
- afterEach(^{
- [strickMockOperationQueue stopMocking];
+ SDLPreloadPresentChoicesOperation *presentChoicesOperation2 = (SDLPreloadPresentChoicesOperation *)testManager.transactionQueue.operations[1];
+ expect(@(presentChoicesOperation2.cancelId)).to(equal(101));
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteChoicesOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteChoicesOperationSpec.m
index 2996da282..adf5632a6 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteChoicesOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteChoicesOperationSpec.m
@@ -14,20 +14,23 @@ describe(@"delete choices operation", ^{
__block TestConnectionManager *testConnectionManager = nil;
__block SDLDeleteChoicesOperation *testOp = nil;
__block NSSet<SDLChoiceCell *> *testCellsToDelete = nil;
+ __block NSSet<SDLChoiceCell *> *testLoadedCells = nil;
- __block BOOL hasCalledOperationCompletionHandler = NO;
__block NSError *resultError = nil;
+ __block NSSet<SDLChoiceCell *> *resultLoadedCells;
beforeEach(^{
- hasCalledOperationCompletionHandler = NO;
-
testConnectionManager = [[TestConnectionManager alloc] init];
testCellsToDelete = [NSSet setWithArray:@[[[SDLChoiceCell alloc] initWithText:@"Text"], [[SDLChoiceCell alloc] initWithText:@"Text 2"]]];
- testOp = [[SDLDeleteChoicesOperation alloc] initWithConnectionManager:testConnectionManager cellsToDelete:testCellsToDelete];
- testOp.completionBlock = ^{
- hasCalledOperationCompletionHandler = YES;
- resultError = testOp.error;
- };
+ testLoadedCells = testCellsToDelete;
+
+ resultError = nil;
+ resultLoadedCells = nil;
+
+ testOp = [[SDLDeleteChoicesOperation alloc] initWithConnectionManager:testConnectionManager cellsToDelete:testCellsToDelete loadedCells:testLoadedCells completionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
+ resultLoadedCells = updatedLoadedCells;
+ resultError = error;
+ }];
});
it(@"should have priority of 'normal'", ^{
@@ -56,7 +59,7 @@ describe(@"delete choices operation", ^{
});
it(@"should finish with success", ^{
- expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
+ expect(resultLoadedCells).toEventuallyNot(beNil());
expect(resultError).to(beNil());
});
});
@@ -66,8 +69,8 @@ describe(@"delete choices operation", ^{
[testConnectionManager respondToLastMultipleRequestsWithSuccess:NO];
});
- it(@"should finish with success", ^{
- expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
+ it(@"should finish with a failure", ^{
+ expect(resultLoadedCells).toEventuallyNot(beNil());
expect(resultError).toNot(beNil());
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteFileOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteFileOperationSpec.m
index a86796abe..7bf89d289 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteFileOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteFileOperationSpec.m
@@ -22,7 +22,7 @@ describe(@"Delete File Operation", ^{
deleteFileName = @"Some File";
testConnectionManager = [[TestConnectionManager alloc] init];
- testOperation = [[SDLDeleteFileOperation alloc] initWithFileName:deleteFileName connectionManager:testConnectionManager completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ testOperation = [[SDLDeleteFileOperation alloc] initWithFileName:deleteFileName connectionManager:testConnectionManager remoteFileNames:[NSSet set] completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
successResult = success;
bytesAvailableResult = bytesAvailable;
errorResult = error;
@@ -30,68 +30,82 @@ describe(@"Delete File Operation", ^{
});
it(@"should have a priority of 'very high'", ^{
- expect(@(testOperation.queuePriority)).to(equal(@(NSOperationQueuePriorityVeryHigh)));
+ expect(@(testOperation.queuePriority)).to(equal(@(NSOperationQueuePriorityNormal)));
});
describe(@"running the operation", ^{
- beforeEach(^{
- [testOperation start];
- });
-
- it(@"should send a list files request", ^{
- expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLDeleteFile class]));
- });
-
- context(@"when a good response comes back", ^{
- __block SDLDeleteFileResponse *goodResponse = nil;
- __block NSNumber *responseSpaceAvailable = nil;
-
+ context(@"when the file is not on the remote system", ^{
beforeEach(^{
- responseSpaceAvailable = @(11212512);
-
- goodResponse = [[SDLDeleteFileResponse alloc] init];
- goodResponse.success = @YES;
- goodResponse.spaceAvailable = responseSpaceAvailable;
-
- [testConnectionManager respondToLastRequestWithResponse:goodResponse];
- });
-
- it(@"should have called the completion handler with proper data", ^{
- expect(@(successResult)).to(equal(@YES));
- expect(@(bytesAvailableResult)).to(equal(responseSpaceAvailable));
- expect(errorResult).to(beNil());
+ [testOperation start];
});
-
- it(@"should be set to finished", ^{
- expect(@(testOperation.finished)).to(equal(@YES));
- expect(@(testOperation.executing)).to(equal(@NO));
+
+ it(@"should finish without sending the delete file request", ^{
+ expect(testConnectionManager.receivedRequests).to(haveCount(0));
+ expect(testOperation.isFinished).to(beTrue());
});
});
-
- context(@"when a bad response comes back", ^{
- __block SDLDeleteFileResponse *badResponse = nil;
- __block NSNumber *responseSpaceAvailable = nil;
-
- __block NSString *responseErrorDescription = nil;
- __block NSString *responseErrorReason = nil;
-
+
+ context(@"when the file is on the remote system", ^{
beforeEach(^{
- responseSpaceAvailable = @(0);
-
- responseErrorDescription = @"some description";
- responseErrorReason = @"some reason";
-
- badResponse = [[SDLDeleteFileResponse alloc] init];
- badResponse.success = @NO;
- badResponse.spaceAvailable = responseSpaceAvailable;
-
- [testConnectionManager respondToLastRequestWithResponse:badResponse error:[NSError sdl_lifecycle_unknownRemoteErrorWithDescription:responseErrorDescription andReason:responseErrorReason]];
+ testOperation.remoteFileNames = [NSSet setWithObject:deleteFileName];
+ [testOperation start];
+ });
+
+ it(@"should send a delete file request", ^{
+ expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLDeleteFile class]));
+ });
+
+ context(@"when a good response comes back", ^{
+ __block SDLDeleteFileResponse *goodResponse = nil;
+ __block NSNumber *responseSpaceAvailable = nil;
+
+ beforeEach(^{
+ responseSpaceAvailable = @(11212512);
+
+ goodResponse = [[SDLDeleteFileResponse alloc] init];
+ goodResponse.success = @YES;
+ goodResponse.spaceAvailable = responseSpaceAvailable;
+
+ [testConnectionManager respondToLastRequestWithResponse:goodResponse];
+ });
+
+ it(@"should have called the completion handler with proper data", ^{
+ expect(@(successResult)).to(equal(@YES));
+ expect(@(bytesAvailableResult)).to(equal(responseSpaceAvailable));
+ expect(errorResult).to(beNil());
+ });
+
+ it(@"should be set to finished", ^{
+ expect(@(testOperation.finished)).to(equal(@YES));
+ expect(@(testOperation.executing)).to(equal(@NO));
+ });
});
-
- it(@"should have called completion handler with error", ^{
- expect(errorResult.localizedDescription).to(match(responseErrorDescription));
- expect(errorResult.localizedFailureReason).to(match(responseErrorReason));
- expect(@(successResult)).to(equal(@NO));
+
+ context(@"when a bad response comes back", ^{
+ __block SDLDeleteFileResponse *badResponse = nil;
+ __block NSNumber *responseSpaceAvailable = nil;
+
+ __block NSString *responseErrorDescription = nil;
+ __block NSString *responseErrorReason = nil;
+
+ beforeEach(^{
+ responseSpaceAvailable = @(0);
+
+ responseErrorDescription = @"some description";
+ responseErrorReason = @"some reason";
+
+ badResponse = [[SDLDeleteFileResponse alloc] init];
+ badResponse.success = @NO;
+ badResponse.spaceAvailable = responseSpaceAvailable;
+
+ [testConnectionManager respondToLastRequestWithResponse:badResponse error:[NSError sdl_lifecycle_unknownRemoteErrorWithDescription:responseErrorDescription andReason:responseErrorReason]];
+ });
+
+ it(@"should have called completion handler with error", ^{
+ expect(errorResult.localizedDescription).to(match(responseErrorDescription));
+ expect(errorResult.localizedFailureReason).to(match(responseErrorReason));
+ expect(@(successResult)).to(equal(@NO));
+ });
});
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
index 9c82297e0..782bc090d 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
@@ -200,9 +200,7 @@ describe(@"uploading / deleting single files with the file manager", ^{
});
describe(@"deleting a file", ^{
- __block BOOL completionSuccess = NO;
- __block NSUInteger completionBytesAvailable = 0;
- __block NSError *completionError = nil;
+ __block BOOL completionCalled = NO;
beforeEach(^{
testFileManager.mutableRemoteFileNames = [NSMutableSet setWithArray:testInitialFileNames];
@@ -213,19 +211,14 @@ describe(@"uploading / deleting single files with the file manager", ^{
beforeEach(^{
NSString *someUnknownFileName = @"Some Unknown File Name";
[testFileManager deleteRemoteFileWithName:someUnknownFileName completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
- completionSuccess = success;
- completionBytesAvailable = bytesAvailable;
- completionError = error;
+ completionCalled = YES;
}];
- expect(testFileManager.pendingTransactions).to(beEmpty());
+ expect(testFileManager.pendingTransactions).toNot(beEmpty());
});
- it(@"should return the correct data", ^{
- expect(completionSuccess).to(beFalse());
- expect(completionBytesAvailable).to(equal(initialSpaceAvailable));
- expect(completionError).to(equal([NSError sdl_fileManager_noKnownFileError]));
- expect(testFileManager.remoteFileNames).to(haveCount(testInitialFileNames.count));
+ it(@"should not call the completion handler", ^{
+ expect(completionCalled).to(beFalse());
});
});
@@ -475,32 +468,36 @@ describe(@"uploading / deleting single files with the file manager", ^{
[SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:4 minor:3 patch:0];
});
- it(@"should not upload the file if persistence is YES", ^{
- SDLFile *persistentFile = [[SDLFile alloc] initWithData:testFileData name:testUploadFileName fileExtension:@"bin" persistent:YES];
- persistentFile.overwrite = testUploadOverwrite;
+ context(@"when persistent = YES", ^{
+ it(@"should create the upload operation", ^{
+ SDLFile *persistentFile = [[SDLFile alloc] initWithData:testFileData name:testUploadFileName fileExtension:@"bin" persistent:YES];
+ persistentFile.overwrite = testUploadOverwrite;
- [testFileManager uploadFile:persistentFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
- expect(@(success)).to(beFalse());
- expect(@(bytesAvailable)).to(equal(@(testFileManager.bytesAvailable)));
- expect(error).to(equal([NSError sdl_fileManager_cannotOverwriteError]));
- }];
+ [testFileManager uploadFile:persistentFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ expect(@(success)).to(beFalse());
+ expect(@(bytesAvailable)).to(equal(@(testFileManager.bytesAvailable)));
+ expect(error).to(equal([NSError sdl_fileManager_cannotOverwriteError]));
+ }];
- expect(testFileManager.pendingTransactions.count).to(equal(0));
+ expect(testFileManager.pendingTransactions.count).to(equal(1));
+ });
});
- it(@"should upload the file if persistence is NO", ^{
- SDLFile *unPersistentFile = [[SDLFile alloc] initWithData:testFileData name:testUploadFileName fileExtension:@"bin" persistent:NO];
- unPersistentFile.overwrite = testUploadOverwrite;
+ context(@"when persistent = NO", ^{
+ it(@"should upload the file", ^{
+ SDLFile *unPersistentFile = [[SDLFile alloc] initWithData:testFileData name:testUploadFileName fileExtension:@"bin" persistent:NO];
+ unPersistentFile.overwrite = testUploadOverwrite;
- [testFileManager uploadFile:unPersistentFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
- expect(success).to(beTrue());
- expect(bytesAvailable).to(equal(newBytesAvailable));
- expect(error).to(beNil());
- }];
+ [testFileManager uploadFile:unPersistentFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ expect(success).to(beTrue());
+ expect(bytesAvailable).to(equal(newBytesAvailable));
+ expect(error).to(beNil());
+ }];
- SDLUploadFileOperation *sentOperation = testFileManager.pendingTransactions.firstObject;
- sentOperation.fileWrapper.completionHandler(YES, newBytesAvailable, nil);
- expect(testFileManager.pendingTransactions.count).to(equal(1));
+ SDLUploadFileOperation *sentOperation = testFileManager.pendingTransactions.firstObject;
+ sentOperation.fileWrapper.completionHandler(YES, newBytesAvailable, nil);
+ expect(testFileManager.pendingTransactions.count).to(equal(1));
+ });
});
});
});
@@ -572,45 +569,51 @@ describe(@"uploading / deleting single files with the file manager", ^{
[testFileManager.stateMachine setToState:SDLFileManagerStateReady fromOldState:SDLFileManagerStateShutdown callEnterTransition:NO];
});
- it(@"should not upload the artwork again and simply return the artwork name when sending artwork that has already been uploaded", ^{
- expectedArtworkName = testInitialFileNames.firstObject;
+ context(@"when uploading an already uploading artwork", ^{
+ it(@"should create an upload operation", ^{
+ expectedArtworkName = testInitialFileNames.firstObject;
- SDLArtwork *art = [SDLArtwork artworkWithImage:testUIImage name:expectedArtworkName asImageFormat:SDLArtworkImageFormatPNG];
- [testFileManager uploadArtwork:art completionHandler:^(BOOL success, NSString * _Nonnull artworkName, NSUInteger bytesAvailable, NSError * _Nullable error) {
- expect(success).to(beTrue());
- expect(bytesAvailable).to(equal(initialSpaceAvailable));
- expect(error).to(beNil());
- }];
+ SDLArtwork *art = [SDLArtwork artworkWithImage:testUIImage name:expectedArtworkName asImageFormat:SDLArtworkImageFormatPNG];
+ [testFileManager uploadArtwork:art completionHandler:^(BOOL success, NSString * _Nonnull artworkName, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ expect(success).to(beTrue());
+ expect(bytesAvailable).to(equal(initialSpaceAvailable));
+ expect(error).to(beNil());
+ }];
- expect(testFileManager.pendingTransactions.count).to(equal(0));
+ expect(testFileManager.pendingTransactions.count).to(equal(1));
+ });
});
- it(@"should upload the artwork and return the artwork name when done when sending artwork that has not yet been uploaded", ^{
- expectedArtworkName = @"uniqueArtworkName";
- [testFileManager uploadArtwork:[SDLArtwork artworkWithImage:testUIImage name:expectedArtworkName asImageFormat:SDLArtworkImageFormatPNG] completionHandler:^(BOOL success, NSString * _Nonnull artworkName, NSUInteger bytesAvailable, NSError * _Nullable error) {
- expect(success).to(beTrue());
- expect(bytesAvailable).to(equal(newBytesAvailable));
- expect(error).to(beNil());
- }];
+ context(@"when sending artwork that has not yet been uploaded", ^{
+ it(@"should upload the artwork and return the artwork name", ^{
+ expectedArtworkName = @"uniqueArtworkName";
+ [testFileManager uploadArtwork:[SDLArtwork artworkWithImage:testUIImage name:expectedArtworkName asImageFormat:SDLArtworkImageFormatPNG] completionHandler:^(BOOL success, NSString * _Nonnull artworkName, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ expect(success).to(beTrue());
+ expect(bytesAvailable).to(equal(newBytesAvailable));
+ expect(error).to(beNil());
+ }];
- SDLUploadFileOperation *sentOperation = testFileManager.pendingTransactions.firstObject;
- sentOperation.fileWrapper.completionHandler(YES, newBytesAvailable, nil);
- expect(testFileManager.pendingTransactions.count).to(equal(1));
+ SDLUploadFileOperation *sentOperation = testFileManager.pendingTransactions.firstObject;
+ sentOperation.fileWrapper.completionHandler(YES, newBytesAvailable, nil);
+ expect(testFileManager.pendingTransactions.count).to(equal(1));
+ });
});
- it(@"should upload the artwork and return the artwork name when done when sending arwork that is already been uploaded but overwrite is enabled", ^{
- expectedArtworkName = testInitialFileNames.firstObject;
- SDLArtwork *testArt = [SDLArtwork artworkWithImage:testUIImage name:expectedArtworkName asImageFormat:SDLArtworkImageFormatPNG];
- testArt.overwrite = YES;
- [testFileManager uploadArtwork:testArt completionHandler:^(BOOL success, NSString * _Nonnull artworkName, NSUInteger bytesAvailable, NSError * _Nullable error) {
- expect(success).to(beTrue());
- expect(bytesAvailable).to(equal(newBytesAvailable));
- expect(error).to(beNil());
- }];
+ context(@"when sending arwork that is already been uploaded but overwrite is enabled", ^{
+ it(@"should upload the artwork and return the artwork name when done when sending arwork that is already been uploaded but overwrite is enabled", ^{
+ expectedArtworkName = testInitialFileNames.firstObject;
+ SDLArtwork *testArt = [SDLArtwork artworkWithImage:testUIImage name:expectedArtworkName asImageFormat:SDLArtworkImageFormatPNG];
+ testArt.overwrite = YES;
+ [testFileManager uploadArtwork:testArt completionHandler:^(BOOL success, NSString * _Nonnull artworkName, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ expect(success).to(beTrue());
+ expect(bytesAvailable).to(equal(newBytesAvailable));
+ expect(error).to(beNil());
+ }];
- SDLUploadFileOperation *sentOperation = testFileManager.pendingTransactions.firstObject;
- sentOperation.fileWrapper.completionHandler(YES, newBytesAvailable, nil);
- expect(testFileManager.pendingTransactions.count).to(equal(1));
+ SDLUploadFileOperation *sentOperation = testFileManager.pendingTransactions.firstObject;
+ sentOperation.fileWrapper.completionHandler(YES, newBytesAvailable, nil);
+ expect(testFileManager.pendingTransactions.count).to(equal(1));
+ });
});
});
@@ -1131,7 +1134,7 @@ describe(@"uploading/deleting multiple files in the file manager", ^{
});
it(@"should cancel the remaining files if cancel is triggered after first upload", ^{
- for(int i = 0; i < 5; i += 1) {
+ for(int i = 0; i < 5; i++) {
NSString *testFileName = [NSString stringWithFormat:@"TestSmallFilesMemory%d", i];
SDLFile *testSDLFile = [SDLFile fileWithData:[@"someTextData" dataUsingEncoding:NSUTF8StringEncoding] name:testFileName fileExtension:@"bin"];
testSDLFile.overwrite = true;
@@ -1168,7 +1171,7 @@ describe(@"uploading/deleting multiple files in the file manager", ^{
});
it(@"should cancel the remaining files if cancel is triggered after half of the files are uploaded", ^{
- for(int i = 0; i < 5; i += 1) {
+ for(int i = 0; i < 5; i++) {
NSString *testFileName = [NSString stringWithFormat:@"TestSmallFilesMemory%d", i];
SDLFile *testSDLFile = [SDLFile fileWithData:[@"someTextData" dataUsingEncoding:NSUTF8StringEncoding] name:testFileName fileExtension:@"bin"];
testSDLFile.overwrite = true;
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m
index f6d982a57..02bb07a1c 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m
@@ -15,6 +15,8 @@ describe(@"a menu cell", ^{
__block NSString *someTertiaryTitle = nil;
__block SDLArtwork *someArtwork = nil;
__block SDLArtwork *someSecondaryArtwork = nil;
+ __block NSArray<NSString *> *someVoiceCommands = nil;
+ __block NSArray<SDLMenuCell *> *someSubcells = nil;
beforeEach(^{
someTitle = @"Some Title";
@@ -22,19 +24,11 @@ describe(@"a menu cell", ^{
someTertiaryTitle = @"Some Title 3";
someArtwork = [[SDLArtwork alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:@"data" options:kNilOptions] name:@"Some artwork" fileExtension:@"png" persistent:NO];
someSecondaryArtwork = [[SDLArtwork alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:@"data" options:kNilOptions] name:@"Some artwork 2" fileExtension:@"png" persistent:NO];
+ someVoiceCommands = @[@"some command"];
+ someSubcells = @[[[SDLMenuCell alloc] initWithTitle:@"Test Subcell" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}], [[SDLMenuCell alloc] initWithTitle:@"Test Subcell2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]];
});
describe(@"initializing", ^{
- __block NSArray<NSString *> *someVoiceCommands = nil;
- __block NSArray<SDLMenuCell *> *someSubcells = nil;
-
- beforeEach(^{
- someVoiceCommands = @[@"some command"];
-
- SDLMenuCell *subcell = [[SDLMenuCell alloc] initWithTitle:@"Hello" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- someSubcells = @[subcell];
- });
-
it(@"should set initWithTitle:icon:submenuLayout:subCells: propertly", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -108,6 +102,13 @@ describe(@"a menu cell", ^{
expect([testCell isEqual:testCell2]).to(beFalse());
});
+ it(@"should compare cells and return false if one cell has subcells empty and another has subcells nil", ^{
+ testCell = [[SDLMenuCell alloc] initWithTitle:someTitle secondaryText:someSecondaryTitle tertiaryText:someTertiaryTitle icon:nil secondaryArtwork:someSecondaryArtwork submenuLayout:testLayout subCells:nil];
+ testCell2 = [[SDLMenuCell alloc] initWithTitle:someTitle secondaryText:someSecondaryTitle tertiaryText:someTertiaryTitle icon:nil secondaryArtwork:someSecondaryArtwork submenuLayout:testLayout subCells:@[]];
+
+ expect([testCell isEqual:testCell2]).to(beFalse());
+ });
+
it(@"should compare cells and return true if cells equal", ^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -128,6 +129,24 @@ describe(@"a menu cell", ^{
expect([testCell isEqual:testCell2]).to(beFalse());
});
});
+
+ describe(@"copying a cell", ^{
+ context(@"a submenu cell", ^{
+ it(@"should copy correctly", ^{
+ testCell = [[SDLMenuCell alloc] initWithTitle:someTitle secondaryText:someSecondaryTitle tertiaryText:someTertiaryTitle icon:someArtwork secondaryArtwork:someSecondaryArtwork submenuLayout:testLayout subCells:someSubcells];
+ testCell2 = [testCell copy];
+
+ expect(testCell2).to(equal(testCell));
+ });
+ });
+
+ context(@"a normal cell", ^{
+ testCell = [[SDLMenuCell alloc] initWithTitle:someTitle secondaryText:someSecondaryTitle tertiaryText:someTertiaryTitle icon:someArtwork secondaryArtwork:someSecondaryArtwork voiceCommands:someVoiceCommands handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ testCell2 = [testCell copy];
+
+ expect(testCell2).to(equal(testCell));
+ });
+ });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuConfigurationUpdateOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuConfigurationUpdateOperationSpec.m
new file mode 100644
index 000000000..3678d4ecc
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuConfigurationUpdateOperationSpec.m
@@ -0,0 +1,174 @@
+//
+// SDLMenuConfigurationUpdateOperationSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 2/16/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+#import <Quick/Quick.h>
+
+#import <SmartDeviceLink/SmartDeviceLink.h>
+#import "SDLMenuConfigurationUpdateOperation.h"
+#import "TestConnectionManager.h"
+
+QuickSpecBegin(SDLMenuConfigurationUpdateOperationSpec)
+
+describe(@"a menu configuration update operation", ^{
+ __block SDLMenuConfigurationUpdateOperation *testOp = nil;
+
+ __block TestConnectionManager *testConnectionManager = nil;
+ __block SDLFileManager *testFileManager = nil;
+ __block SDLWindowCapability *testWindowCapability = nil;
+ SDLMenuConfiguration *testMenuConfiguration = [[SDLMenuConfiguration alloc] initWithMainMenuLayout:SDLMenuLayoutList defaultSubmenuLayout:SDLMenuLayoutTiles];
+
+ __block SDLMenuConfigurationUpdatedBlock testUpdatedBlock = nil;
+ __block SDLMenuConfiguration *resultMenuConfiguration = nil;
+ __block NSError *resultError = nil;
+
+ beforeEach(^{
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ testFileManager = OCMClassMock([SDLFileManager class]);
+ testWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@0 textFields:nil imageFields:nil imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:@[] dynamicUpdateCapabilities:nil keyboardCapabilities:nil];
+
+ resultMenuConfiguration = nil;
+ resultError = nil;
+ testUpdatedBlock = ^(SDLMenuConfiguration *newConfiguration, NSError *_Nullable error) {
+ resultMenuConfiguration = newConfiguration;
+ resultError = error;
+ };
+ });
+
+ // when the layout check fails
+ describe(@"when the layout check fails", ^{
+ // when there are no known menu layouts
+ context(@"when there are no known menu layouts", ^{
+ it(@"should return an error and finish", ^{
+ testOp = [[SDLMenuConfigurationUpdateOperation alloc] initWithConnectionManager:testConnectionManager windowCapability:testWindowCapability newMenuConfiguration:testMenuConfiguration configurationUpdatedHandler:testUpdatedBlock];
+ [testOp start];
+
+ expect(testConnectionManager.receivedRequests).to(beEmpty());
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultMenuConfiguration).to(beNil());
+ expect(resultError).toNot(beNil());
+ expect(testOp.error).toNot(beNil());
+ });
+ });
+
+ // when the set main menu layout is not available
+ context(@"when the set main menu layout is not available", ^{
+ beforeEach(^{
+ testWindowCapability.menuLayoutsAvailable = @[SDLMenuLayoutTiles];
+ });
+
+ it(@"should return an error and finish", ^{
+ testOp = [[SDLMenuConfigurationUpdateOperation alloc] initWithConnectionManager:testConnectionManager windowCapability:testWindowCapability newMenuConfiguration:testMenuConfiguration configurationUpdatedHandler:testUpdatedBlock];
+ [testOp start];
+
+ expect(testConnectionManager.receivedRequests).to(beEmpty());
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultMenuConfiguration).to(beNil());
+ expect(resultError).toNot(beNil());
+ expect(testOp.error).toNot(beNil());
+ });
+ });
+
+ // when the set default submenu layout is not available
+ context(@"when the set default submenu layout is not available", ^{
+ beforeEach(^{
+ testWindowCapability.menuLayoutsAvailable = @[SDLMenuLayoutList];
+ });
+
+ it(@"should return an error and finish", ^{
+ testOp = [[SDLMenuConfigurationUpdateOperation alloc] initWithConnectionManager:testConnectionManager windowCapability:testWindowCapability newMenuConfiguration:testMenuConfiguration configurationUpdatedHandler:testUpdatedBlock];
+ [testOp start];
+
+ expect(testConnectionManager.receivedRequests).to(beEmpty());
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultMenuConfiguration).to(beNil());
+ expect(resultError).toNot(beNil());
+ expect(testOp.error).toNot(beNil());
+ });
+ });
+ });
+
+ // when the set layouts are available
+ describe(@"when the set layouts are available", ^{
+ __block SDLSetGlobalPropertiesResponse *response = [[SDLSetGlobalPropertiesResponse alloc] init];
+
+ beforeEach(^{
+ testWindowCapability.menuLayoutsAvailable = @[SDLMenuLayoutList, SDLMenuLayoutTiles];
+
+ testOp = [[SDLMenuConfigurationUpdateOperation alloc] initWithConnectionManager:testConnectionManager windowCapability:testWindowCapability newMenuConfiguration:testMenuConfiguration configurationUpdatedHandler:testUpdatedBlock];
+ [testOp start];
+ });
+
+ // should send the RPC
+ it(@"should send the RPC", ^{
+ expect(testOp.error).to(beNil());
+ expect(testConnectionManager.receivedRequests).toNot(beEmpty());
+ expect(testOp.isFinished).to(beFalse());
+ expect(resultMenuConfiguration).to(beNil());
+ expect(resultError).to(beNil());
+
+ SDLSetGlobalProperties *receivedSGP = (SDLSetGlobalProperties *)testConnectionManager.receivedRequests[0];
+ expect(receivedSGP.menuLayout).to(equal(testMenuConfiguration.mainMenuLayout));
+ });
+
+ // if an error returned
+ context(@"if an error returned", ^{
+ beforeEach(^{
+ response.success = @NO;
+ response.resultCode = SDLResultRejected;
+ });
+
+ it(@"should return an error and finish", ^{
+ [testConnectionManager respondToLastRequestWithResponse:response];
+
+ expect(testOp.error).toNot(beNil());
+ expect(testConnectionManager.receivedRequests).toNot(beEmpty());
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultMenuConfiguration).to(beNil());
+ });
+ });
+
+ // if it succeeded
+ context(@"if it succeeded", ^{
+ beforeEach(^{
+ response.success = @YES;
+ response.resultCode = SDLResultSuccess;
+ });
+
+ it(@"should not return an error and finish", ^{
+ [testConnectionManager respondToLastRequestWithResponse:response];
+
+ expect(testOp.error).to(beNil());
+ expect(testConnectionManager.receivedRequests).toNot(beEmpty());
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultMenuConfiguration).to(equal(testMenuConfiguration));
+ expect(resultError).to(beNil());
+ });
+ });
+ });
+
+ describe(@"cancelling the operation before it starts", ^{
+ testOp = [[SDLMenuConfigurationUpdateOperation alloc] initWithConnectionManager:testConnectionManager windowCapability:testWindowCapability newMenuConfiguration:testMenuConfiguration configurationUpdatedHandler:testUpdatedBlock];
+
+ beforeEach(^{
+ [testOp cancel];
+ [testOp start];
+ });
+
+ it(@"should finish without any callbacks", ^{
+ expect(testOp.error).to(beNil());
+ expect(testConnectionManager.receivedRequests).to(beEmpty());
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultMenuConfiguration).to(beNil());
+ expect(resultError).to(beNil());
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
index 4b20b08de..c663205e2 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
@@ -4,9 +4,10 @@
#import <SmartDeviceLink/SmartDeviceLink.h>
+#import "SDLGlobals.h"
#import "SDLMenuManager.h"
+#import "SDLMenuReplaceOperation.h"
#import "TestConnectionManager.h"
-#import "SDLGlobals.h"
@interface SDLMenuCell()
@@ -22,20 +23,13 @@
@property (weak, nonatomic) SDLFileManager *fileManager;
@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
-@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
-@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
+@property (strong, nonatomic) NSOperationQueue *transactionQueue;
@property (strong, nonatomic, nullable) SDLWindowCapability *windowCapability;
-@property (strong, nonatomic, nullable) NSArray<SDLRPCRequest *> *inProgressUpdate;
-@property (assign, nonatomic) BOOL hasQueuedUpdate;
-@property (assign, nonatomic) BOOL waitingOnHMIUpdate;
-@property (copy, nonatomic) NSArray<SDLMenuCell *> *waitingUpdateMenuCells;
-
-@property (assign, nonatomic) UInt32 lastMenuId;
-@property (copy, nonatomic) NSArray<SDLMenuCell *> *oldMenuCells;
-
-- (BOOL)sdl_shouldRPCsIncludeImages:(NSArray<SDLMenuCell *> *)cells;
-- (void)sdl_displayCapabilityDidUpdate;
+@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
+@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
+@property (copy, nonatomic) NSArray<SDLMenuCell *> *currentMenuCells;
+@property (strong, nonatomic, nullable) SDLMenuConfiguration *currentMenuConfiguration;
@end
@@ -46,40 +40,15 @@ describe(@"menu manager", ^{
__block TestConnectionManager *mockConnectionManager = nil;
__block SDLFileManager *mockFileManager = nil;
__block SDLSystemCapabilityManager *mockSystemCapabilityManager = nil;
- __block SDLArtwork *testArtwork = nil;
- __block SDLArtwork *testArtwork2 = nil;
- __block SDLArtwork *testArtwork3 = nil;
-
- __block SDLMenuCell *textOnlyCell = nil;
- __block SDLMenuCell *textOnlyCell2 = nil;
- __block SDLMenuCell *textAndImageCell = nil;
- __block SDLMenuCell *textAndImageCell2 = nil;
- __block SDLMenuCell *submenuCell = nil;
- __block SDLMenuCell *submenuCell2 = nil;
- __block SDLMenuCell *submenuImageCell = nil;
__block SDLMenuConfiguration *testMenuConfiguration = nil;
- __block SDLImageField *commandIconField = nil;
- __block SDLImageField *commandSecondaryArtworkField = nil;
- __block SDLImageField *submenuIconField = nil;
- __block SDLImageField *subMenuSecondaryArtworkField = nil;
-
- __block SDLVersion *menuUniquenessActiveVersion = nil;
+ __block SDLMenuCell *textOnlyCell = nil;
+ __block SDLMenuCell *submenuCell = nil;
beforeEach(^{
- testArtwork = [[SDLArtwork alloc] initWithData:[@"Test data" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name" fileExtension:@"png" persistent:NO];
- testArtwork2 = [[SDLArtwork alloc] initWithData:[@"Test data 2" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name 2" fileExtension:@"png" persistent:NO];
- testArtwork3 = [[SDLArtwork alloc] initWithData:[@"Test data 3" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name" fileExtension:@"png" persistent:NO];
- testArtwork3.overwrite = YES;
-
textOnlyCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- textAndImageCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork2 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[textOnlyCell, textAndImageCell]];
- submenuCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[textAndImageCell, textAndImageCell2]];
- submenuImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 4" secondaryText:nil tertiaryText:nil icon:testArtwork2 secondaryArtwork:nil submenuLayout:SDLMenuLayoutTiles subCells:@[textOnlyCell]];
- textOnlyCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 5" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[textOnlyCell]];
testMenuConfiguration = [[SDLMenuConfiguration alloc] initWithMainMenuLayout:SDLMenuLayoutTiles defaultSubmenuLayout:SDLMenuLayoutList];
@@ -88,620 +57,257 @@ describe(@"menu manager", ^{
mockSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
testManager = [[SDLMenuManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager];
- commandIconField = [[SDLImageField alloc] initWithName:SDLImageFieldNameCommandIcon imageTypeSupported:@[SDLFileTypePNG] imageResolution:nil];
- commandSecondaryArtworkField = [[SDLImageField alloc] initWithName:SDLImageFieldNameMenuCommandSecondaryImage imageTypeSupported:@[SDLFileTypePNG] imageResolution:nil];
- submenuIconField = [[SDLImageField alloc] initWithName:SDLImageFieldNameSubMenuIcon imageTypeSupported:@[SDLFileTypePNG] imageResolution:nil];
- subMenuSecondaryArtworkField = [[SDLImageField alloc] initWithName:SDLImageFieldNameMenuSubMenuSecondaryImage imageTypeSupported:@[SDLFileTypePNG] imageResolution:nil];
- SDLTextField *commandSecondaryTextField = [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuCommandSecondaryText characterSet:SDLCharacterSetAscii width:100 rows:1];
- SDLTextField *commandTertiaryTextField = [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuCommandTertiaryText characterSet:SDLCharacterSetAscii width:100 rows:1];
- SDLTextField *submenuSecondaryTextField = [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuSubMenuSecondaryText characterSet:SDLCharacterSetAscii width:100 rows:1];
- SDLTextField *submenuTertiaryTextField = [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuSubMenuTertiaryText characterSet:SDLCharacterSetAscii width:100 rows:1];
+ SDLImageField *commandIconField = [[SDLImageField alloc] init];
+ commandIconField.name = SDLImageFieldNameCommandIcon;
SDLWindowCapability *windowCapability = [[SDLWindowCapability alloc] init];
windowCapability.windowID = @(SDLPredefinedWindowsDefaultWindow);
- windowCapability.imageFields = @[commandIconField, commandSecondaryArtworkField, submenuIconField, subMenuSecondaryArtworkField];
- windowCapability.textFields = @[commandSecondaryTextField, commandTertiaryTextField, submenuSecondaryTextField, submenuTertiaryTextField];
+ windowCapability.imageFields = @[commandIconField];
windowCapability.imageTypeSupported = @[SDLImageTypeDynamic, SDLImageTypeStatic];
windowCapability.menuLayoutsAvailable = @[SDLMenuLayoutList, SDLMenuLayoutTiles];
testManager.windowCapability = windowCapability;
- menuUniquenessActiveVersion = [[SDLVersion alloc] initWithMajor:7 minor:1 patch:0];
});
- // should instantiate correctly
it(@"should instantiate correctly", ^{
expect(testManager.menuCells).to(beEmpty());
+
+ expect(@(testManager.dynamicMenuUpdatesMode)).to(equal(@(SDLDynamicMenuUpdatesModeOnWithCompatibility)));
expect(testManager.connectionManager).to(equal(mockConnectionManager));
expect(testManager.fileManager).to(equal(mockFileManager));
expect(testManager.systemCapabilityManager).to(equal(mockSystemCapabilityManager));
+ expect(testManager.transactionQueue).toNot(beNil());
+ expect(testManager.windowCapability).toNot(beNil());
expect(testManager.currentHMILevel).to(beNil());
- expect(testManager.inProgressUpdate).to(beNil());
- expect(testManager.hasQueuedUpdate).to(beFalse());
- expect(testManager.waitingOnHMIUpdate).to(beFalse());
- expect(testManager.lastMenuId).to(equal(1));
- expect(testManager.oldMenuCells).to(beEmpty());
- expect(testManager.waitingUpdateMenuCells).to(beNil());
- expect(testManager.menuConfiguration).toNot(beNil());
- });
-
- // updating menu cells before HMI is ready
- describe(@"updating menu cells before HMI is ready", ^{
- // when in HMI NONE
- context(@"when in HMI NONE", ^{
- beforeEach(^{
- testManager.currentHMILevel = SDLHMILevelNone;
- testManager.menuCells = @[textOnlyCell];
- });
-
- it(@"should not update", ^{
- expect(mockConnectionManager.receivedRequests).to(beEmpty());
- });
-
- describe(@"when entering the foreground", ^{
- beforeEach(^{
- SDLOnHMIStatus *onHMIStatus = [[SDLOnHMIStatus alloc] init];
- onHMIStatus.hmiLevel = SDLHMILevelFull;
- onHMIStatus.systemContext = SDLSystemContextMain;
-
- SDLRPCNotificationNotification *testSystemContextNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:onHMIStatus];
- [[NSNotificationCenter defaultCenter] postNotification:testSystemContextNotification];
- });
-
- it(@"should update", ^{
- expect(mockConnectionManager.receivedRequests).toNot(beEmpty());
- });
- });
- });
-
- // when no HMI level has been received
- context(@"when no HMI level has been received", ^{
- beforeEach(^{
- testManager.currentHMILevel = nil;
- });
-
- it(@"should not update the menu configuration", ^{
- testManager.menuConfiguration = testMenuConfiguration;
- expect(mockConnectionManager.receivedRequests).to(beEmpty());
- expect(testManager.menuConfiguration).toNot(equal(testMenuConfiguration));
- });
-
- it(@"should not update the menu cells", ^{
- testManager.menuCells = @[textOnlyCell];
- expect(mockConnectionManager.receivedRequests).to(beEmpty());
- });
- });
-
- // when in the menu
- context(@"when in the menu", ^{
- beforeEach(^{
- [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithString:@"6.0.0"];
- testManager.currentHMILevel = SDLHMILevelFull;
- testManager.currentSystemContext = SDLSystemContextMenu;
- });
-
- it(@"should update the menu configuration", ^{
- testManager.menuConfiguration = testMenuConfiguration;
- expect(mockConnectionManager.receivedRequests).toNot(beEmpty());
- expect(testManager.menuConfiguration).to(equal(testMenuConfiguration));
- });
- });
+ expect(testManager.currentSystemContext).to(beNil());
+ expect(testManager.currentMenuCells).to(beEmpty());
+ expect(testManager.currentMenuConfiguration).to(beNil());
});
- // display capability updates
- describe(@"display capability updates", ^{
+ describe(@"when the manager stops", ^{
beforeEach(^{
- testManager.currentHMILevel = SDLHMILevelFull;
- testManager.currentSystemContext = SDLSystemContextMain;
+ [testManager stop];
});
- it(@"should save the new window capability", ^{
- SDLWindowCapability *testWindowCapability = [[SDLWindowCapability alloc] init];
- testWindowCapability.textFields = @[[[SDLTextField alloc] initWithName:SDLTextFieldNameMenuName characterSet:SDLCharacterSetUtf8 width:500 rows:1]];
- OCMStub([mockSystemCapabilityManager defaultMainWindowCapability]).andReturn(testWindowCapability);
- [testManager sdl_displayCapabilityDidUpdate];
+ it(@"should reset correctly", ^{
+ expect(testManager.menuCells).to(beEmpty());
- expect(testManager.windowCapability).to(equal(testWindowCapability));
+ expect(@(testManager.dynamicMenuUpdatesMode)).to(equal(@(SDLDynamicMenuUpdatesModeOnWithCompatibility)));
+ expect(testManager.connectionManager).to(equal(mockConnectionManager));
+ expect(testManager.fileManager).to(equal(mockFileManager));
+ expect(testManager.systemCapabilityManager).to(equal(mockSystemCapabilityManager));
+ expect(testManager.transactionQueue).toNot(beNil());
+ expect(testManager.windowCapability).to(beNil());
+ expect(testManager.currentHMILevel).to(beNil());
+ expect(testManager.currentSystemContext).to(beNil());
+ expect(testManager.currentMenuCells).to(beEmpty());
+ expect(testManager.currentMenuConfiguration).to(beNil());
});
});
- // updating menu cells
- describe(@"updating menu cells", ^{
+ context(@"when in HMI NONE", ^{
beforeEach(^{
- testManager.currentHMILevel = SDLHMILevelFull;
- testManager.currentSystemContext = SDLSystemContextMain;
+ SDLOnHMIStatus *noneStatus = [[SDLOnHMIStatus alloc] initWithHMILevel:SDLHMILevelNone systemContext:SDLSystemContextMain audioStreamingState:SDLAudioStreamingStateNotAudible videoStreamingState:nil windowID:nil];
+ [[NSNotificationCenter defaultCenter] postNotification:[[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:noneStatus]];
});
- // HMI does not support a command secondary image
- context(@"HMI does not support a command secondary image", ^{
- SDLArtwork *staticArtwork = [[SDLArtwork alloc] initWithStaticIcon:SDLStaticIconNameKey];
-
- beforeEach(^{
- testManager.windowCapability.imageFields = @[commandIconField, submenuIconField, subMenuSecondaryArtworkField];
- textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:staticArtwork voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- textAndImageCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:staticArtwork submenuLayout:SDLMenuLayoutList subCells:@[textOnlyCell]];
- testManager.menuCells = @[textAndImageCell, textAndImageCell2];
- });
-
- it(@"should not send secondaryArtwork in our request for addCommand but send it with addSubMenu", ^{
- SDLAddCommand *cellCommand = (SDLAddCommand *)testManager.inProgressUpdate.firstObject;
- SDLAddSubMenu *cellSubMenu = (SDLAddSubMenu *)testManager.inProgressUpdate[1];
- expect(cellCommand.menuParams.menuName).to(equal(@"Test 2"));
- expect(cellCommand.secondaryImage).to(beNil());
- expect(cellSubMenu.secondaryImage).toNot(beNil());
- });
+ it(@"should not suspend the transaction queue", ^{
+ expect(testManager.transactionQueue.isSuspended).to(beTrue());
});
- // HMI does not support a submenu secondary image
- context(@"HMI does not support a submenu secondary image", ^{
- SDLArtwork *staticArtwork = [[SDLArtwork alloc] initWithStaticIcon:SDLStaticIconNameKey];
-
+ // when entering HMI FULL
+ describe(@"when entering HMI FULL", ^{
beforeEach(^{
- testManager.windowCapability.imageFields = @[commandIconField, submenuIconField, commandSecondaryArtworkField];
- textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:staticArtwork submenuLayout:SDLMenuLayoutList subCells:@[textOnlyCell]];
- textAndImageCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:staticArtwork voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- testManager.menuCells = @[textAndImageCell, textAndImageCell2];
- });
+ SDLOnHMIStatus *onHMIStatus = [[SDLOnHMIStatus alloc] init];
+ onHMIStatus.hmiLevel = SDLHMILevelFull;
+ onHMIStatus.systemContext = SDLSystemContextMain;
- it(@"should not send secondaryArtwork in our request for addSubMenu but send it with addCommand", ^{
- SDLAddSubMenu *cellSubMenu = (SDLAddSubMenu *)testManager.inProgressUpdate.firstObject;
- SDLAddCommand *cellCommand = (SDLAddCommand *)testManager.inProgressUpdate[1];
- expect(cellSubMenu.menuName).to(equal(@"Test 2"));
- expect(cellSubMenu.secondaryImage).to(beNil());
- expect(cellCommand.secondaryImage).toNot(beNil());
- });
- });
-
- // duplicate titles version >= 7.1.0
- context(@"duplicate titles version >= 7.1.0", ^{
- beforeEach(^{
- [SDLGlobals sharedGlobals].rpcVersion = menuUniquenessActiveVersion;
- });
-
- // if there are duplicate cells once you strip unused menu properties
- context(@"if there are duplicate cells once you strip unused menu properties", ^{
- beforeEach(^{
- testManager.windowCapability.textFields = @[];
- testManager.windowCapability.imageFields = @[];
- });
-
- it(@"should update the cells' unique title to include unique data", ^{
- testManager.menuCells = @[textAndImageCell, textAndImageCell2];
- expect(testManager.menuCells).toNot(beEmpty());
- expect(testManager.menuCells.firstObject.uniqueTitle).to(equal("Test 2"));
- expect(testManager.menuCells.lastObject.uniqueTitle).to(equal("Test 2 (2)"));
- });
-
- it(@"should update subcells' unique title to include unique data", ^{
- testManager.menuCells = @[submenuCell2];
- expect(testManager.menuCells).toNot(beEmpty());
- expect(testManager.menuCells.firstObject.subCells.firstObject.uniqueTitle).to(equal("Test 2"));
- expect(testManager.menuCells.firstObject.subCells.lastObject.uniqueTitle).to(equal("Test 2 (2)"));
- });
+ SDLRPCNotificationNotification *testSystemContextNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:onHMIStatus];
+ [[NSNotificationCenter defaultCenter] postNotification:testSystemContextNotification];
});
- // if there are no duplicate cells
- context(@"if there are no duplicate cells", ^{
- it(@"should not update the cells' unique title", ^{
- testManager.menuCells = @[textAndImageCell, textAndImageCell2];
- expect(testManager.menuCells).toNot(beEmpty());
- expect(testManager.menuCells.firstObject.uniqueTitle).to(equal("Test 2"));
- expect(testManager.menuCells.lastObject.uniqueTitle).to(equal("Test 2"));
- });
-
- it(@"should not update subcells' unique title", ^{
- testManager.menuCells = @[submenuCell2];
- expect(testManager.menuCells).toNot(beEmpty());
- expect(testManager.menuCells.firstObject.subCells.firstObject.uniqueTitle).to(equal("Test 2"));
- expect(testManager.menuCells.firstObject.subCells.lastObject.uniqueTitle).to(equal("Test 2"));
- });
+ it(@"should run the transaction queue", ^{
+ expect(testManager.transactionQueue.isSuspended).to(beFalse());
});
});
+ });
- // duplicate titles version <= 7.1.0
- context(@"duplicate titles version <= 7.1.0", ^{
- beforeEach(^{
- [SDLGlobals sharedGlobals].rpcVersion = [[SDLVersion alloc] initWithMajor:7 minor:0 patch:0];
- });
-
- it(@"append a number to the unique text for main menu cells", ^{
- testManager.menuCells = @[textAndImageCell, textAndImageCell2];
- expect(testManager.menuCells).toNot(beEmpty());
- expect(testManager.menuCells.firstObject.uniqueTitle).to(equal("Test 2"));
- expect(testManager.menuCells.lastObject.uniqueTitle).to(equal("Test 2 (2)"));
- });
-
- it(@"should append a number to the unique text for subcells", ^{
- testManager.menuCells = @[submenuCell2];
- expect(testManager.menuCells).toNot(beEmpty());
- expect(testManager.menuCells.firstObject.subCells.firstObject.uniqueTitle).to(equal("Test 2"));
- expect(testManager.menuCells.firstObject.subCells.lastObject.uniqueTitle).to(equal("Test 2 (2)"));
- });
+ context(@"when the HMI is ready", ^{
+ beforeEach(^{
+ testManager.currentHMILevel = SDLHMILevelFull;
+ testManager.currentSystemContext = SDLSystemContextMain;
});
- // when there are complete duplicates
- describe(@"when there are complete duplicates", ^{
- // when the cells contain duplicates
- context(@"when the cells contain duplicates", ^{
- SDLMenuCell *textCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"no", @"yes"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- SDLMenuCell *textCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"no", @"yes"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
-
- it(@"should fail with duplicate cells", ^{
- testManager.menuCells = @[textCell, textCell2];
+ describe(@"setting new menu cells", ^{
+ context(@"containing duplicate titles", ^{
+ it(@"should not start an operation", ^{
+ testManager.menuCells = @[textOnlyCell, textOnlyCell];
expect(testManager.menuCells).to(beEmpty());
+ expect(testManager.transactionQueue.operationCount).to(equal(0));
});
});
- // when cells contain duplicate subcells
- context(@"when cells contain duplicate subcells", ^{
- SDLMenuCell *subCell1 = [[SDLMenuCell alloc] initWithTitle:@"subCell 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- SDLMenuCell *subCell2 = [[SDLMenuCell alloc] initWithTitle:@"subCell 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- SDLMenuCell *textCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[subCell1, subCell2]];
+ context(@"containing duplicate VR commands", ^{
+ SDLMenuCell *textAndVRCell1 = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"Cat", @"Turtle"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *textAndVRCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"Cat", @"Dog"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- it(@"should fail with duplicate cells", ^{
- testManager.menuCells = @[textCell];
+ it(@"should not start an operation", ^{
+ testManager.menuCells = @[textAndVRCell1, textAndVRCell2];
expect(testManager.menuCells).to(beEmpty());
+ expect(testManager.transactionQueue.operationCount).to(equal(0));
});
});
- context(@"duplicate VR commands", ^{
- __block SDLMenuCell *textAndVRCell1 = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"Cat", @"Turtle"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- __block SDLMenuCell *textAndVRCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"Cat", @"Dog"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ context(@"if the new menu cells are identical to the old menu cells", ^{
+ it(@"should queue two transactions and let the operation handle not updating", ^{
+ testManager.menuCells = @[textOnlyCell];
+ testManager.menuCells = @[textOnlyCell];
- it(@"should fail when menu items have duplicate vr commands", ^{
- testManager.menuCells = @[textAndVRCell1, textAndVRCell2];
- expect(testManager.menuCells).to(beEmpty());
+ expect(testManager.menuCells).to(equal(@[textOnlyCell]));
+ expect(testManager.transactionQueue.operationCount).to(equal(2));
});
});
- context(@"when there are duplicate VR commands in subCells", ^{
- SDLMenuCell *textAndVRSubCell1 = [[SDLMenuCell alloc] initWithTitle:@"subCell 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"Cat"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- SDLMenuCell *textAndVRSubCell2 = [[SDLMenuCell alloc] initWithTitle:@"subCell 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- SDLMenuCell *textAndVRCell1 = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[@"Cat", @"Turtle"] handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- SDLMenuCell *textAndVRCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[textAndVRSubCell1, textAndVRSubCell2]];
+ context(@"when a second menu cells update is queued before the first is done", ^{
+ it(@"should cancel the first operation", ^{
+ testManager.menuCells = @[textOnlyCell];
+ testManager.menuCells = @[submenuCell];
- it(@"should fail when menu items have duplicate vr commands", ^{
- testManager.menuCells = @[textAndVRCell1, textAndVRCell2];
- expect(testManager.menuCells).to(beEmpty());
+ expect(testManager.menuCells).to(equal(@[submenuCell]));
+ expect(testManager.transactionQueue.operationCount).to(equal(2));
+ expect(testManager.transactionQueue.operations[0].isCancelled).to(beTrue());
});
});
- });
- // should check if all artworks are uploaded and return NO
- it(@"should check if all artworks are uploaded and return NO", ^{
- textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:testArtwork voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- testManager.menuCells = @[textAndImageCell, textOnlyCell];
- OCMVerify([testManager sdl_shouldRPCsIncludeImages:testManager.menuCells]);
- expect([testManager sdl_shouldRPCsIncludeImages:testManager.menuCells]).to(beFalse());
- });
+ context(@"if cells are formed properly", ^{
+ it(@"should properly prepare and queue the transaction", ^{
+ testManager.menuCells = @[textOnlyCell];
- // should properly update a text cell
- it(@"should properly update a text cell", ^{
- testManager.menuCells = @[textOnlyCell];
+ expect(testManager.transactionQueue.operationCount).to(equal(1));
+ expect(testManager.transactionQueue.operations[0]).to(beAnInstanceOf([SDLMenuReplaceOperation class]));
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
- expect(deletes).to(beEmpty());
+ // Assign proper current menu
+ SDLMenuReplaceOperation *testOp = testManager.transactionQueue.operations[0];
+ expect(testOp.currentMenu).to(haveCount(0));
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
- NSArray *add = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
- expect(add).toNot(beEmpty());
+ // Callback proper current menu
+ testOp.currentMenu = @[textOnlyCell];
+ [testOp finishOperation];
+ expect(testManager.currentMenuCells).to(haveCount(1));
+ });
+ });
});
- // should properly update with subcells
- it(@"should properly update with subcells", ^{
- OCMStub([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]);
- testManager.menuCells = @[submenuCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
-
- NSPredicate *submenuCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
- NSArray *submenus = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:submenuCommandPredicate];
-
- expect(adds).to(haveCount(2));
- expect(submenus).to(haveCount(1));
- });
+ describe(@"updating the menu configuration", ^{
+ beforeEach(^{
+ testManager.currentHMILevel = SDLHMILevelFull;
+ testManager.currentSystemContext = SDLSystemContextMain;
+ });
- // updating with an image
- describe(@"updating with an image", ^{
- context(@"when the image is already on the head unit", ^{
+ context(@"if the connection RPC version is less than 6.0.0", ^{
beforeEach(^{
- OCMStub([mockFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(YES);
- });
-
- it(@"should check if all artworks are uploaded", ^{
- textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork3 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- testManager.menuCells = @[textAndImageCell, textOnlyCell];
- OCMVerify([testManager sdl_shouldRPCsIncludeImages:testManager.menuCells]);
- expect([testManager sdl_shouldRPCsIncludeImages:testManager.menuCells]).to(beTrue());
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithString:@"5.0.0"];
});
- it(@"should properly update an image cell", ^{
- testManager.menuCells = @[textAndImageCell, submenuImageCell];
+ it(@"should not queue a menu configuration update", ^{
+ testManager.menuConfiguration = testMenuConfiguration;
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
- NSArray *add = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
- SDLAddCommand *sentCommand = add.firstObject;
-
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
- NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
- SDLAddSubMenu *sentSubmenu = submenu.firstObject;
-
- expect(add).to(haveCount(1));
- expect(submenu).to(haveCount(1));
- expect(sentCommand.cmdIcon.value).to(equal(testArtwork.name));
- expect(sentSubmenu.menuIcon.value).to(equal(testArtwork2.name));
- OCMReject([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
- });
-
- it(@"should properly overwrite an image cell", ^{
- OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
- textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork3 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
- testManager.menuCells = @[textAndImageCell, submenuImageCell];
- OCMVerify([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
+ expect(testManager.menuConfiguration).toNot(equal(testMenuConfiguration));
+ expect(testManager.transactionQueue.operationCount).to(equal(0));
});
});
- // No longer a valid unit test
- context(@"when the image is not on the head unit", ^{
+ context(@"if the connection RPC version is greater than or equal to 6.0.0", ^{
beforeEach(^{
- testManager.dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeForceOff;
- OCMStub([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]);
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithString:@"6.0.0"];
});
- it(@"should wait till image is on head unit and attempt to update without the image", ^{
- testManager.menuCells = @[textAndImageCell, submenuImageCell];
-
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
- NSArray *add = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
- SDLAddCommand *sentCommand = add.firstObject;
-
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
- NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
- SDLAddSubMenu *sentSubmenu = submenu.firstObject;
-
- expect(add).to(haveCount(1));
- expect(submenu).to(haveCount(1));
- expect(sentCommand.cmdIcon.value).to(beNil());
- expect(sentSubmenu.menuIcon.value).to(beNil());
- });
- });
- });
-
- describe(@"updating when a menu already exists with dynamic updates on", ^{
- beforeEach(^{
- testManager.dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeForceOn;
- OCMStub([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]);
- });
-
- it(@"should send deletes first", ^{
- testManager.menuCells = @[textOnlyCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- testManager.menuCells = @[textAndImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
-
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
-
- expect(deletes).to(haveCount(1));
- expect(adds).to(haveCount(2));
- });
-
- it(@"should send dynamic deletes first then dynamic adds case with 2 submenu cells", ^{
- testManager.menuCells = @[textOnlyCell, submenuCell, submenuImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- testManager.menuCells = @[submenuCell, submenuImageCell, textOnlyCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
-
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
-
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
- NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
-
- expect(deletes).to(haveCount(1));
- expect(adds).to(haveCount(5));
- expect(submenu).to(haveCount(2));
- });
-
- it(@"should send dynamic deletes first then dynamic adds when removing one submenu cell", ^{
- testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
-
- NSPredicate *deleteSubCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteSubMenu class]];
- NSArray *subDeletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteSubCommandPredicate];
-
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
-
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
- NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
-
- expect(deletes).to(haveCount(0));
- expect(subDeletes).to(haveCount(1));
- expect(adds).to(haveCount(5));
- expect(submenu).to(haveCount(2));
- });
-
- it(@"should send dynamic deletes first then dynamic adds when adding one new cell", ^{
- testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ it(@"should should queue a menu configuration update", ^{
+ testManager.menuConfiguration = testMenuConfiguration;
- testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell, textOnlyCell2];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
-
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
-
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
- NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
-
- expect(deletes).to(haveCount(0));
- expect(adds).to(haveCount(6));
- expect(submenu).to(haveCount(2));
- });
-
- it(@"should send dynamic deletes first then dynamic adds when cells stay the same", ^{
- testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+ expect(testManager.menuConfiguration).to(equal(testMenuConfiguration));
+ expect(testManager.transactionQueue.operationCount).to(equal(1));
+ });
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+ context(@"when queueing a second task after the first", ^{
+ it(@"should cancel the first task", ^{
+ testManager.menuConfiguration = testMenuConfiguration;
+ testManager.menuConfiguration = [[SDLMenuConfiguration alloc] initWithMainMenuLayout:SDLMenuLayoutList defaultSubmenuLayout:SDLMenuLayoutList];
- expect(deletes).to(haveCount(0));
- expect(adds).to(haveCount(3));
+ expect(testManager.transactionQueue.operationCount).to(equal(2));
+ expect(testManager.transactionQueue.operations[0].isCancelled).to(beTrue());
+ });
+ });
});
});
- describe(@"updating when a menu already exists with dynamic updates off", ^{
+ describe(@"opening the menu", ^{
beforeEach(^{
- testManager.dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeForceOff;
- OCMStub([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]);
- });
-
- it(@"should send deletes first", ^{
- testManager.menuCells = @[textOnlyCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- testManager.menuCells = @[textAndImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
-
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
-
- expect(deletes).to(haveCount(1));
- expect(adds).to(haveCount(2));
- });
-
- it(@"should deletes first case 2", ^{
- testManager.menuCells = @[textOnlyCell, textAndImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- testManager.menuCells = @[textAndImageCell, textOnlyCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
-
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
-
- expect(deletes).to(haveCount(2));
- expect(adds).to(haveCount(4));
+ testManager.currentHMILevel = SDLHMILevelFull;
+ testManager.currentSystemContext = SDLSystemContextMain;
});
- it(@"should send deletes first case 3", ^{
- testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ context(@"when open menu RPC can be sent", ^{
+ beforeEach(^{
+ SDLVersion *oldVersion = [SDLVersion versionWithMajor:6 minor:0 patch:0];
+ id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
+ OCMStub([globalMock rpcVersion]).andReturn(oldVersion);
+ });
- testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ // should queue an open menu operation for the main menu
+ it(@"should queue an open menu operation for the main menu", ^{
+ BOOL canSendRPC = [testManager openMenu:nil];
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+ expect(testManager.transactionQueue.operationCount).to(equal(1));
+ expect(canSendRPC).to(equal(YES));
+ });
- NSPredicate *deleteSubCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteSubMenu class]];
- NSArray *subDeletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteSubCommandPredicate];
+ // should queue an open menu operation for a submenu cell
+ it(@"should queue an open menu operation for a submenu cell", ^ {
+ testManager.menuCells = @[submenuCell];
+ BOOL canSendRPC = [testManager openMenu:submenuCell];
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+ expect(testManager.transactionQueue.operationCount).to(equal(2));
+ expect(canSendRPC).to(equal(YES));
+ });
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
- NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
+ it(@"should cancel the first task if a second is queued", ^{
+ testManager.menuCells = @[submenuCell];
+ [testManager openMenu:nil];
+ [testManager openMenu:submenuCell];
- expect(deletes).to(haveCount(2));
- expect(subDeletes).to(haveCount(2));
- expect(adds).to(haveCount(9));
- expect(submenu).to(haveCount(3));
+ expect(testManager.transactionQueue.operationCount).to(equal(3));
+ expect(testManager.transactionQueue.operations[1].isCancelled).to(beTrue());
+ });
});
- it(@"should send deletes first case 4", ^{
- testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, textOnlyCell2];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
-
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
-
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+ context(@"when the open menu RPC can not be sent", ^{
+ it(@"should not queue an open menu operation when cell has no subcells", ^ {
+ BOOL canSendRPC = [testManager openMenu:textOnlyCell];
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
- NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
-
- NSPredicate *deleteSubCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteSubMenu class]];
- NSArray *subDeletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteSubCommandPredicate];
+ expect(testManager.transactionQueue.operationCount).to(equal(0));
+ expect(canSendRPC).to(equal(NO));
+ });
- expect(deletes).to(haveCount(2));
- expect(adds).to(haveCount(9));
- expect(submenu).to(haveCount(2));
- expect(subDeletes).to(haveCount(1));
- });
+ it(@"should not queue an open menu operation when RPC version is not at least 6.0.0", ^ {
+ SDLVersion *oldVersion = [SDLVersion versionWithMajor:5 minor:0 patch:0];
+ id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
+ OCMStub([globalMock rpcVersion]).andReturn(oldVersion);
- it(@"should deletes first case 5", ^{
- testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ BOOL canSendRPC = [testManager openMenu:submenuCell];
- testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ expect(testManager.transactionQueue.operationCount).to(equal(0));
+ expect(canSendRPC).to(equal(NO));
+ });
- NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
- NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+ it(@"should not queue an open menu operation when the cell is not in the menu array", ^ {
+ SDLVersion *oldVersion = [SDLVersion versionWithMajor:6 minor:0 patch:0];
+ id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
+ OCMStub([globalMock rpcVersion]).andReturn(oldVersion);
- NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
- NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+ BOOL canSendRPC = [testManager openMenu:submenuCell];
- expect(deletes).to(haveCount(3));
- expect(adds).to(haveCount(6));
+ expect(testManager.transactionQueue.operationCount).to(equal(0));
+ expect(canSendRPC).to(equal(NO));
+ });
});
});
});
@@ -725,8 +331,9 @@ describe(@"menu manager", ^{
cellCalled = YES;
testTriggerSource = triggerSource;
}];
+ cellWithHandler.cellId = 1;
- testManager.menuCells = @[cellWithHandler];
+ testManager.currentMenuCells = @[cellWithHandler];
});
it(@"should call the cell handler", ^{
@@ -748,10 +355,14 @@ describe(@"menu manager", ^{
cellCalled = YES;
testTriggerSource = triggerSource;
}];
+ cellWithHandler.cellId = 2;
SDLMenuCell *submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Submenu" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:SDLMenuLayoutTiles subCells:@[cellWithHandler]];
+ submenuCell.cellId = 1;
+
+ cellWithHandler.parentCellId = 1;
- testManager.menuCells = @[submenuCell];
+ testManager.currentMenuCells = @[submenuCell];
});
it(@"should call the cell handler", ^{
@@ -767,154 +378,6 @@ describe(@"menu manager", ^{
});
});
});
-
- describe(@"updating the menu configuration", ^{
- beforeEach(^{
- testManager.currentHMILevel = SDLHMILevelFull;
- testManager.currentSystemContext = SDLSystemContextMain;
- });
-
- context(@"if the connection RPC version is less than 6.0.0", ^{
- beforeEach(^{
- [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithString:@"5.0.0"];
- });
-
- it(@"should fail to send a SetGlobalProperties RPC update", ^{
- testManager.menuConfiguration = testMenuConfiguration;
-
- expect(testManager.menuConfiguration).toNot(equal(testMenuConfiguration));
- expect(mockConnectionManager.receivedRequests).to(haveCount(0));
- });
- });
-
- context(@"if the connection RPC version is greater than or equal to 6.0.0", ^{
- beforeEach(^{
- [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithString:@"6.0.0"];
- });
-
- it(@"should send a SetGlobalProperties RPC update", ^{
- testManager.menuConfiguration = testMenuConfiguration;
-
- expect(testManager.menuConfiguration).to(equal(testMenuConfiguration));
- expect(mockConnectionManager.receivedRequests).to(haveCount(1));
-
- SDLSetGlobalPropertiesResponse *response = [[SDLSetGlobalPropertiesResponse alloc] init];
- response.success = @YES;
- [mockConnectionManager respondToLastRequestWithResponse:response];
-
- expect(testManager.menuConfiguration).to(equal(testMenuConfiguration));
- });
- });
- });
-
- context(@"when the manager stops", ^{
- beforeEach(^{
- [testManager stop];
- });
-
- it(@"should reset correctly", ^{
- expect(testManager.connectionManager).to(equal(mockConnectionManager));
- expect(testManager.fileManager).to(equal(mockFileManager));
-
- expect(testManager.menuCells).to(beEmpty());
- expect(testManager.currentHMILevel).to(beNil());
- expect(testManager.inProgressUpdate).to(beNil());
- expect(testManager.hasQueuedUpdate).to(beFalse());
- expect(testManager.waitingOnHMIUpdate).to(beFalse());
- expect(testManager.lastMenuId).to(equal(1));
- expect(testManager.oldMenuCells).to(beEmpty());
- expect(testManager.waitingUpdateMenuCells).to(beEmpty());
- expect(testManager.menuConfiguration).toNot(beNil());
- });
- });
-
- describe(@"ShowMenu RPC", ^{
- beforeEach(^{
- testManager.currentHMILevel = SDLHMILevelFull;
- testManager.currentSystemContext = SDLSystemContextMain;
- });
-
- context(@"when open menu RPC can be sent", ^{
- beforeEach(^{
- SDLVersion *oldVersion = [SDLVersion versionWithMajor:6 minor:0 patch:0];
- id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
- OCMStub([globalMock rpcVersion]).andReturn(oldVersion);
- });
-
- it(@"should send showAppMenu RPC", ^{
- BOOL canSendRPC = [testManager openMenu];
-
- NSPredicate *showMenu = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLShowAppMenu class]];
- NSArray *openMenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:showMenu];
-
- expect(mockConnectionManager.receivedRequests).toNot(beEmpty());
- expect(openMenu).to(haveCount(1));
- expect(canSendRPC).to(equal(YES));
- });
-
- it(@"should send showAppMenu RPC with cellID", ^ {
- testManager.menuCells = @[submenuCell];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
- [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
-
- BOOL canSendRPC = [testManager openSubmenu:submenuCell];
-
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLShowAppMenu class]];
- NSArray *openMenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
-
- expect(mockConnectionManager.receivedRequests).toNot(beEmpty());
- expect(openMenu).to(haveCount(1));
- expect(canSendRPC).to(equal(YES));
- });
- });
-
- context(@"when open menu RPC can not be sent", ^{
- it(@"should not send a showAppMenu RPC when cell has no subcells", ^ {
- BOOL canSendRPC = [testManager openSubmenu:textOnlyCell];
-
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLShowAppMenu class]];
- NSArray *openMenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
-
- expect(mockConnectionManager.receivedRequests).to(beEmpty());
- expect(openMenu).to(haveCount(0));
- expect(canSendRPC).to(equal(NO));
- });
-
- it(@"should not send a showAppMenu RPC when RPC verison is not at least 6.0.0", ^ {
- SDLVersion *oldVersion = [SDLVersion versionWithMajor:5 minor:0 patch:0];
- id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
- OCMStub([globalMock rpcVersion]).andReturn(oldVersion);
-
- BOOL canSendRPC = [testManager openSubmenu:submenuCell];
-
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLShowAppMenu class]];
- NSArray *openMenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
-
- expect(mockConnectionManager.receivedRequests).to(beEmpty());
- expect(openMenu).to(haveCount(0));
- expect(canSendRPC).to(equal(NO));
- });
-
- it(@"should not send a showAppMenu RPC when the cell is not in the menu array", ^ {
- SDLVersion *oldVersion = [SDLVersion versionWithMajor:6 minor:0 patch:0];
- id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
- OCMStub([globalMock rpcVersion]).andReturn(oldVersion);
-
- BOOL canSendRPC = [testManager openSubmenu:submenuCell];
-
- NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLShowAppMenu class]];
- NSArray *openMenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
-
- expect(mockConnectionManager.receivedRequests).to(beEmpty());
- expect(openMenu).to(haveCount(0));
- expect(canSendRPC).to(equal(NO));
- });
- });
- });
-
- afterEach(^{
- testManager = nil;
- });
});
QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceOperationSpec.m
new file mode 100644
index 000000000..bb3c662bb
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceOperationSpec.m
@@ -0,0 +1,745 @@
+//
+// SDLMenuReplaceOperationSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 2/16/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+#import <Quick/Quick.h>
+
+#import <SmartDeviceLink/SmartDeviceLink.h>
+#import "SDLGlobals.h"
+#import "SDLMenuReplaceOperation.h"
+#import "SDLMenuManagerPrivateConstants.h"
+#import "SDLMenuReplaceUtilities.h"
+#import "TestConnectionManager.h"
+
+@interface SDLMenuCell ()
+
+@property (assign, nonatomic) UInt32 parentCellId;
+@property (assign, nonatomic) UInt32 cellId;
+@property (strong, nonatomic, readwrite) NSString *uniqueTitle;
+
+@property (copy, nonatomic, readwrite) NSString *title;
+@property (strong, nonatomic, readwrite, nullable) SDLArtwork *icon;
+@property (copy, nonatomic, readwrite, nullable) NSArray<NSString *> *voiceCommands;
+@property (copy, nonatomic, readwrite, nullable) NSString *secondaryText;
+@property (copy, nonatomic, readwrite, nullable) NSString *tertiaryText;
+@property (strong, nonatomic, readwrite, nullable) SDLArtwork *secondaryArtwork;
+@property (copy, nonatomic, readwrite, nullable) NSArray<SDLMenuCell *> *subCells;
+@property (copy, nonatomic, readwrite, nullable) SDLMenuCellSelectionHandler handler;
+
+@end
+
+QuickSpecBegin(SDLMenuReplaceOperationSpec)
+
+describe(@"a menu replace operation", ^{
+ __block SDLMenuReplaceOperation *testOp = nil;
+
+ __block TestConnectionManager *testConnectionManager = nil;
+ __block SDLFileManager *testFileManager = nil;
+ __block SDLMenuConfiguration *testMenuConfiguration = nil;
+ __block NSArray<SDLMenuCell *> *testCurrentMenu = nil;
+ __block NSArray<SDLMenuCell *> *testNewMenu = nil;
+
+ SDLTextField *commandSecondaryTextField = [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuCommandSecondaryText characterSet:SDLCharacterSetUtf8 width:200 rows:1];
+ SDLTextField *commandTertiaryTextField = [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuCommandTertiaryText characterSet:SDLCharacterSetUtf8 width:200 rows:1];
+ SDLTextField *submenuSecondaryTextField = [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuSubMenuSecondaryText characterSet:SDLCharacterSetUtf8 width:200 rows:1];
+ SDLTextField *submenuTertiaryTextField = [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuSubMenuTertiaryText characterSet:SDLCharacterSetUtf8 width:200 rows:1];
+ SDLImageField *commandImageField = [[SDLImageField alloc] initWithName:SDLImageFieldNameCommandIcon imageTypeSupported:@[SDLFileTypePNG] imageResolution:nil];
+ SDLImageField *submenuImageField = [[SDLImageField alloc] initWithName:SDLImageFieldNameSubMenuIcon imageTypeSupported:@[SDLFileTypePNG] imageResolution:nil];
+ __block SDLWindowCapability *testWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@0 textFields:@[commandSecondaryTextField, commandTertiaryTextField, submenuSecondaryTextField, submenuTertiaryTextField] imageFields:@[commandImageField, submenuImageField] imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:nil dynamicUpdateCapabilities:nil keyboardCapabilities:nil];
+ __block SDLWindowCapability *testTitleOnlyWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@0 textFields:@[] imageFields:@[commandImageField, submenuImageField] imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:nil dynamicUpdateCapabilities:nil keyboardCapabilities:nil];
+
+ __block SDLArtwork *testArtwork = nil;
+ __block SDLArtwork *testArtwork2 = nil;
+ __block SDLArtwork *testArtwork3 = nil;
+
+ __block SDLMenuCell *textOnlyCell = nil;
+ __block SDLMenuCell *textOnlyCell2 = nil;
+ __block SDLMenuCell *textAndImageCell = nil;
+ __block SDLMenuCell *submenuCell = nil;
+ __block SDLMenuCell *submenuCellReversed = nil;
+ __block SDLMenuCell *submenuImageCell = nil;
+
+ __block SDLAddCommandResponse *addCommandSuccessResponse = nil;
+ __block SDLAddSubMenuResponse *addSubMenuSuccessResponse = nil;
+ __block SDLDeleteCommandResponse *deleteCommandSuccessResponse = nil;
+ __block SDLDeleteSubMenuResponse *deleteSubMenuSuccessResponse = nil;
+
+ __block NSMutableArray<SDLMenuCell *> *basicCellArray = [NSMutableArray array];
+
+ __block NSArray<SDLMenuCell *> *resultMenuCells = nil;
+ __block NSError *resultError = nil;
+ __block SDLCurrentMenuUpdatedBlock testCurrentMenuUpdatedBlock = nil;
+
+ __block SDLMenuReplaceUtilities *mockReplaceUtilities = nil;
+
+ beforeSuite(^{
+ for (int i = 0; i < 50; i++) {
+ NSString *cellTitle = [NSString stringWithFormat:@"Cell %@", @(i)];
+ [basicCellArray addObject:[[SDLMenuCell alloc] initWithTitle:cellTitle secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:@[cellTitle] handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ NSLog(@"%@ pressed", cellTitle);
+ }]];
+ }
+ });
+
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:7 minor:1 patch:0];
+
+ testArtwork = [[SDLArtwork alloc] initWithData:[@"Test data" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name" fileExtension:@"png" persistent:NO];
+ testArtwork2 = [[SDLArtwork alloc] initWithData:[@"Test data 2" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name 2" fileExtension:@"png" persistent:NO];
+ testArtwork3 = [[SDLArtwork alloc] initWithData:[@"Test data 3" dataUsingEncoding:NSUTF8StringEncoding] name:@"some artwork name" fileExtension:@"png" persistent:NO];
+ testArtwork3.overwrite = YES;
+
+ textOnlyCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ textOnlyCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 5" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Cell with Subcells" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:basicCellArray];
+ submenuCellReversed = [[SDLMenuCell alloc] initWithTitle:@"Cell with Subcells" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:basicCellArray.reverseObjectEnumerator.allObjects];
+ submenuImageCell = [[SDLMenuCell alloc] initWithTitle:@"Cell with Image and Subcell" secondaryText:nil tertiaryText:nil icon:testArtwork2 secondaryArtwork:nil submenuLayout:SDLMenuLayoutTiles subCells:@[textOnlyCell]];
+
+ addCommandSuccessResponse = [[SDLAddCommandResponse alloc] init];
+ addCommandSuccessResponse.success = @YES;
+ addCommandSuccessResponse.resultCode = SDLResultSuccess;
+ addSubMenuSuccessResponse = [[SDLAddSubMenuResponse alloc] init];
+ addSubMenuSuccessResponse.success = @YES;
+ addSubMenuSuccessResponse.resultCode = SDLResultSuccess;
+ deleteCommandSuccessResponse = [[SDLDeleteCommandResponse alloc] init];
+ deleteCommandSuccessResponse.success = @YES;
+ deleteCommandSuccessResponse.resultCode = SDLResultSuccess;
+ deleteSubMenuSuccessResponse = [[SDLDeleteSubMenuResponse alloc] init];
+ deleteSubMenuSuccessResponse.success = @YES;
+ deleteSubMenuSuccessResponse.resultCode = SDLResultSuccess;
+
+ testOp = nil;
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ testFileManager = OCMClassMock([SDLFileManager class]);
+
+ testMenuConfiguration = [[SDLMenuConfiguration alloc] initWithMainMenuLayout:SDLMenuLayoutList defaultSubmenuLayout:SDLMenuLayoutList];
+ testCurrentMenu = @[];
+ testNewMenu = nil;
+
+ resultMenuCells = nil;
+ resultError = nil;
+ testCurrentMenuUpdatedBlock = ^(NSArray<SDLMenuCell *> *currentMenuCells, NSError *error) {
+ resultMenuCells = currentMenuCells;
+ resultError = error;
+ };
+
+ mockReplaceUtilities = OCMClassMock([SDLMenuReplaceUtilities class]);
+ });
+
+ context(@"sending initial batch of cells", ^{
+ context(@"when setting no cells", ^{
+ it(@"should finish without doing anything", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:YES currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ expect(testConnectionManager.receivedRequests).to(beEmpty());
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(beEmpty());
+ });
+ });
+
+ context(@"when starting while cancelled", ^{
+ it(@"should finish without doing anything", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:YES currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp cancel];
+ [testOp start];
+
+ expect(testConnectionManager.receivedRequests).to(beEmpty());
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(beNil());
+ });
+ });
+
+ context(@"when uploading a text-only cell", ^{
+ beforeEach(^{
+ testNewMenu = @[textOnlyCell];
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg any]]).andReturn(NO);
+ });
+
+ it(@"should properly send the RPCs and finish the operation", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:YES currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ OCMReject([testFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+ expect(deletes).to(beEmpty());
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
+ NSArray *add = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+ expect(add).to(haveCount(1));
+
+ [testConnectionManager respondToLastRequestWithResponse:addCommandSuccessResponse];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(1));
+ });
+ });
+
+ context(@"when uploading text and image cell", ^{
+ beforeEach(^{
+ testNewMenu = @[textAndImageCell];
+
+ OCMStub([testFileManager uploadArtworks:[OCMArg any] progressHandler:([OCMArg invokeBlockWithArgs:textAndImageCell.icon.name, @1.0, [NSNull null], nil]) completionHandler:([OCMArg invokeBlockWithArgs: @[textAndImageCell.icon.name], [NSNull null], nil])]);
+ });
+
+ // when the image is already on the head unit
+ context(@"when the image is already on the head unit", ^{
+ beforeEach(^{
+ OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(YES);
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(NO);
+ });
+
+ it(@"should properly update an image cell", ^{
+ OCMReject([testFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+
+
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:YES currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
+ NSArray *add = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+ SDLAddCommand *sentCommand = add.firstObject;
+
+ expect(add).to(haveCount(1));
+ expect(sentCommand.cmdIcon.value).to(equal(testArtwork.name));
+
+ [testConnectionManager respondToLastRequestWithResponse:addCommandSuccessResponse];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(1));
+ });
+ });
+
+ // when the image is not on the head unit
+ context(@"when the image is not on the head unit", ^{
+ beforeEach(^{
+ OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO);
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
+ });
+
+ it(@"should attempt to upload artworks then send the add", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:YES currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ OCMVerify([testFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]);
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLDeleteCommand class]];
+ NSArray *deletesArray = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+ expect(deletesArray).to(beEmpty());
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
+ NSArray *addsArray = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+ expect(addsArray).toNot(beEmpty());
+
+ [testConnectionManager respondToLastRequestWithResponse:addCommandSuccessResponse];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(1));
+ });
+ });
+ });
+
+ context(@"when uploading a cell with subcells", ^{
+ beforeEach(^{
+ testNewMenu = @[submenuCell];
+ });
+
+ it(@"should send an appropriate number of AddSubmenu and AddCommandRequests", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:YES currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ [testConnectionManager respondToLastRequestWithResponse:addSubMenuSuccessResponse];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ NSPredicate *submenuCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
+ NSArray *submenus = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:submenuCommandPredicate];
+
+ expect(adds).to(haveCount(50));
+ expect(submenus).to(haveCount(1));
+
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:2 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(1));
+ expect(resultMenuCells[0].subCells).to(haveCount(2));
+ });
+ });
+ });
+
+ context(@"updating a menu without dynamic updates", ^{
+ describe(@"basic cell updates", ^{
+ context(@"adding a text cell", ^{
+ beforeEach(^{
+ testCurrentMenu = [[NSArray alloc] initWithArray:@[textOnlyCell] copyItems:YES];
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testCurrentMenu parentId:ParentIdNotFound];
+
+ testNewMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, textOnlyCell2] copyItems:YES];
+ });
+
+ it(@"should send a delete and two adds", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:YES currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ [testConnectionManager respondToLastRequestWithResponse:deleteCommandSuccessResponse];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:2 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ expect(deletes).to(haveCount(1));
+ expect(adds).to(haveCount(2));
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(2));
+ expect(resultMenuCells[0]).to(equal(textOnlyCell));
+ expect(resultMenuCells[1]).to(equal(textOnlyCell2));
+ });
+ });
+
+ context(@"when all cells remain the same", ^{
+ beforeEach(^{
+ testCurrentMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, textOnlyCell2, textAndImageCell] copyItems:YES];
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testCurrentMenu parentId:ParentIdNotFound];
+
+ testNewMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, textOnlyCell2, textAndImageCell] copyItems:YES];
+ });
+
+ it(@"should delete all cells and add the new ones", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:YES currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ [testConnectionManager respondToRequestWithResponse:deleteCommandSuccessResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:deleteCommandSuccessResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToRequestWithResponse:deleteCommandSuccessResponse requestNumber:2 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:3 error:nil];
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:4 error:nil];
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:5 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ expect(deletes).to(haveCount(3));
+ expect(adds).to(haveCount(3));
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(3));
+ });
+ });
+ });
+
+ describe(@"unique cell updates", ^{
+ context(@"with cell uniqueness", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:7 minor:1 patch:0];
+ });
+
+ context(@"when cells have the same title but are unique", ^{
+ beforeEach(^{
+ testCurrentMenu = @[];
+
+ SDLMenuCell *textOnlyCellDupe = [textOnlyCell copy];
+ textOnlyCellDupe.secondaryText = @"Secondary Text";
+
+ testNewMenu = @[textOnlyCell, textOnlyCellDupe];
+ });
+
+ it(@"should send the cells unchanged", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:NO currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ expect(deletes).to(haveCount(0));
+ expect(adds).to(haveCount(2));
+
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(2));
+ expect(resultMenuCells[0].uniqueTitle).to(equal(textOnlyCell.uniqueTitle));
+ expect(resultMenuCells[0].secondaryText).to(beNil());
+ expect(resultMenuCells[1].uniqueTitle).to(equal(textOnlyCell.uniqueTitle));
+ expect(resultMenuCells[1].secondaryText).toNot(beNil());
+ });
+ });
+
+ context(@"when cells are unique but are identical when stripped", ^{
+ beforeEach(^{
+ testCurrentMenu = @[];
+
+ SDLMenuCell *textOnlyCellDupe = [textOnlyCell copy];
+ textOnlyCellDupe.secondaryText = @"Secondary Text";
+
+ testNewMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, textOnlyCellDupe] copyItems:YES];
+ });
+
+ it(@"should change the second cell's title", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testTitleOnlyWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:NO currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ expect(deletes).to(haveCount(0));
+ expect(adds).to(haveCount(2));
+
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(2));
+ expect(resultMenuCells[0].uniqueTitle).to(equal(textOnlyCell.uniqueTitle));
+ expect(resultMenuCells[0].secondaryText).to(beNil());
+ expect(resultMenuCells[1].uniqueTitle).toNot(equal(textOnlyCell.uniqueTitle));
+ expect(resultMenuCells[1].secondaryText).toNot(beNil());
+ });
+ });
+ });
+
+ context(@"without cell uniqueness", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:7 minor:0 patch:0];
+ });
+
+ context(@"when cells have the same title but are unique", ^{
+ beforeEach(^{
+ testCurrentMenu = @[];
+
+ SDLMenuCell *textOnlyCellDupe = [textOnlyCell copy];
+ textOnlyCellDupe.secondaryText = @"Secondary Text";
+
+ testNewMenu = @[textOnlyCell, textOnlyCellDupe];
+ });
+
+ it(@"should change the second cell's title", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:NO currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ expect(deletes).to(haveCount(0));
+ expect(adds).to(haveCount(2));
+
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(2));
+ expect(resultMenuCells[0].uniqueTitle).to(equal(textOnlyCell.uniqueTitle));
+ expect(resultMenuCells[0].secondaryText).to(beNil());
+ expect(resultMenuCells[1].uniqueTitle).toNot(equal(textOnlyCell.uniqueTitle));
+ expect(resultMenuCells[1].secondaryText).toNot(beNil());
+ });
+ });
+
+ context(@"when cells are unique but are identical when stripped", ^{
+ beforeEach(^{
+ testCurrentMenu = @[];
+
+ SDLMenuCell *textOnlyCellDupe = [textOnlyCell copy];
+ textOnlyCellDupe.secondaryText = @"Secondary Text";
+
+ testNewMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, textOnlyCellDupe] copyItems:YES];
+ });
+
+ it(@"should change the second cell's title", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testTitleOnlyWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:NO currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ expect(deletes).to(haveCount(0));
+ expect(adds).to(haveCount(2));
+
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(2));
+ expect(resultMenuCells[0].uniqueTitle).to(equal(textOnlyCell.uniqueTitle));
+ expect(resultMenuCells[0].secondaryText).to(beNil());
+ expect(resultMenuCells[1].uniqueTitle).toNot(equal(textOnlyCell.uniqueTitle));
+ expect(resultMenuCells[1].secondaryText).toNot(beNil());
+ });
+ });
+ });
+ });
+ });
+
+ context(@"updating a menu with dynamic updates", ^{
+ context(@"adding a text cell", ^{
+ beforeEach(^{
+ testCurrentMenu = @[textOnlyCell];
+ testNewMenu = @[textOnlyCell, textOnlyCell2];
+ });
+
+ it(@"should only send an add", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:NO currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ expect(deletes).to(haveCount(0));
+ expect(adds).to(haveCount(1));
+
+ [testConnectionManager respondToLastRequestWithResponse:addCommandSuccessResponse];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(2));
+ });
+ });
+
+ context(@"rearranging cells with subcells", ^{
+ beforeEach(^{
+ testCurrentMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, submenuCell, submenuImageCell] copyItems:YES];
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testCurrentMenu parentId:ParentIdNotFound];
+
+ testNewMenu = [[NSArray alloc] initWithArray:@[submenuCell, submenuImageCell, textOnlyCell] copyItems:YES];
+
+ OCMStub([testFileManager uploadArtworks:[OCMArg any] progressHandler:([OCMArg invokeBlockWithArgs:textAndImageCell.icon.name, @1.0, [NSNull null], nil]) completionHandler:([OCMArg invokeBlockWithArgs: @[textAndImageCell.icon.name], [NSNull null], nil])]);
+ });
+
+ it(@"should send dynamic deletes first then dynamic adds case with 2 submenu cells", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:NO currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ // Delete textOnlyCell
+ [testConnectionManager respondToLastRequestWithResponse:deleteCommandSuccessResponse];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ expect(testOp.currentMenu).toNot(contain(textOnlyCell));
+
+ // Add textOnlyCell
+ [testConnectionManager respondToLastRequestWithResponse:addCommandSuccessResponse];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
+ NSArray *submenu = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
+
+ expect(deletes).to(haveCount(1));
+ expect(adds).to(haveCount(1));
+ expect(submenu).to(haveCount(0));
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(3));
+ });
+ });
+
+ context(@"rearranging cells and their subcells", ^{
+ beforeEach(^{
+ testCurrentMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, textAndImageCell, submenuCell] copyItems:YES];
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testCurrentMenu parentId:ParentIdNotFound];
+
+ testNewMenu = [[NSArray alloc] initWithArray:@[submenuCellReversed, textAndImageCell, textOnlyCell] copyItems:YES];
+
+ OCMStub([testFileManager uploadArtworks:[OCMArg any] progressHandler:([OCMArg invokeBlockWithArgs:textAndImageCell.icon.name, @1.0, [NSNull null], nil]) completionHandler:([OCMArg invokeBlockWithArgs: @[textAndImageCell.icon.name], [NSNull null], nil])]);
+ });
+
+ it(@"should sent the correct deletions and additions", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:NO currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ // Delete textOnlyCell and submenuCell
+ expect(testConnectionManager.receivedRequests).to(haveCount(2));
+ expect(testConnectionManager.receivedRequests[0]).to(beAnInstanceOf(SDLDeleteCommand.class));
+ expect(testConnectionManager.receivedRequests[1]).to(beAnInstanceOf(SDLDeleteSubMenu.class));
+
+ [testConnectionManager respondToRequestWithResponse:deleteCommandSuccessResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:deleteSubMenuSuccessResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ expect(testOp.currentMenu).to(haveCount(1));
+
+ // Main Menu Add Command / Add Submenu
+ expect(testConnectionManager.receivedRequests).to(haveCount(4));
+
+ [testConnectionManager respondToRequestWithResponse:addSubMenuSuccessResponse requestNumber:2 error:nil];
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:3 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ expect(testOp.currentMenu).to(haveCount(3));
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *deleteSubCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteSubMenu class]];
+ NSArray *subDeletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteSubCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
+ NSArray *submenu = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
+
+ // Submenu add commands sent
+ expect(deletes).to(haveCount(1));
+ expect(subDeletes).to(haveCount(1));
+ expect(adds).to(haveCount(51));
+ expect(submenu).to(haveCount(1));
+
+ // Respond to all 50 submenu add commands
+ for (NSUInteger i = 0; i < 50; i++) {
+ [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:(i + 4) error:nil];
+ }
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(3));
+ });
+ });
+
+ context(@"removing a cell with subcells", ^{
+ beforeEach(^{
+ testCurrentMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell] copyItems:YES];
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testCurrentMenu parentId:ParentIdNotFound];
+
+ testNewMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, textAndImageCell, submenuCell] copyItems:YES];
+
+ OCMStub([testFileManager uploadArtworks:[OCMArg any] progressHandler:([OCMArg invokeBlockWithArgs:textAndImageCell.icon.name, @1.0, [NSNull null], nil]) completionHandler:([OCMArg invokeBlockWithArgs: @[textAndImageCell.icon.name], [NSNull null], nil])]);
+ });
+
+ it(@"should send one deletion", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:NO currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ // Delete submenuImageCell
+ [testConnectionManager respondToLastRequestWithResponse:deleteSubMenuSuccessResponse];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ expect(testOp.currentMenu).toNot(contain(submenuImageCell));
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *deleteSubCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteSubMenu class]];
+ NSArray *subDeletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteSubCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]];
+ NSArray *submenu = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate];
+
+ expect(deletes).to(haveCount(0));
+ expect(subDeletes).to(haveCount(1));
+ expect(adds).to(haveCount(0));
+ expect(submenu).to(haveCount(0));
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(3));
+ });
+ });
+
+ context(@"when cells remain the same", ^{
+ __block BOOL secondHandlerCalled = NO;
+
+ beforeEach(^{
+ secondHandlerCalled = NO;
+
+ testCurrentMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, textOnlyCell2, textAndImageCell] copyItems:YES];
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testCurrentMenu parentId:ParentIdNotFound];
+
+ textOnlyCell.handler = ^(SDLTriggerSource triggerSource) {
+ secondHandlerCalled = YES;
+ };
+ testNewMenu = [[NSArray alloc] initWithArray:@[textOnlyCell, textOnlyCell2, textAndImageCell] copyItems:YES];
+ });
+
+ it(@"should not send deletes or adds, but should transfer handlers", ^{
+ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:NO currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock];
+ [testOp start];
+
+ NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]];
+ NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate];
+
+ NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]];
+ NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate];
+
+ expect(deletes).to(haveCount(0));
+ expect(adds).to(haveCount(0));
+
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(resultMenuCells).to(haveCount(3));
+
+ resultMenuCells[0].handler(SDLTriggerSourceMenu);
+ expect(secondHandlerCalled).to(beTrue());
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpec.m
new file mode 100644
index 000000000..51f6bca6a
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpec.m
@@ -0,0 +1,532 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLMenuReplaceUtilities.h"
+
+#import "SDLFileManager.h"
+#import "SDLMenuCell.h"
+#import "SDLMenuReplaceUtilitiesSpecHelpers.h"
+#import "SDLMenuManagerPrivateConstants.h"
+#import "SDLWindowCapability.h"
+#import "TestConnectionManager.h"
+
+@interface SDLMenuCell()
+
+@property (assign, nonatomic) UInt32 parentCellId;
+@property (assign, nonatomic) UInt32 cellId;
+@property (copy, nonatomic, readwrite, nullable) NSArray<SDLMenuCell *> *subCells;
+
+@end
+
+@interface SDLMenuReplaceUtilities ()
+
+@property (class, assign, nonatomic) UInt32 nextMenuId;
+
+@end
+
+QuickSpecBegin(SDLMenuReplaceUtilitiesSpec)
+
+__block NSMutableArray<SDLMenuCell *> *testMenuCells = nil;
+__block SDLFileManager *mockFileManager = nil;
+__block SDLWindowCapability *testWindowCapability = nil;
+__block NSArray<SDLTextField *> *allSupportedTextFields = @[
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuCommandSecondaryText characterSet:SDLCharacterSetUtf8 width:100 rows:1],
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuCommandTertiaryText characterSet:SDLCharacterSetUtf8 width:100 rows:1],
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuSubMenuSecondaryText characterSet:SDLCharacterSetUtf8 width:100 rows:1],
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuSubMenuTertiaryText characterSet:SDLCharacterSetUtf8 width:100 rows:1]
+];
+__block NSArray<SDLImageField *> *allSupportedImageFields = @[
+ [[SDLImageField alloc] initWithName:SDLImageFieldNameCommandIcon imageTypeSupported:@[SDLImageTypeDynamic] imageResolution:nil],
+ [[SDLImageField alloc] initWithName:SDLImageFieldNameMenuCommandSecondaryImage imageTypeSupported:@[SDLImageTypeDynamic] imageResolution:nil],
+ [[SDLImageField alloc] initWithName:SDLImageFieldNameSubMenuIcon imageTypeSupported:@[SDLImageTypeDynamic] imageResolution:nil],
+ [[SDLImageField alloc] initWithName:SDLImageFieldNameMenuSubMenuSecondaryImage imageTypeSupported:@[SDLImageTypeDynamic] imageResolution:nil]
+];
+
+describe(@"adding ids", ^{
+ it(@"should properly add ids", ^{
+ SDLMenuReplaceUtilities.nextMenuId = 0;
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.deepMenu;
+
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testMenuCells parentId:ParentIdNotFound];
+
+ expect(testMenuCells[0].cellId).to(equal(1));
+ expect(testMenuCells[1].cellId).to(equal(6));
+ expect(testMenuCells[2].cellId).to(equal(7));
+
+ NSArray<SDLMenuCell *> *subCellList1 = testMenuCells[0].subCells;
+ expect(subCellList1[0].cellId).to(equal(2));
+ expect(subCellList1[0].parentCellId).to(equal(1));
+ expect(subCellList1[1].cellId).to(equal(5));
+ expect(subCellList1[1].parentCellId).to(equal(1));
+
+ NSArray<SDLMenuCell *> *subCell1SubCellList1 = subCellList1[0].subCells;
+ expect(subCell1SubCellList1[0].cellId).to(equal(3));
+ expect(subCell1SubCellList1[0].parentCellId).to(equal(2));
+ expect(subCell1SubCellList1[1].cellId).to(equal(4));
+ expect(subCell1SubCellList1[1].parentCellId).to(equal(2));
+
+ NSArray<SDLMenuCell *> *subCellList2 = testMenuCells[2].subCells;
+ expect(subCellList2[0].cellId).to(equal(8));
+ expect(subCellList2[0].parentCellId).to(equal(7));
+ expect(subCellList2[1].cellId).to(equal(9));
+ expect(subCellList2[1].parentCellId).to(equal(7));
+ });
+});
+
+describe(@"transferring cell ids", ^{
+ it(@"should properly transfer ids and set parent ids", ^{
+ testMenuCells = [[NSMutableArray alloc] initWithArray:SDLMenuReplaceUtilitiesSpecHelpers.deepMenu copyItems:YES];
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testMenuCells parentId:ParentIdNotFound];
+
+ NSArray<SDLMenuCell *> *toCells = [[NSArray alloc] initWithArray:SDLMenuReplaceUtilitiesSpecHelpers.deepMenu copyItems:YES];
+ [SDLMenuReplaceUtilities transferCellIDsFromCells:testMenuCells toCells:toCells];
+
+ // Top-level cells should have same cell ids
+ for (NSUInteger i = 0; i < testMenuCells.count; i++) {
+ expect(toCells[i].cellId).to(equal(testMenuCells[i].cellId));
+ }
+
+ // Sub-cells should _not_ have the same cell ids
+ for (NSUInteger i = 0; i < testMenuCells[0].subCells.count; i++) {
+ expect(toCells[0].subCells[i].cellId).toNot(equal(testMenuCells[0].subCells[i].cellId));
+ }
+
+ // Sub-cells should have proper parent ids
+ for (NSUInteger i = 0; i < testMenuCells[0].subCells.count; i++) {
+ expect(toCells[0].subCells[i].parentCellId).to(equal(toCells[0].cellId));
+ }
+ });
+});
+
+describe(@"transferring cell handlers", ^{
+ __block BOOL cell1HandlerTriggered = NO;
+ __block BOOL cell2HandlerTriggered = NO;
+ beforeEach(^{
+ cell1HandlerTriggered = NO;
+ cell2HandlerTriggered = NO;
+ });
+
+ it(@"should properly transfer cell handlers", ^{
+ SDLMenuCell *cell1 = [[SDLMenuCell alloc] initWithTitle:@"Cell1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ cell1HandlerTriggered = YES;
+ }];
+ SDLMenuCell *cell2 = [[SDLMenuCell alloc] initWithTitle:@"Cell1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {
+ cell2HandlerTriggered = YES;
+ }];
+
+ [SDLMenuReplaceUtilities transferCellHandlersFromCells:@[cell1] toCells:@[cell2]];
+ cell2.handler(SDLTriggerSourceMenu);
+
+ expect(cell1HandlerTriggered).to(beTrue());
+ expect(cell2HandlerTriggered).to(beFalse());
+ });
+});
+
+describe(@"finding all artworks from cells", ^{
+ beforeEach(^{
+ mockFileManager = OCMClassMock([SDLFileManager class]);
+ testWindowCapability = [[SDLWindowCapability alloc] init];
+ });
+
+ context(@"when all the files need to be uploaded", ^{
+ beforeEach(^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(YES);
+ });
+
+ context(@"when the window capability doesn't support the primary image", ^{
+ beforeEach(^{
+ testWindowCapability.textFields = allSupportedTextFields;
+ });
+
+ it(@"should return an empty list of artworks to upload", ^{
+ NSArray<SDLArtwork *> *artworksToUpload = [SDLMenuReplaceUtilities findAllArtworksToBeUploadedFromCells:SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu fileManager:mockFileManager windowCapability:testWindowCapability];
+
+ expect(artworksToUpload).to(beEmpty());
+ });
+ });
+
+ context(@"when the window capability supports primary but not secondary image", ^{
+ beforeEach(^{
+ testWindowCapability.textFields = allSupportedTextFields;
+ testWindowCapability.imageFields = @[allSupportedImageFields[0], allSupportedImageFields[2]];
+ });
+
+ it(@"should only return primary images to upload", ^{
+ NSArray<SDLArtwork *> *artworksToUpload = [SDLMenuReplaceUtilities findAllArtworksToBeUploadedFromCells:SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu fileManager:mockFileManager windowCapability:testWindowCapability];
+
+ expect(artworksToUpload).to(haveCount(2));
+ });
+ });
+
+ context(@"when the window capability supports both images", ^{
+ beforeEach(^{
+ testWindowCapability.textFields = allSupportedTextFields;
+ testWindowCapability.imageFields = allSupportedImageFields;
+ });
+
+ context(@"with a shallow menu", ^{
+ it(@"should only return all images to upload", ^{
+ NSArray<SDLArtwork *> *artworksToUpload = [SDLMenuReplaceUtilities findAllArtworksToBeUploadedFromCells:SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu fileManager:mockFileManager windowCapability:testWindowCapability];
+
+ expect(artworksToUpload).to(haveCount(2));
+ });
+ });
+
+ context(@"with a deep menu", ^{
+ it(@"should only return all images to upload", ^{
+ NSArray<SDLArtwork *> *artworksToUpload = [SDLMenuReplaceUtilities findAllArtworksToBeUploadedFromCells:SDLMenuReplaceUtilitiesSpecHelpers.deepMenu fileManager:mockFileManager windowCapability:testWindowCapability];
+
+ expect(artworksToUpload).to(haveCount(4));
+ });
+ });
+ });
+ });
+
+ context(@"when no files need to be uploaded", ^{
+ beforeEach(^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(NO);
+ });
+
+ context(@"when the window capability supports both images", ^{
+ beforeEach(^{
+ testWindowCapability.textFields = allSupportedTextFields;
+ testWindowCapability.imageFields = allSupportedImageFields;
+ });
+
+ it(@"should not return any images to upload", ^{
+ NSArray<SDLArtwork *> *artworksToUpload = [SDLMenuReplaceUtilities findAllArtworksToBeUploadedFromCells:SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu fileManager:mockFileManager windowCapability:testWindowCapability];
+
+ expect(artworksToUpload).to(beEmpty());
+ });
+ });
+ });
+});
+
+describe(@"retrieving a commandId", ^{
+ context(@"with an AddCommand", ^{
+ it(@"should return the command id", ^{
+ SDLAddCommand *rpc = [[SDLAddCommand alloc] init];
+ rpc.cmdID = @12345;
+ expect([SDLMenuReplaceUtilities commandIdForRPCRequest:rpc]).to(equal(12345));
+ });
+ });
+
+ context(@"with an AddSubMenu", ^{
+ it(@"should return the command id", ^{
+ SDLAddSubMenu *rpc = [[SDLAddSubMenu alloc] init];
+ rpc.menuID = @12345;
+ expect([SDLMenuReplaceUtilities commandIdForRPCRequest:rpc]).to(equal(12345));
+ });
+ });
+
+ context(@"with a DeleteCommand", ^{
+ it(@"should return the command id", ^{
+ SDLDeleteCommand *rpc = [[SDLDeleteCommand alloc] init];
+ rpc.cmdID = @12345;
+ expect([SDLMenuReplaceUtilities commandIdForRPCRequest:rpc]).to(equal(12345));
+ });
+ });
+
+ context(@"with a DeleteSubMenu", ^{
+ it(@"should return the command id", ^{
+ SDLDeleteSubMenu *rpc = [[SDLDeleteSubMenu alloc] init];
+ rpc.menuID = @12345;
+ expect([SDLMenuReplaceUtilities commandIdForRPCRequest:rpc]).to(equal(12345));
+ });
+ });
+
+ context(@"with an Alert", ^{
+ it(@"should return 0", ^{
+ SDLAlert *rpc = [[SDLAlert alloc] init];
+ expect([SDLMenuReplaceUtilities commandIdForRPCRequest:rpc]).to(equal(0));
+ });
+ });
+});
+
+describe(@"retrieving a position", ^{
+ context(@"with an AddCommand", ^{
+ it(@"should return the position", ^{
+ SDLAddCommand *rpc = [[SDLAddCommand alloc] init];
+ rpc.menuParams = [[SDLMenuParams alloc] init];
+ rpc.menuParams.position = @123;
+ expect(@([SDLMenuReplaceUtilities positionForRPCRequest:rpc])).to(equal(@123));
+ });
+ });
+
+ context(@"with an AddSubMenu", ^{
+ it(@"should return the command id", ^{
+ SDLAddSubMenu *rpc = [[SDLAddSubMenu alloc] init];
+ rpc.position = @123;
+ expect(@([SDLMenuReplaceUtilities positionForRPCRequest:rpc])).to(equal(@123));
+ });
+ });
+});
+
+describe(@"generating RPCs", ^{
+ __block SDLMenuLayout testMenuLayout = SDLMenuLayoutList;
+
+ beforeEach(^{
+ mockFileManager = OCMClassMock([SDLFileManager class]);
+ testWindowCapability = [[SDLWindowCapability alloc] init];
+ });
+
+ context(@"delete commands", ^{
+ context(@"shallow menu", ^{
+ beforeEach(^{
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu;
+ });
+
+ it(@"should generate the correct RPCs", ^{
+ NSArray<SDLRPCRequest *> *requests = [SDLMenuReplaceUtilities deleteCommandsForCells:testMenuCells];
+ expect(requests).to(haveCount(3));
+ expect(requests[0]).to(beAnInstanceOf(SDLDeleteCommand.class));
+ expect(requests[1]).to(beAnInstanceOf(SDLDeleteCommand.class));
+ expect(requests[2]).to(beAnInstanceOf(SDLDeleteCommand.class));
+ });
+ });
+
+ context(@"deep menu", ^{
+ beforeEach(^{
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.deepMenu;
+ });
+
+ it(@"should generate the correct RPCs", ^{
+ NSArray<SDLRPCRequest *> *requests = [SDLMenuReplaceUtilities deleteCommandsForCells:testMenuCells];
+ expect(requests).to(haveCount(3));
+ expect(requests[0]).to(beAnInstanceOf(SDLDeleteSubMenu.class));
+ expect(requests[1]).to(beAnInstanceOf(SDLDeleteCommand.class));
+ expect(requests[2]).to(beAnInstanceOf(SDLDeleteSubMenu.class));
+ });
+ });
+ });
+
+ context(@"main menu commands", ^{
+ context(@"shallow menu", ^{
+ beforeEach(^{
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu;
+ });
+
+ it(@"should generate the correct RPCs", ^{
+ NSArray<SDLRPCRequest *> *requests = [SDLMenuReplaceUtilities mainMenuCommandsForCells:testMenuCells fileManager:mockFileManager usingPositionsFromFullMenu:testMenuCells windowCapability:testWindowCapability defaultSubmenuLayout:testMenuLayout];
+ expect(requests).to(haveCount(3));
+ expect(requests[0]).to(beAnInstanceOf(SDLAddCommand.class));
+ expect(requests[1]).to(beAnInstanceOf(SDLAddCommand.class));
+ expect(requests[2]).to(beAnInstanceOf(SDLAddCommand.class));
+ });
+ });
+
+ context(@"deep menu", ^{
+ beforeEach(^{
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.deepMenu;
+ });
+
+ it(@"should generate the correct RPCs", ^{
+ NSArray<SDLRPCRequest *> *requests = [SDLMenuReplaceUtilities mainMenuCommandsForCells:testMenuCells fileManager:mockFileManager usingPositionsFromFullMenu:testMenuCells windowCapability:testWindowCapability defaultSubmenuLayout:testMenuLayout];
+ expect(requests).to(haveCount(3));
+ expect(requests[0]).to(beAnInstanceOf(SDLAddSubMenu.class));
+ expect(requests[1]).to(beAnInstanceOf(SDLAddCommand.class));
+ expect(requests[2]).to(beAnInstanceOf(SDLAddSubMenu.class));
+ });
+ });
+ });
+
+ context(@"sub menu commands", ^{
+ context(@"shallow menu", ^{
+ beforeEach(^{
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu;
+ });
+ });
+
+ context(@"deep menu", ^{
+ beforeEach(^{
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.deepMenu;
+ });
+ });
+ });
+});
+
+// updating menu cells
+describe(@"updating menu cell lists", ^{
+ __block UInt32 testCommandId = 0;
+
+ describe(@"removing commands", ^{
+ context(@"from a shallow list", ^{
+ beforeEach(^{
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu;
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testMenuCells parentId:ParentIdNotFound];
+ });
+
+ context(@"when the cell is in the menu", ^{
+ beforeEach(^{
+ testCommandId = testMenuCells[1].cellId;
+ });
+
+ it(@"should return the menu without the cell and return YES", ^{
+ NSMutableArray<SDLMenuCell *> *testMutableMenuCells = [testMenuCells mutableCopy];
+ BOOL foundItem = [SDLMenuReplaceUtilities removeCellFromList:testMutableMenuCells withCellId:testCommandId];
+
+ expect(foundItem).to(beTrue());
+ expect(testMutableMenuCells).to(haveCount(2));
+ expect(testMutableMenuCells[0]).to(equal(testMenuCells[0]));
+ expect(testMutableMenuCells[1]).to(equal(testMenuCells[2]));
+ });
+ });
+
+ context(@"when the cell is not in the menu", ^{
+ beforeEach(^{
+ testCommandId = 100;
+ });
+
+ it(@"should return the menu with all cells and return NO", ^{
+ NSMutableArray<SDLMenuCell *> *testMutableMenuCells = [testMenuCells mutableCopy];
+ BOOL foundItem = [SDLMenuReplaceUtilities removeCellFromList:testMutableMenuCells withCellId:testCommandId];
+
+ expect(foundItem).to(beFalse());
+ expect(testMutableMenuCells).to(haveCount(3));
+ });
+ });
+ });
+
+ context(@"from a deep list", ^{
+ beforeEach(^{
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.deepMenu;
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testMenuCells parentId:ParentIdNotFound];
+ });
+
+ context(@"when the cell is in the top menu", ^{
+ beforeEach(^{
+ testCommandId = testMenuCells[1].cellId;
+ });
+
+ it(@"should return the menu without the cell and return YES", ^{
+ NSMutableArray<SDLMenuCell *> *testMutableMenuCells = [testMenuCells mutableCopy];
+ BOOL foundItem = [SDLMenuReplaceUtilities removeCellFromList:testMutableMenuCells withCellId:testCommandId];
+
+ expect(foundItem).to(beTrue());
+ expect(testMutableMenuCells).to(haveCount(2));
+ expect(testMutableMenuCells[0]).to(equal(testMenuCells[0]));
+ expect(testMutableMenuCells[1]).to(equal(testMenuCells[2]));
+ });
+ });
+
+ context(@"when the cell is in the submenu", ^{
+ beforeEach(^{
+ testCommandId = testMenuCells[0].subCells[0].cellId;
+ });
+
+ it(@"should return the menu without the cell and return YES", ^{
+ NSMutableArray<SDLMenuCell *> *testMutableMenuCells = [testMenuCells mutableCopy];
+ BOOL foundItem = [SDLMenuReplaceUtilities removeCellFromList:testMutableMenuCells withCellId:testCommandId];
+
+ expect(foundItem).to(beTrue());
+ expect(testMutableMenuCells).to(haveCount(3));
+ expect(testMutableMenuCells[0].subCells).to(haveCount(1));
+ });
+ });
+
+ context(@"when the cell is not in the menu", ^{
+ beforeEach(^{
+ testCommandId = 100;
+ });
+
+ it(@"should return the menu with all cells and return NO", ^{
+ NSMutableArray<SDLMenuCell *> *testMutableMenuCells = [testMenuCells mutableCopy];
+ BOOL foundItem = [SDLMenuReplaceUtilities removeCellFromList:testMutableMenuCells withCellId:testCommandId];
+
+ expect(foundItem).to(beFalse());
+ expect(testMutableMenuCells).to(haveCount(3));
+ expect(testMutableMenuCells[0].subCells).to(haveCount(2));
+ expect(testMutableMenuCells[2].subCells).to(haveCount(2));
+ });
+ });
+ });
+ });
+
+ describe(@"add commands to the main list", ^{
+ __block NSMutableArray<SDLMenuCell *> *newCellList = nil;
+
+ context(@"from a shallow list", ^{
+ beforeEach(^{
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu;
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testMenuCells parentId:ParentIdNotFound];
+
+ SDLMenuCell *newCell = [[SDLMenuCell alloc] initWithTitle:@"New Cell" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ newCell.cellId = 99;
+ newCellList = [@[newCell] mutableCopy];
+ });
+
+ describe(@"if the cell is not in the cell list", ^{
+ beforeEach(^{
+ newCellList = [[NSMutableArray alloc] init];
+ });
+
+ it(@"should return NO", ^{
+ BOOL didAddCell = [SDLMenuReplaceUtilities addCellWithCellId:99 position:0 fromNewMenuList:newCellList toMainMenuList:testMenuCells];
+
+ expect(didAddCell).to(beFalse());
+ });
+ });
+
+ context(@"at the beginning", ^{
+ it(@"should return YES and the cell should be included", ^{
+ BOOL didAddCell = [SDLMenuReplaceUtilities addCellWithCellId:newCellList[0].cellId position:0 fromNewMenuList:newCellList toMainMenuList:testMenuCells];
+
+ expect(didAddCell).to(beTrue());
+ expect(testMenuCells).to(haveCount(4));
+ expect(testMenuCells[0]).to(equal(newCellList[0]));
+ });
+ });
+
+ context(@"in the middle", ^{
+ it(@"should return YES and the cell should be included", ^{
+ BOOL didAddCell = [SDLMenuReplaceUtilities addCellWithCellId:newCellList[0].cellId position:1 fromNewMenuList:newCellList toMainMenuList:testMenuCells];
+
+ expect(didAddCell).to(beTrue());
+ expect(testMenuCells).to(haveCount(4));
+ expect(testMenuCells[1]).to(equal(newCellList[0]));
+ });
+ });
+
+ context(@"at the end", ^{
+ it(@"should return YES and the cell should be included", ^{
+ BOOL didAddCell = [SDLMenuReplaceUtilities addCellWithCellId:newCellList[0].cellId position:3 fromNewMenuList:newCellList toMainMenuList:testMenuCells];
+
+ expect(didAddCell).to(beTrue());
+ expect(testMenuCells).to(haveCount(4));
+ expect(testMenuCells[3]).to(equal(newCellList[0]));
+ });
+ });
+ });
+
+ context(@"from a deep list", ^{
+ __block SDLMenuCell *subCell = nil;
+ __block NSMutableArray<SDLMenuCell *> *newMenu = nil;
+
+ beforeEach(^{
+ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.deepMenu.copy;
+ [SDLMenuReplaceUtilities addIdsToMenuCells:testMenuCells parentId:ParentIdNotFound];
+
+ newMenu = [[NSMutableArray alloc] initWithArray:testMenuCells copyItems:YES];
+ NSMutableArray<SDLMenuCell *> *subMenuToUpdate = newMenu[0].subCells.mutableCopy;
+
+ subCell = [[SDLMenuCell alloc] initWithTitle:@"New SubCell" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ subCell.cellId = 98;
+ subCell.parentCellId = newMenu[0].cellId;
+ [subMenuToUpdate insertObject:subCell atIndex:0];
+ newMenu[0].subCells = subMenuToUpdate.copy;
+ });
+
+ it(@"should properly add the subcell to the list", ^{
+ BOOL didAddCell = [SDLMenuReplaceUtilities addCellWithCellId:newMenu[0].subCells[0].cellId position:0 fromNewMenuList:newMenu toMainMenuList:testMenuCells];
+
+ expect(didAddCell).to(beTrue());
+ expect(testMenuCells).to(haveCount(3));
+ expect(testMenuCells[0].subCells).to(haveCount(3));
+ expect(testMenuCells[0].subCells[0]).to(equal(subCell));
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.h b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.h
new file mode 100644
index 000000000..7106cb567
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.h
@@ -0,0 +1,22 @@
+//
+// SDLMenuReplaceUtilitiesSpecHelpers.h
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 1/29/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLMenuCell;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLMenuReplaceUtilitiesSpecHelpers : NSObject
+
+@property (class, nonatomic, readonly) NSMutableArray<SDLMenuCell *> *topLevelOnlyMenu;
+@property (class, nonatomic, readonly) NSMutableArray<SDLMenuCell *> *deepMenu;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.m
new file mode 100644
index 000000000..c6069d315
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.m
@@ -0,0 +1,70 @@
+//
+// SDLMenuReplaceUtilitiesSpecHelpers.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 1/29/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import "SDLMenuReplaceUtilitiesSpecHelpers.h"
+
+#import "SDLArtwork.h"
+#import "SDLMenuCell.h"
+
+@interface SDLMenuCell()
+
+@property (assign, nonatomic) UInt32 parentCellId;
+@property (assign, nonatomic) UInt32 cellId;
+
+@end
+
+@implementation SDLMenuReplaceUtilitiesSpecHelpers
+
++ (NSMutableArray<SDLMenuCell *> *)topLevelOnlyMenu {
+ NSData *cellArtData = [@"testart" dataUsingEncoding:NSUTF8StringEncoding];
+ NSData *cellArtData2 = [@"testart2" dataUsingEncoding:NSUTF8StringEncoding];
+ SDLArtwork *artwork1 = [[SDLArtwork alloc] initWithData:cellArtData name:@"Test Art 1" fileExtension:@"png" persistent:NO];
+ SDLArtwork *artwork2 = [[SDLArtwork alloc] initWithData:cellArtData2 name:@"Test Art 2" fileExtension:@"png" persistent:NO];
+
+ SDLMenuCell *cell1 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:nil tertiaryText:nil icon:artwork1 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ cell1.cellId = 1;
+
+ SDLMenuCell *cell2 = [[SDLMenuCell alloc] initWithTitle:@"Item 2" secondaryText:nil tertiaryText:nil icon:artwork1 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ cell2.cellId = 2;
+
+ SDLMenuCell *cell3 = [[SDLMenuCell alloc] initWithTitle:@"Item 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:artwork2 voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ cell3.cellId = 3;
+
+ return [@[cell1, cell2, cell3] mutableCopy];
+}
+
++ (NSMutableArray<SDLMenuCell *> *)deepMenu {
+ NSData *cellArtData = [@"testart" dataUsingEncoding:NSUTF8StringEncoding];
+ NSData *cellArtData2 = [@"testart2" dataUsingEncoding:NSUTF8StringEncoding];
+ NSData *cellArtData3 = [@"testart3" dataUsingEncoding:NSUTF8StringEncoding];
+ NSData *cellArtData4 = [@"testart4" dataUsingEncoding:NSUTF8StringEncoding];
+ SDLArtwork *artwork1 = [[SDLArtwork alloc] initWithData:cellArtData name:@"Test Art 1" fileExtension:@"png" persistent:NO];
+ SDLArtwork *artwork2 = [[SDLArtwork alloc] initWithData:cellArtData2 name:@"Test Art 2" fileExtension:@"png" persistent:NO];
+ SDLArtwork *artwork3 = [[SDLArtwork alloc] initWithData:cellArtData3 name:@"Test Art 3" fileExtension:@"png" persistent:NO];
+ SDLArtwork *artwork4 = [[SDLArtwork alloc] initWithData:cellArtData4 name:@"Test Art 4" fileExtension:@"png" persistent:NO];
+
+ SDLMenuCell *subList1SubList1Cell1 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:@"SubItem 1" tertiaryText:@"Sub-SubItem 1" icon:nil secondaryArtwork:artwork3 voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *subList1SubList1Cell2 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:@"SubItem 1" tertiaryText:@"Sub-SubItem 2" icon:artwork1 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ NSArray<SDLMenuCell *> *subList1SubList1 = @[subList1SubList1Cell1, subList1SubList1Cell2];
+
+ SDLMenuCell *subList1Cell1 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:@"SubItem 1" tertiaryText:nil icon:artwork4 secondaryArtwork:nil submenuLayout:nil subCells:subList1SubList1];
+ SDLMenuCell *subList1Cell2 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:@"SubItem 2" tertiaryText:nil icon:artwork2 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ NSArray<SDLMenuCell *> *subList1 = @[subList1Cell1, subList1Cell2];
+
+ SDLMenuCell *subList2Cell1 = [[SDLMenuCell alloc] initWithTitle:@"Item 3" secondaryText:@"SubItem 1" tertiaryText:nil icon:artwork1 secondaryArtwork:artwork4 voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *subList2Cell2 = [[SDLMenuCell alloc] initWithTitle:@"Item 3" secondaryText:@"SubItem 2" tertiaryText:nil icon:artwork1 secondaryArtwork:artwork2 voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ NSArray<SDLMenuCell *> *subList2 = @[subList2Cell1, subList2Cell2];
+
+ SDLMenuCell *topListCell1 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:nil tertiaryText:nil icon:artwork1 secondaryArtwork:nil submenuLayout:nil subCells:subList1];
+ SDLMenuCell *topListCell2 = [[SDLMenuCell alloc] initWithTitle:@"Item 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
+ SDLMenuCell *topListCell3 = [[SDLMenuCell alloc] initWithTitle:@"Item 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:subList2];
+
+ return @[topListCell1, topListCell2, topListCell3].mutableCopy;
+}
+
+@end
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuShowOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuShowOperationSpec.m
new file mode 100644
index 000000000..d79f2b90f
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuShowOperationSpec.m
@@ -0,0 +1,167 @@
+//
+// SDLMenuShowOperationSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 2/16/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+#import <Quick/Quick.h>
+
+#import <SmartDeviceLink/SmartDeviceLink.h>
+#import "SDLMenuShowOperation.h"
+#import "TestConnectionManager.h"
+
+@interface SDLMenuShowOperation ()
+
+@property (strong, nonatomic, nullable) SDLMenuCell *submenuCell;
+
+@end
+
+QuickSpecBegin(SDLMenuShowOperationSpec)
+
+describe(@"the show menu operation", ^{
+ __block SDLMenuShowOperation *testOp = nil;
+ __block TestConnectionManager *testConnectionManager = nil;
+ __block NSError *resultError = nil;
+ __block BOOL callbackCalled = NO;
+
+ beforeEach(^{
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ testOp = [[SDLMenuShowOperation alloc] initWithConnectionManager:testConnectionManager toMenuCell:nil completionHandler:^(NSError * _Nullable error) {
+ resultError = error;
+ callbackCalled = YES;
+ }];
+ resultError = nil;
+ callbackCalled = NO;
+ });
+
+ // opening to the main menu
+ context(@"opening to the main menu", ^{
+ beforeEach(^{
+ [testOp start];
+ });
+
+ it(@"should send the RPC request", ^{
+ expect(testConnectionManager.receivedRequests).to(haveCount(1));
+ });
+
+ // when the response is not SUCCESS or WARNINGS
+ context(@"when the response is not SUCCESS or WARNINGS", ^{
+ beforeEach(^{
+ SDLShowAppMenuResponse *response = [[SDLShowAppMenuResponse alloc] init];
+ response.success = @NO;
+ response.resultCode = SDLResultRejected;
+
+ [testConnectionManager respondToLastRequestWithResponse:response];
+ });
+
+ it(@"should set the error and finish", ^{
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).toNot(beNil());
+ expect(callbackCalled).to(beTrue());
+ });
+ });
+
+ // when the response is SUCCESS
+ context(@"when the response is SUCCESS", ^{
+ beforeEach(^{
+ SDLShowAppMenuResponse *response = [[SDLShowAppMenuResponse alloc] init];
+ response.success = @YES;
+ response.resultCode = SDLResultSuccess;
+
+ [testConnectionManager respondToLastRequestWithResponse:response];
+ });
+
+ it(@"should not set the error and finish", ^{
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(callbackCalled).to(beTrue());
+ });
+ });
+
+ // when the response is WARNINGS
+ context(@"when the response is WARNINGS", ^{
+ beforeEach(^{
+ SDLShowAppMenuResponse *response = [[SDLShowAppMenuResponse alloc] init];
+ response.success = @YES;
+ response.resultCode = SDLResultWarnings;
+
+ [testConnectionManager respondToLastRequestWithResponse:response];
+ });
+
+ it(@"should not set the error and finish", ^{
+ expect(testOp.isFinished).to(beTrue());
+ expect(resultError).to(beNil());
+ expect(callbackCalled).to(beTrue());
+ });
+ });
+ });
+
+ // opening to an inner menu
+ context(@"opening to an inner menu", ^{
+ __block SDLMenuCell *openToCell = nil;
+ __block SDLMenuCell *subcell = nil;
+ beforeEach(^{
+ subcell = [[SDLMenuCell alloc] initWithTitle:@"Subcell" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) { }];
+ openToCell = [[SDLMenuCell alloc] initWithTitle:@"Test submenu" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[subcell]];
+ testOp.submenuCell = openToCell;
+ [testOp start];
+ });
+
+ // when the response is not SUCCESS or WARNINGS
+ context(@"when the response is not SUCCESS or WARNINGS", ^{
+ beforeEach(^{
+ SDLShowAppMenuResponse *response = [[SDLShowAppMenuResponse alloc] init];
+ response.success = @NO;
+ response.resultCode = SDLResultRejected;
+
+ [testConnectionManager respondToLastRequestWithResponse:response];
+ });
+
+ it(@"should set the error and finish", ^{
+ expect(resultError).toNot(beNil());
+ expect(callbackCalled).to(beTrue());
+ expect(testOp.isFinished).to(beTrue());
+ });
+ });
+
+ // when the response is SUCCESS
+ context(@"when the response is SUCCESS", ^{
+ beforeEach(^{
+ SDLShowAppMenuResponse *response = [[SDLShowAppMenuResponse alloc] init];
+ response.success = @YES;
+ response.resultCode = SDLResultSuccess;
+
+ [testConnectionManager respondToLastRequestWithResponse:response];
+ });
+
+ it(@"should not set the error and finish", ^{
+ expect(resultError).to(beNil());
+ expect(callbackCalled).to(beTrue());
+ expect(testOp.isFinished).to(beTrue());
+ });
+ });
+
+ // when the response is WARNINGS
+ context(@"when the response is WARNINGS", ^{
+ beforeEach(^{
+ SDLShowAppMenuResponse *response = [[SDLShowAppMenuResponse alloc] init];
+ response.success = @YES;
+ response.resultCode = SDLResultWarnings;
+
+ [testConnectionManager respondToLastRequestWithResponse:response];
+ });
+
+ it(@"should not set the error and finish", ^{
+ expect(resultError).to(beNil());
+ expect(callbackCalled).to(beTrue());
+ expect(testOp.isFinished).to(beTrue());
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m
deleted file mode 100644
index fc6fdfe00..000000000
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m
+++ /dev/null
@@ -1,417 +0,0 @@
-#import <Quick/Quick.h>
-#import <Nimble/Nimble.h>
-#import <OCMock/OCMock.h>
-
-#import "SDLPreloadChoicesOperation.h"
-
-#import "SDLChoice.h"
-#import "SDLChoiceCell.h"
-#import "SDLCreateInteractionChoiceSet.h"
-#import "SDLDisplayType.h"
-#import "SDLFileManager.h"
-#import "SDLImageField.h"
-#import "SDLImageFieldName.h"
-#import "SDLTextField.h"
-#import "SDLTextFieldName.h"
-#import "SDLWindowCapability.h"
-#import "TestConnectionManager.h"
-
-@interface SDLPreloadChoicesOperation()
-
-@property (strong, nonatomic, nullable) NSMutableArray<NSNumber *> *failedChoiceUploadIDs;
-
-@end
-
-@interface SDLChoiceCell()
-
-@property (assign, nonatomic) UInt16 choiceId;
-
-@end
-
-QuickSpecBegin(SDLPreloadChoicesOperationSpec)
-
-describe(@"a preload choices operation", ^{
- __block TestConnectionManager *testConnectionManager = nil;
- __block SDLFileManager *testFileManager = nil;
- __block SDLPreloadChoicesOperation *testOp = nil;
- __block NSString *testDisplayName = @"SDL_GENERIC";
-
- __block NSData *cellArtData = [@"testart" dataUsingEncoding:NSUTF8StringEncoding];
- __block NSData *cellArtData2 = [@"testart2" dataUsingEncoding:NSUTF8StringEncoding];
-
- __block BOOL hasCalledOperationCompletionHandler = NO;
- __block NSError *resultError = nil;
-
- beforeEach(^{
- resultError = nil;
- hasCalledOperationCompletionHandler = NO;
-
- testConnectionManager = [[TestConnectionManager alloc] init];
- testFileManager = OCMClassMock([SDLFileManager class]);
- });
-
- it(@"should have a priority of 'normal'", ^{
- testOp = [[SDLPreloadChoicesOperation alloc] init];
-
- expect(@(testOp.queuePriority)).to(equal(@(NSOperationQueuePriorityNormal)));
- });
-
- describe(@"running the operation", ^{
- __block SDLWindowCapability *windowCapability = nil;
- beforeEach(^{
- windowCapability = [[SDLWindowCapability alloc] init];
- windowCapability.imageTypeSupported = @[SDLImageTypeStatic, SDLImageTypeDynamic];
- SDLTextField *primaryTextField = [[SDLTextField alloc] init];
- primaryTextField.name = SDLTextFieldNameMenuName;
- windowCapability.textFields = @[primaryTextField];
-
- OCMStub([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]);
- OCMStub([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
- });
-
- context(@"with artworks", ^{
- __block NSOrderedSet<SDLChoiceCell *> *cellsWithArtwork = nil;
- __block NSOrderedSet<SDLChoiceCell *> *cellsWithStaticIcon = nil;
- __block NSString *art1Name = @"Art1Name";
- __block NSString *art2Name = @"Art2Name";
- __block SDLArtwork *cell1Art2 = [[SDLArtwork alloc] initWithData:cellArtData2 name:art1Name fileExtension:@"png" persistent:NO];
-
- beforeEach(^{
- SDLArtwork *cell1Art = [[SDLArtwork alloc] initWithData:cellArtData name:art1Name fileExtension:@"png" persistent:NO];
- SDLChoiceCell *cell1WithArt = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:cell1Art voiceCommands:nil];
-
- SDLArtwork *cell2Art = [[SDLArtwork alloc] initWithData:cellArtData name:art2Name fileExtension:@"png" persistent:NO];
- SDLChoiceCell *cell2WithArtAndSecondary = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:cell2Art secondaryArtwork:cell2Art];
-
- SDLArtwork *staticIconArt = [SDLArtwork artworkWithStaticIcon:SDLStaticIconNameDate];
- SDLChoiceCell *cellWithStaticIcon = [[SDLChoiceCell alloc] initWithText:@"Static Icon" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:staticIconArt secondaryArtwork:nil];
-
- cellsWithArtwork = [[NSOrderedSet alloc] initWithArray:@[cell1WithArt, cell2WithArtAndSecondary]];
- cellsWithStaticIcon = [[NSOrderedSet alloc] initWithArray:@[cellWithStaticIcon]];
- });
-
- context(@"if the menuName is not set", ^{
- it(@"should not send any requests", ^{
- SDLTextField *primaryTextField = [[SDLTextField alloc] init];
- primaryTextField.name = SDLTextFieldNameMenuName;
- windowCapability.textFields = @[];
-
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
-
- NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
-
- expect(receivedRequests).to(haveCount(0));
- });
- });
-
- context(@"only main text capabilities", ^{
- it(@"should skip to preloading cells", ^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
-
- expect(@(testOp.currentState)).to(equal(SDLPreloadChoicesOperationStatePreloadingChoices));
- });
- });
-
- context(@"only main text and image capabilities", ^{
- beforeEach(^{
- SDLImageField *choiceField = [[SDLImageField alloc] init];
- choiceField.name = SDLImageFieldNameChoiceImage;
- windowCapability.imageFields = @[choiceField];
-
- OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO);
-
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
- });
-
- it(@"should upload some artworks", ^{
- OCMVerify([testFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id obj) {
- NSArray<SDLArtwork *> *artworks = (NSArray<SDLArtwork *> *)obj;
- return (artworks.count == 2);
- }] completionHandler:[OCMArg any]]);
- expect(@(testOp.currentState)).to(equal(SDLPreloadChoicesOperationStatePreloadingChoices));
- });
- });
-
- context(@"main text and all image display capabilities", ^{
- beforeEach(^{
- SDLImageField *choiceField = [[SDLImageField alloc] init];
- choiceField.name = SDLImageFieldNameChoiceImage;
- SDLImageField *choiceSecondaryField = [[SDLImageField alloc] init];
- choiceSecondaryField.name = SDLImageFieldNameChoiceSecondaryImage;
-
- windowCapability.imageFields = @[choiceField, choiceSecondaryField];
- });
-
- context(@"when artworks are already on the system", ^{
- beforeEach(^{
- OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(YES);
-
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
- });
-
- it(@"should not upload artworks", ^{
- OCMReject([testFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id obj) {
- NSArray<SDLArtwork *> *artworks = (NSArray<SDLArtwork *> *)obj;
- return (artworks.count == 2);
- }] completionHandler:[OCMArg any]]);
- expect(@(testOp.currentState)).to(equal(SDLPreloadChoicesOperationStatePreloadingChoices));
- });
-
- it(@"should properly overwrite artwork", ^{
- cell1Art2.overwrite = YES;
- SDLChoiceCell *cell1WithArt = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:cell1Art2 voiceCommands:nil];
-
- SDLArtwork *cell2Art = [[SDLArtwork alloc] initWithData:cellArtData name:art2Name fileExtension:@"png" persistent:NO];
- SDLChoiceCell *cell2WithArtAndSecondary = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:cell2Art secondaryArtwork:cell2Art];
-
- SDLArtwork *staticIconArt = [SDLArtwork artworkWithStaticIcon:SDLStaticIconNameDate];
- SDLChoiceCell *cellWithStaticIcon = [[SDLChoiceCell alloc] initWithText:@"Static Icon" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:staticIconArt secondaryArtwork:nil];
-
- cellsWithArtwork = [[NSOrderedSet alloc] initWithArray:@[cell1WithArt, cell2WithArtAndSecondary]];
- cellsWithStaticIcon = [[NSOrderedSet alloc] initWithArray:@[cellWithStaticIcon]];
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
-
- OCMExpect([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
- OCMVerify([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]);
- });
- });
-
- context(@"when artworks are static icons", ^{
- beforeEach(^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithStaticIcon updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
- });
-
- it(@"should skip uploading artwork", ^{
- OCMReject([testFileManager uploadArtwork:[OCMArg any] completionHandler:[OCMArg any]]);
- });
- });
-
- context(@"when artwork are not already on the system", ^{
- beforeEach(^{
- OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO);
-
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
- });
-
- it(@"should upload artworks", ^{
- OCMVerify([testFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id obj) {
- NSArray<SDLArtwork *> *artworks = (NSArray<SDLArtwork *> *)obj;
- return (artworks.count == 3);
- }] completionHandler:[OCMArg any]]);
- expect(@(testOp.currentState)).to(equal(SDLPreloadChoicesOperationStatePreloadingChoices));
- });
- });
- });
- });
-
- context(@"without artworks", ^{
- __block NSOrderedSet<SDLChoiceCell *> *cellsWithoutArtwork = nil;
- beforeEach(^{
- SDLChoiceCell *cellBasic = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:nil voiceCommands:nil];
- SDLChoiceCell *cellWithVR = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:nil tertiaryText:nil voiceCommands:@[@"Cell2"] artwork:nil secondaryArtwork:nil];
- SDLChoiceCell *cellWithAllText = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:@"Cell2" tertiaryText:@"Cell2" voiceCommands:nil artwork:nil secondaryArtwork:nil];
- cellsWithoutArtwork = [[NSOrderedSet alloc] initWithArray:@[cellBasic, cellWithVR, cellWithAllText]];
- });
-
- it(@"should skip to preloading cells", ^{
- expect(@(testOp.currentState)).to(equal(SDLPreloadChoicesOperationStatePreloadingChoices));
- });
-
- describe(@"assembling choices", ^{
- it(@"should be correct with no text and VR required", ^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithoutArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
- NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
-
- expect(receivedRequests).to(haveCount(3));
- expect(receivedRequests.lastObject.choiceSet.firstObject.menuName).toNot(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.secondaryText).to(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.tertiaryText).to(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.vrCommands).toNot(beNil());
- });
-
- it(@"should be correct with only primary text", ^{
- SDLTextField *primaryTextField = [[SDLTextField alloc] init];
- primaryTextField.name = SDLTextFieldNameMenuName;
- windowCapability.textFields = @[primaryTextField];
-
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithoutArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
-
- NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
-
- expect(receivedRequests).to(haveCount(3));
- expect(receivedRequests.lastObject.choiceSet.firstObject.menuName).toNot(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.secondaryText).to(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.tertiaryText).to(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.vrCommands).toNot(beNil());
- });
-
- it(@"should be correct with primary and secondary text", ^{
- SDLTextField *primaryTextField = [[SDLTextField alloc] init];
- primaryTextField.name = SDLTextFieldNameMenuName;
- SDLTextField *secondaryTextField = [[SDLTextField alloc] init];
- secondaryTextField.name = SDLTextFieldNameSecondaryText;
- windowCapability.textFields = @[primaryTextField, secondaryTextField];
-
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithoutArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
-
- NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
-
- expect(receivedRequests).to(haveCount(3));
- expect(receivedRequests.lastObject.choiceSet.firstObject.menuName).toNot(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.secondaryText).toNot(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.tertiaryText).to(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.vrCommands).toNot(beNil());
- });
-
- it(@"should be correct with all text", ^{
- SDLTextField *primaryTextField = [[SDLTextField alloc] init];
- primaryTextField.name = SDLTextFieldNameMenuName;
- SDLTextField *secondaryTextField = [[SDLTextField alloc] init];
- secondaryTextField.name = SDLTextFieldNameSecondaryText;
- SDLTextField *tertiaryTextField = [[SDLTextField alloc] init];
- tertiaryTextField.name = SDLTextFieldNameTertiaryText;
- windowCapability.textFields = @[primaryTextField, secondaryTextField, tertiaryTextField];
-
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithoutArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
-
- NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
-
- expect(receivedRequests).to(haveCount(3));
- expect(receivedRequests.lastObject.choiceSet.firstObject.menuName).toNot(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.secondaryText).toNot(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.tertiaryText).toNot(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.vrCommands).toNot(beNil());
- });
-
- it(@"should be correct with VR optional", ^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:YES cellsToPreload:cellsWithoutArtwork updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
-
- NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
-
- expect(receivedRequests).to(haveCount(3));
- expect(receivedRequests.lastObject.choiceSet.firstObject.menuName).toNot(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.secondaryText).to(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.tertiaryText).to(beNil());
- expect(receivedRequests.lastObject.choiceSet.firstObject.vrCommands).to(beNil());
- });
- });
- });
-
- context(@"updating choices", ^{
- __block SDLChoiceCell *testCell1 = nil;
- __block SDLChoiceCell *testCell2 = nil;
- __block NSOrderedSet<SDLChoiceCell *> *testCells = nil;
-
- beforeEach(^{
- testCell1 = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:nil voiceCommands:nil];
- testCell2 = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:[SDLArtwork artworkWithStaticIcon:SDLStaticIconNameClock]];
- testCells = [[NSOrderedSet alloc] initWithArray:@[testCell1, testCell2]];
- });
-
- describe(@"if a choice item is removed", ^{
- it(@"should be removed if the removal is attempted while the operation is pending", ^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:testCells updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp removeChoicesFromUpload:[NSSet setWithArray:@[testCell1]]];
- [testOp start];
-
- NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
-
- expect(receivedRequests).to(haveCount(1));
- expect(receivedRequests[0].choiceSet[0].menuName).to(equal(testCell2.text));
- });
-
- it(@"should not be removed if the removal is attempted while operation is executing", ^{
- SDLTextField *primaryTextField = [[SDLTextField alloc] init];
- primaryTextField.name = SDLTextFieldNameMenuName;
- windowCapability.textFields = @[primaryTextField];
-
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:testCells updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
- [testOp removeChoicesFromUpload:[NSSet setWithArray:@[testCell1]]];
-
- NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
-
- expect(receivedRequests).to(haveCount(2));
- expect(receivedRequests[0].choiceSet[0].menuName).to(equal(testCell1.text));
- expect(receivedRequests[1].choiceSet[0].menuName).to(equal(testCell2.text));
- });
- });
- });
-
- describe(@"the module's response to choice uploads", ^{
- __block SDLChoiceCell *testCell1 = nil;
- __block SDLChoiceCell *testCell2 = nil;
- __block NSOrderedSet<SDLChoiceCell *> *testCells = nil;
- __block SDLCreateInteractionChoiceSetResponse *testBadResponse = nil;
- __block SDLCreateInteractionChoiceSetResponse *testGoodResponse = nil;
-
- beforeEach(^{
- testCell1 = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:nil voiceCommands:nil];
- testCell1.choiceId = 55;
- testCell2 = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:[SDLArtwork artworkWithStaticIcon:SDLStaticIconNameClock]];
- testCell2.choiceId = 66;
- testCells = [[NSOrderedSet alloc] initWithArray:@[testCell1, testCell2]];
-
- testBadResponse = [[SDLCreateInteractionChoiceSetResponse alloc] init];
- testBadResponse.success = @NO;
- testBadResponse.resultCode = SDLResultRejected;
-
- testGoodResponse = [[SDLCreateInteractionChoiceSetResponse alloc] init];
- testGoodResponse.success = @YES;
- testGoodResponse.resultCode = SDLResultSuccess;
- });
-
- context(@"when a bad response comes back", ^{
- it(@"should add the choiceID of the failed choice item to the failedChoiceUploadIDs array", ^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:testCells updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
-
- NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
-
- expect(receivedRequests).to(haveCount(2));
- expect(receivedRequests[0].choiceSet[0].menuName).to(equal(testCell1.text));
- expect(receivedRequests[1].choiceSet[0].menuName).to(equal(testCell2.text));
-
- [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:0 error:nil];
- [testConnectionManager respondToRequestWithResponse:testBadResponse requestNumber:1 error:[NSError errorWithDomain:SDLErrorDomainChoiceSetManager code:SDLChoiceSetManagerErrorUploadFailed userInfo:nil]];
-
- expect(testOp.failedChoiceUploadIDs.count).to(equal(1));
- expect(testOp.failedChoiceUploadIDs).to(contain(@(testCell2.choiceId)));
- expect(testOp.failedChoiceUploadIDs).toNot(contain(@(testCell1.choiceId)));
- });
- });
-
- context(@"when only good responses comes back", ^{
- it(@"should leave the failedChoiceUploadIDs array empty", ^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:windowCapability isVROptional:NO cellsToPreload:testCells updateCompletionHandler:^(NSArray<NSNumber *> * _Nullable failedChoiceUploadIDs) {}];
- [testOp start];
-
- NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
-
- expect(receivedRequests).to(haveCount(2));
- expect(receivedRequests[0].choiceSet[0].menuName).to(equal(testCell1.text));
- expect(receivedRequests[1].choiceSet[0].menuName).to(equal(testCell2.text));
-
- [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:0 error:nil];
- [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:1 error:nil];
-
- expect(testOp.failedChoiceUploadIDs).to(beEmpty());
- });
- });
- });
- });
-});
-
-QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadPresentChoicesOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadPresentChoicesOperationSpec.m
new file mode 100644
index 000000000..dfb910a99
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadPresentChoicesOperationSpec.m
@@ -0,0 +1,1070 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import <SmartDeviceLink/SmartDeviceLink.h>
+#import "SDLError.h"
+#import "SDLPreloadPresentChoicesOperation.h"
+
+#import "SDLGlobals.h"
+#import "TestConnectionManager.h"
+
+@interface SDLPreloadPresentChoicesOperation()
+
+// Dependencies
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (strong, nonatomic) SDLWindowCapability *windowCapability;
+
+// Preload Dependencies
+@property (strong, nonatomic) NSMutableOrderedSet<SDLChoiceCell *> *cellsToUpload;
+@property (strong, nonatomic) NSString *displayName;
+@property (assign, nonatomic, readwrite, getter=isVROptional) BOOL vrOptional;
+@property (copy, nonatomic) SDLUploadChoicesCompletionHandler preloadCompletionHandler;
+
+// Present Dependencies
+@property (strong, nonatomic) SDLChoiceSet *choiceSet;
+@property (strong, nonatomic, nullable) SDLInteractionMode presentationMode;
+@property (strong, nonatomic, nullable) SDLKeyboardProperties *originalKeyboardProperties;
+@property (strong, nonatomic, nullable) SDLKeyboardProperties *customKeyboardProperties;
+@property (weak, nonatomic, nullable) id<SDLKeyboardDelegate> keyboardDelegate;
+@property (assign, nonatomic) UInt16 cancelId;
+
+// Internal operation properties
+@property (strong, nonatomic) NSUUID *operationId;
+@property (copy, nonatomic, nullable) NSError *internalError;
+
+// Mutable state
+@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *mutableLoadedCells;
+
+@end
+
+@interface SDLChoiceCell()
+
+@property (assign, nonatomic) UInt16 choiceId;
+@property (assign, nonatomic) NSUInteger uniqueTextId;
+
+@end
+
+QuickSpecBegin(SDLPreloadPresentChoicesOperationSpec)
+
+describe(@"a preload choices operation", ^{
+ __block TestConnectionManager *testConnectionManager = nil;
+ __block SDLFileManager *testFileManager = nil;
+ __block SDLPreloadPresentChoicesOperation *testOp = nil;
+ __block NSString *testDisplayName = @"SDL_GENERIC";
+ __block SDLVersion *choiceSetUniquenessActiveVersion = [[SDLVersion alloc] initWithMajor:7 minor:1 patch:0];
+ __block SDLVersion *choiceSetUniquenessInactiveVersion = [[SDLVersion alloc] initWithMajor:7 minor:0 patch:0];
+
+ __block SDLWindowCapability *enabledWindowCapability = nil;
+ __block SDLWindowCapability *disabledWindowCapability = nil;
+ __block SDLWindowCapability *primaryTextOnlyCapability = nil;
+
+ __block NSSet<SDLChoiceCell *> *emptyLoadedCells = [NSSet set];
+ __block NSArray<SDLChoiceCell *> *cellsWithArtwork = nil;
+ __block NSArray<SDLChoiceCell *> *cellsWithStaticIcon = nil;
+ __block NSArray<SDLChoiceCell *> *cellsWithoutArtwork = nil;
+
+ __block NSData *cellArtData = [@"testart" dataUsingEncoding:NSUTF8StringEncoding];
+ __block NSData *cellArtData2 = [@"testart2" dataUsingEncoding:NSUTF8StringEncoding];
+ __block NSString *art1Name = @"Art1Name";
+ __block NSString *art2Name = @"Art2Name";
+ SDLArtwork *cell1Art = [[SDLArtwork alloc] initWithData:cellArtData name:art1Name fileExtension:@"png" persistent:NO];
+ SDLArtwork *cell1Art2 = [[SDLArtwork alloc] initWithData:cellArtData2 name:art1Name fileExtension:@"png" persistent:NO];
+ SDLArtwork *cell2Art = [[SDLArtwork alloc] initWithData:cellArtData name:art2Name fileExtension:@"png" persistent:NO];
+
+ __block SDLChoiceCell *cellBasic = nil;
+ __block SDLChoiceCell *cellBasicDuplicate = nil;
+ __block SDLChoiceCell *cellWithVR = nil;
+ __block SDLChoiceCell *cellWithAllText = nil;
+
+ __block SDLCreateInteractionChoiceSetResponse *testBadResponse = nil;
+ __block SDLCreateInteractionChoiceSetResponse *testGoodResponse = nil;
+
+ __block NSSet<SDLChoiceCell *> *resultChoices = nil;
+ __block NSError *resultPreloadError = nil;
+
+ __block SDLChoiceSet *testChoiceSet = nil;
+ __block int testCancelID = 98;
+ __block SDLInteractionMode testInteractionMode = SDLInteractionModeBoth;
+ __block SDLKeyboardProperties *testKeyboardProperties = nil;
+ __block id<SDLKeyboardDelegate> testKeyboardDelegate = nil;
+ __block id<SDLChoiceSetDelegate> testChoiceDelegate = nil;
+
+ beforeEach(^{
+ resultPreloadError = nil;
+ resultChoices = nil;
+
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ testFileManager = OCMClassMock([SDLFileManager class]);
+ OCMStub([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]);
+ OCMStub([testFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
+
+ enabledWindowCapability = [[SDLWindowCapability alloc] init];
+ enabledWindowCapability.textFields = @[
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuName characterSet:SDLCharacterSetUtf8 width:500 rows:1],
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameSecondaryText characterSet:SDLCharacterSetUtf8 width:500 rows:1],
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameTertiaryText characterSet:SDLCharacterSetUtf8 width:500 rows:1]
+ ];
+ enabledWindowCapability.imageFields = @[
+ [[SDLImageField alloc] initWithName:SDLImageFieldNameChoiceImage imageTypeSupported:@[SDLFileTypePNG] imageResolution:nil],
+ [[SDLImageField alloc] initWithName:SDLImageFieldNameChoiceSecondaryImage imageTypeSupported:@[SDLFileTypePNG] imageResolution:nil]
+ ];
+ disabledWindowCapability = [[SDLWindowCapability alloc] init];
+ disabledWindowCapability.textFields = @[];
+ primaryTextOnlyCapability = [[SDLWindowCapability alloc] init];
+ primaryTextOnlyCapability.textFields = @[
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuName characterSet:SDLCharacterSetUtf8 width:500 rows:1],
+ ];
+
+ SDLChoiceCell *cell1WithArt = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:cell1Art voiceCommands:nil];
+ cell1WithArt.choiceId = 1;
+ SDLChoiceCell *cell2WithArtAndSecondary = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:cell2Art secondaryArtwork:cell2Art];
+ cell2WithArtAndSecondary.choiceId = 2;
+
+ SDLArtwork *staticIconArt = [SDLArtwork artworkWithStaticIcon:SDLStaticIconNameDate];
+ SDLChoiceCell *cellWithStaticIcon = [[SDLChoiceCell alloc] initWithText:@"Static Icon" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:staticIconArt secondaryArtwork:nil];
+ cellWithStaticIcon.choiceId = 3;
+
+ cellsWithArtwork = @[cell1WithArt, cell2WithArtAndSecondary];
+ cellsWithStaticIcon = @[cellWithStaticIcon];
+
+ cellBasic = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:nil voiceCommands:nil];
+ cellBasic.choiceId = 4;
+ cellBasicDuplicate = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:nil voiceCommands:nil];
+ cellBasicDuplicate.choiceId = 5;
+ cellWithVR = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:nil tertiaryText:nil voiceCommands:@[@"Cell2"] artwork:nil secondaryArtwork:nil];
+ cellWithVR.choiceId = 6;
+ cellWithAllText = [[SDLChoiceCell alloc] initWithText:@"Cell2" secondaryText:@"Cell2" tertiaryText:@"Cell2" voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ cellWithAllText.choiceId = 7;
+ cellsWithoutArtwork = @[cellBasic, cellWithVR, cellWithAllText];
+
+ testBadResponse = [[SDLCreateInteractionChoiceSetResponse alloc] init];
+ testBadResponse.success = @NO;
+ testBadResponse.resultCode = SDLResultRejected;
+
+ testGoodResponse = [[SDLCreateInteractionChoiceSetResponse alloc] init];
+ testGoodResponse.success = @YES;
+ testGoodResponse.resultCode = SDLResultSuccess;
+
+ testChoiceDelegate = OCMProtocolMock(@protocol(SDLChoiceSetDelegate));
+ testKeyboardDelegate = OCMProtocolMock(@protocol(SDLKeyboardDelegate));
+ OCMStub([testKeyboardDelegate customKeyboardConfiguration]).andReturn(nil);
+ testKeyboardProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageArSa keyboardLayout:SDLKeyboardLayoutAZERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil maskInputCharacters:nil customKeys:nil];
+ testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:@"Choice Set" delegate:testChoiceDelegate layout:SDLChoiceSetLayoutTiles timeout:8.0 initialPromptString:@"Initial Prompt" timeoutPromptString:@"Timeout Prompt" helpPromptString:@"Help Prompt" vrHelpList:nil choices:cellsWithoutArtwork];
+ });
+
+ it(@"should have a priority of 'normal'", ^{
+ testOp = [[SDLPreloadPresentChoicesOperation alloc] init];
+
+ expect(@(testOp.queuePriority)).to(equal(@(NSOperationQueuePriorityNormal)));
+ });
+
+ context(@"running a preload only operation", ^{
+ describe(@"updating cells for uniqueness", ^{
+ beforeEach(^{
+ testOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:enabledWindowCapability isVROptional:YES cellsToPreload:@[cellWithVR] loadedCells:[NSSet setWithArray:@[cellWithAllText]] preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {}];
+ });
+
+ context(@"when some choices are already uploaded with duplicate titles version >= 7.1.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = choiceSetUniquenessActiveVersion;
+ });
+
+ context(@"if there are duplicate cells once you strip unused cell properties", ^{
+ beforeEach(^{
+ SDLChoiceCell *loadedCell1 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Loaded 1" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ SDLChoiceCell *loadedCell2 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Loaded 2" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ loadedCell2.uniqueTextId = 3;
+ SDLChoiceCell *loadedCell3 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Loaded 3" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ loadedCell3.uniqueTextId = 5;
+
+ SDLChoiceCell *cellToUpload1 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique 1" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ SDLChoiceCell *cellToUpload2 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique 2" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ SDLChoiceCell *cellToUpload3 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique 3" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ SDLChoiceCell *cellToUpload4 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique 4" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+
+ testOp.windowCapability = primaryTextOnlyCapability;
+ testOp.loadedCells = [NSSet setWithArray:@[loadedCell1, loadedCell2, loadedCell3]];
+ testOp.cellsToUpload = [NSMutableOrderedSet orderedSetWithArray:@[cellToUpload1, cellToUpload2, cellToUpload3, cellToUpload4]];
+ [testOp start];
+ });
+
+ it(@"should properly assign unique text", ^{
+ expect(testOp.cellsToUpload[0].uniqueText).to(equal(@"Cell 2 (2)"));
+ expect(testOp.cellsToUpload[1].uniqueText).to(equal(@"Cell 2 (4)"));
+ expect(testOp.cellsToUpload[2].uniqueText).to(equal(@"Cell 2 (6)"));
+ expect(testOp.cellsToUpload[3].uniqueText).to(equal(@"Cell 2 (7)"));
+ expect(testOp.cellsToUpload[0].secondaryText).toNot(beNil());
+ });
+ });
+
+ context(@"if all cell properties are used", ^{
+ beforeEach(^{
+ testOp.windowCapability = enabledWindowCapability;
+ [testOp start];
+ });
+
+ it(@"should not update the choiceCells' unique title", ^{
+ expect(testOp.cellsToUpload[0].uniqueText).to(equal("Cell2"));
+ expect(testOp.cellsToUpload.count).to(equal(1));
+ });
+ });
+ });
+
+ context(@"when some choices are already uploaded with duplicate titles version <= 7.1.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = choiceSetUniquenessInactiveVersion;
+ });
+
+ context(@"if all cell properties are used", ^{
+ beforeEach(^{
+ testOp.windowCapability = enabledWindowCapability;
+ [testOp start];
+ });
+
+ it(@"should update the choiceCells' unique title", ^{
+ expect(testOp.cellsToUpload[0].uniqueText).to(equal("Cell2 (2)"));
+ expect(testOp.cellsToUpload.count).to(equal(1));
+ });
+ });
+ });
+ });
+
+ context(@"with artworks", ^{
+ context(@"only primary text allowed", ^{
+ it(@"should skip loading artworks to preloading cells", ^{
+ testOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:primaryTextOnlyCapability isVROptional:YES cellsToPreload:cellsWithArtwork loadedCells:emptyLoadedCells preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
+ resultPreloadError = error;
+ resultChoices = updatedLoadedCells;
+ }];
+ [testOp start];
+
+ for (SDLRPCRequest *request in testConnectionManager.receivedRequests) {
+ expect(request).toNot(beAnInstanceOf(SDLPutFile.class));
+ }
+ expect(testConnectionManager.receivedRequests).to(haveCount(2));
+ });
+ });
+
+ context(@"all text and image display capabilities", ^{
+ beforeEach(^{
+ testOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:enabledWindowCapability isVROptional:YES cellsToPreload:cellsWithArtwork loadedCells:emptyLoadedCells preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
+ resultPreloadError = error;
+ resultChoices = updatedLoadedCells;
+ }];
+ });
+
+ context(@"when artworks are already on the system", ^{
+ beforeEach(^{
+ OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(YES);
+ });
+
+ it(@"should not upload artworks", ^{
+ OCMReject([testFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id obj) {
+ NSArray<SDLArtwork *> *artworks = (NSArray<SDLArtwork *> *)obj;
+ return (artworks.count == 2);
+ }] completionHandler:[OCMArg any]]);
+
+ [testOp start];
+
+ OCMVerifyAll(testFileManager);
+ });
+
+ it(@"should properly overwrite artwork", ^{
+ cell1Art2.overwrite = YES;
+ SDLChoiceCell *cellOverwriteArt = [[SDLChoiceCell alloc] initWithText:@"Cell1" artwork:cell1Art2 voiceCommands:nil];
+
+ testOp.cellsToUpload = [NSMutableOrderedSet orderedSetWithArray:@[cellOverwriteArt]];
+ [testOp start];
+
+ OCMVerify([testFileManager uploadArtworks:[OCMArg isNotNil] completionHandler:[OCMArg any]]);
+ });
+ });
+
+ context(@"when artworks are static icons", ^{
+ beforeEach(^{
+ testOp.cellsToUpload = [NSMutableOrderedSet orderedSetWithArray:cellsWithStaticIcon];
+ [testOp start];
+ });
+
+ it(@"should skip uploading artwork", ^{
+ OCMReject([testFileManager uploadArtwork:[OCMArg any] completionHandler:[OCMArg any]]);
+ });
+ });
+
+ context(@"when artworks are not already on the system", ^{
+ beforeEach(^{
+ OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO);
+ });
+
+ context(@"when there's more than one of the same artwork", ^{
+ beforeEach(^{
+ testOp.cellsToUpload = [NSMutableOrderedSet orderedSetWithArray:@[
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" artwork:cell1Art voiceCommands:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 2" artwork:cell1Art voiceCommands:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 3" artwork:cell1Art voiceCommands:nil],
+ ]];
+ testOp.loadedCells = [NSSet set];
+ });
+
+ it(@"should only attempt to upload one of each art", ^{
+ [testOp start];
+ OCMVerify([testFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id obj) {
+ NSArray<SDLArtwork *> *artworks = (NSArray<SDLArtwork *> *)obj;
+ return (artworks.count == 1);
+ }] completionHandler:[OCMArg any]]);
+ });
+ });
+
+ context(@"when uploading unique art", ^{
+ beforeEach(^{
+ testOp.cellsToUpload = [NSMutableOrderedSet orderedSetWithArray:cellsWithArtwork];
+ testOp.loadedCells = [NSSet set];
+ });
+
+ it(@"should upload artworks", ^{
+ [testOp start];
+ OCMVerify([testFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id obj) {
+ NSArray<SDLArtwork *> *artworks = (NSArray<SDLArtwork *> *)obj;
+ return (artworks.count == 2);
+ }] completionHandler:[OCMArg any]]);
+ });
+ });
+ });
+ });
+ });
+
+ context(@"without artworks", ^{
+ describe(@"only main text capabilities", ^{
+ it(@"should skip loading artworks to preloading cells", ^{
+ testOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:primaryTextOnlyCapability isVROptional:YES cellsToPreload:cellsWithArtwork loadedCells:emptyLoadedCells preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
+ resultPreloadError = error;
+ resultChoices = updatedLoadedCells;
+ }];
+ [testOp start];
+
+ for (SDLRPCRequest *request in testConnectionManager.receivedRequests) {
+ expect(request).toNot(beAnInstanceOf(SDLPutFile.class));
+ }
+ expect(testConnectionManager.receivedRequests).to(haveCount(2));
+ });
+ });
+
+ describe(@"assembling choices", ^{
+ beforeEach(^{
+ testOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:enabledWindowCapability isVROptional:YES cellsToPreload:cellsWithoutArtwork loadedCells:emptyLoadedCells preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
+ resultChoices = updatedLoadedCells;
+ resultPreloadError = error;
+ }];
+ });
+
+ it(@"should skip preloading the choices if all choice items have already been uploaded", ^{
+ testOp.loadedCells = [NSSet setWithArray:cellsWithoutArtwork];
+ [testOp start];
+
+ expect(testConnectionManager.receivedRequests).to(haveCount(0));
+ });
+
+ it(@"should not send any requests if all items are disabled", ^{
+ testOp.windowCapability = disabledWindowCapability;
+ [testOp start];
+
+ expect(testConnectionManager.receivedRequests).to(haveCount(0));
+ });
+
+ it(@"should be correct with only primary text", ^{
+ testOp.windowCapability = primaryTextOnlyCapability;
+ [testOp start];
+
+ NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
+
+ expect(receivedRequests).to(haveCount(3));
+
+ SDLChoice *representativeItem = receivedRequests.lastObject.choiceSet.firstObject;
+ expect(representativeItem.menuName).toNot(beNil());
+ expect(representativeItem.secondaryText).to(beNil());
+ expect(representativeItem.tertiaryText).to(beNil());
+ });
+
+ it(@"should be correct with all text", ^{
+ SDLWindowCapability *allTextCapability = [enabledWindowCapability copy];
+ allTextCapability.imageFields = @[];
+ testOp.windowCapability = allTextCapability;
+ [testOp start];
+
+ NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
+
+ expect(receivedRequests).to(haveCount(3));
+
+ SDLChoice *representativeItem = receivedRequests.lastObject.choiceSet.firstObject;
+ expect(representativeItem.menuName).toNot(beNil());
+ expect(representativeItem.secondaryText).toNot(beNil());
+ expect(representativeItem.tertiaryText).toNot(beNil());
+ });
+
+ it(@"should be correct with VR required", ^{
+ testOp.vrOptional = NO;
+ [testOp start];
+
+ NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
+
+ expect(receivedRequests).to(haveCount(3));
+
+ // The last item has no VR
+ SDLChoice *representativeItem = receivedRequests.lastObject.choiceSet.firstObject;
+ expect(representativeItem.vrCommands).toNot(beNil());
+ });
+
+ it(@"should be correct with VR Optional", ^{
+ testOp.vrOptional = YES;
+ [testOp start];
+
+ NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
+
+ expect(receivedRequests).to(haveCount(3));
+
+ // The middle item is the one with VR
+ SDLChoice *representativeItem = receivedRequests.lastObject.choiceSet.firstObject;
+ expect(representativeItem.vrCommands).to(beNil());
+ });
+ });
+ });
+
+ describe(@"the module's response to choice uploads", ^{
+ context(@"when a bad response comes back", ^{
+ beforeEach(^{
+ testOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:primaryTextOnlyCapability isVROptional:YES cellsToPreload:cellsWithoutArtwork loadedCells:emptyLoadedCells preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
+ resultChoices = updatedLoadedCells;
+ resultPreloadError = error;
+ }];
+ });
+
+ it(@"should not add the item to the list of loaded cells", ^{
+ [testOp start];
+
+ NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
+
+ expect(receivedRequests).to(haveCount(3));
+ expect(receivedRequests[0].choiceSet[0].menuName).to(equal(cellsWithoutArtwork[0].uniqueText));
+ expect(receivedRequests[1].choiceSet[0].menuName).to(equal(cellsWithoutArtwork[1].uniqueText));
+ expect(receivedRequests[2].choiceSet[0].menuName).to(equal(cellsWithoutArtwork[2].uniqueText));
+
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:testBadResponse requestNumber:1 error:[NSError errorWithDomain:SDLErrorDomainChoiceSetManager code:SDLChoiceSetManagerErrorUploadFailed userInfo:nil]];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:NO];
+
+ expect(testOp.loadedCells).to(haveCount(1));
+ expect(testOp.loadedCells).to(contain(cellsWithoutArtwork[0]));
+ expect(testOp.loadedCells).toNot(contain(cellsWithoutArtwork[1]));
+ expect(testOp.error).toNot(beNil());
+ expect(resultChoices).toNot(beNil());
+ expect(resultPreloadError).toNot(beNil());
+ });
+ });
+
+ context(@"when only good responses comes back", ^{
+ beforeEach(^{
+ testOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:testDisplayName windowCapability:primaryTextOnlyCapability isVROptional:YES cellsToPreload:cellsWithoutArtwork loadedCells:emptyLoadedCells preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
+ resultChoices = updatedLoadedCells;
+ resultPreloadError = error;
+ }];
+ });
+
+ it(@"should add all the items to the list of loaded cells", ^{
+ [testOp start];
+
+ NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
+
+ expect(receivedRequests).to(haveCount(3));
+ expect(receivedRequests[0].choiceSet[0].menuName).to(equal(cellsWithoutArtwork[0].uniqueText));
+ expect(receivedRequests[1].choiceSet[0].menuName).to(equal(cellsWithoutArtwork[1].uniqueText));
+ expect(receivedRequests[2].choiceSet[0].menuName).to(equal(cellsWithoutArtwork[2].uniqueText));
+
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:2 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ expect(testOp.loadedCells).to(haveCount(3));
+ expect(testOp.loadedCells).to(contain(cellsWithoutArtwork[0]));
+ expect(testOp.loadedCells).to(contain(cellsWithoutArtwork[1]));
+ expect(testOp.loadedCells).to(contain(cellsWithoutArtwork[2]));
+ expect(resultPreloadError).to(beNil());
+ expect(resultChoices).to(haveCount(3));
+ });
+ });
+ });
+ });
+
+ context(@"running a preload and present operation", ^{
+ beforeEach(^{
+ testOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:testKeyboardProperties keyboardDelegate:testKeyboardDelegate cancelID:testCancelID displayName:testDisplayName windowCapability:enabledWindowCapability isVROptional:YES loadedCells:emptyLoadedCells preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
+ resultChoices = updatedLoadedCells;
+ resultPreloadError = error;
+ }];
+ });
+
+ describe(@"updating cells for uniqueness", ^{
+ beforeEach(^{
+ testOp = [[SDLPreloadPresentChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager choiceSet:[[SDLChoiceSet alloc] initWithTitle:@"Test Choice Set" delegate:testChoiceDelegate choices:@[cellWithVR]] mode:testInteractionMode keyboardProperties:testKeyboardProperties keyboardDelegate:testKeyboardDelegate cancelID:testCancelID displayName:testDisplayName windowCapability:enabledWindowCapability isVROptional:YES loadedCells:[NSSet setWithArray:@[cellWithAllText]] preloadCompletionHandler:^(NSSet<SDLChoiceCell *> * _Nonnull updatedLoadedCells, NSError * _Nullable error) {
+ resultChoices = updatedLoadedCells;
+ resultPreloadError = error;
+ }];
+ });
+
+ context(@"when some choices are already uploaded with duplicate titles version >= 7.1.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = choiceSetUniquenessActiveVersion;
+ });
+
+ context(@"if there are duplicate cells once you strip unused cell properties", ^{
+ beforeEach(^{
+ SDLChoiceCell *loadedCell1 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Loaded 1" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ SDLChoiceCell *loadedCell2 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Loaded 2" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ loadedCell2.uniqueTextId = 3;
+ SDLChoiceCell *loadedCell3 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Loaded 3" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ loadedCell3.uniqueTextId = 5;
+
+ SDLChoiceCell *cellToUpload1 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique 1" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ SDLChoiceCell *cellToUpload2 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique 2" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ SDLChoiceCell *cellToUpload3 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique 3" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+ SDLChoiceCell *cellToUpload4 = [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique 4" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil];
+
+ testOp.windowCapability = primaryTextOnlyCapability;
+ testOp.loadedCells = [NSSet setWithArray:@[loadedCell1, loadedCell2, loadedCell3]];
+ testOp.choiceSet.choices = @[cellToUpload1, cellToUpload2, cellToUpload3, cellToUpload4];
+ testOp.cellsToUpload = [[NSMutableOrderedSet alloc] initWithArray:@[cellToUpload1, cellToUpload2, cellToUpload3, cellToUpload4]];
+ [testOp start];
+ });
+
+ it(@"should properly assign unique text", ^{
+ expect(testOp.cellsToUpload[0].uniqueText).to(equal(@"Cell 2 (2)"));
+ expect(testOp.cellsToUpload[1].uniqueText).to(equal(@"Cell 2 (4)"));
+ expect(testOp.cellsToUpload[2].uniqueText).to(equal(@"Cell 2 (6)"));
+ expect(testOp.cellsToUpload[3].uniqueText).to(equal(@"Cell 2 (7)"));
+ expect(testOp.cellsToUpload[0].secondaryText).toNot(beNil());
+ expect(testOp.choiceSet.choices[0].uniqueText).to(equal(@"Cell 2 (2)"));
+ });
+ });
+
+ context(@"if all cell properties are used", ^{
+ beforeEach(^{
+ testOp.windowCapability = enabledWindowCapability;
+ [testOp start];
+ });
+
+ it(@"should not update the choiceCells' unique title", ^{
+ expect(testOp.cellsToUpload[0].uniqueText).to(equal(@"Cell2"));
+ expect(testOp.cellsToUpload.count).to(equal(1));
+ expect(testOp.choiceSet.choices[0].uniqueText).to(equal(@"Cell2"));
+ });
+ });
+ });
+
+ context(@"when some choices are already uploaded with duplicate titles version <= 7.1.0", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = choiceSetUniquenessInactiveVersion;
+ });
+
+ context(@"if all cell properties are used", ^{
+ beforeEach(^{
+ testOp.windowCapability = enabledWindowCapability;
+ [testOp start];
+ });
+
+ it(@"should update the choiceCells' unique title", ^{
+ expect(testOp.cellsToUpload[0].uniqueText).to(equal("Cell2 (2)"));
+ expect(testOp.cellsToUpload.count).to(equal(1));
+ expect(testOp.choiceSet.choices[0].uniqueText).to(equal(@"Cell2 (2)"));
+ });
+ });
+ });
+ });
+
+ describe(@"running a non-searchable choice set operation", ^{
+ beforeEach(^{
+ testOp.keyboardDelegate = nil;
+ [testOp start];
+
+ // Move us past the preload
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:2 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ });
+
+ it(@"should not update global keyboard properties", ^{
+ for (SDLRPCRequest *req in testConnectionManager.receivedRequests) {
+ expect(req).toNot(beAnInstanceOf([SDLSetGlobalProperties class]));
+ }
+ });
+
+ it(@"should send the perform interaction", ^{
+ SDLPerformInteraction *request = testConnectionManager.receivedRequests.lastObject;
+ expect(request).to(beAnInstanceOf([SDLPerformInteraction class]));
+
+ expect(request.initialText).to(equal(testChoiceSet.title));
+ expect(request.initialPrompt).to(equal(testChoiceSet.initialPrompt));
+ expect(request.interactionMode).to(equal(testInteractionMode));
+ expect(request.interactionLayout).to(equal(SDLLayoutModeIconOnly));
+ expect(request.timeoutPrompt).to(equal(testChoiceSet.timeoutPrompt));
+ expect(request.helpPrompt).to(equal(testChoiceSet.helpPrompt));
+ expect(request.timeout).to(equal(testChoiceSet.timeout * 1000));
+ expect(request.vrHelp).to(beNil());
+ expect(request.interactionChoiceSetIDList).to(equal(@[@(cellsWithoutArtwork[0].choiceId), @(cellsWithoutArtwork[1].choiceId), @(cellsWithoutArtwork[2].choiceId)]));
+ expect(request.cancelID).to(equal(testCancelID));
+ });
+
+ describe(@"after a perform interaction response", ^{
+ __block UInt16 responseChoiceId = UINT16_MAX;
+ __block SDLTriggerSource responseTriggerSource = SDLTriggerSourceMenu;
+
+ beforeEach(^{
+ SDLPerformInteractionResponse *response = [[SDLPerformInteractionResponse alloc] init];
+ response.success = @YES;
+ response.choiceID = @(responseChoiceId);
+ response.triggerSource = responseTriggerSource;
+
+ [testConnectionManager respondToLastRequestWithResponse:response];
+ });
+
+ it(@"should not reset the keyboard properties and should be finished", ^{
+ expect(testConnectionManager.receivedRequests.lastObject).toNot(beAnInstanceOf([SDLSetGlobalProperties class]));
+ expect(testOp.isFinished).to(beTrue());
+ });
+ });
+ });
+
+ describe(@"running a searchable choice set operation", ^{
+ beforeEach(^{
+ [testOp start];
+
+ // Move us past the preload
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:2 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+ });
+
+ it(@"should ask for custom properties", ^{
+ OCMVerify([testKeyboardDelegate customKeyboardConfiguration]);
+
+ expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
+ });
+
+ describe(@"presenting the keyboard", ^{
+ beforeEach(^{
+ SDLSetGlobalPropertiesResponse *response = [[SDLSetGlobalPropertiesResponse alloc] init];
+ response.success = @YES;
+ [testConnectionManager respondToLastRequestWithResponse:response];
+ });
+
+ it(@"should send the perform interaction", ^{
+ expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLPerformInteraction class]));
+ SDLPerformInteraction *request = testConnectionManager.receivedRequests.lastObject;
+ expect(request.initialText).to(equal(testChoiceSet.title));
+ expect(request.initialPrompt).to(equal(testChoiceSet.initialPrompt));
+ expect(request.interactionMode).to(equal(testInteractionMode));
+ expect(request.interactionLayout).to(equal(SDLLayoutModeIconWithSearch));
+ expect(request.timeoutPrompt).to(equal(testChoiceSet.timeoutPrompt));
+ expect(request.helpPrompt).to(equal(testChoiceSet.helpPrompt));
+ expect(request.timeout).to(equal(testChoiceSet.timeout * 1000));
+ expect(request.vrHelp).to(beNil());
+ expect(request.interactionChoiceSetIDList).to(equal(@[@(testChoiceSet.choices[0].choiceId), @(testChoiceSet.choices[1].choiceId), @(testChoiceSet.choices[2].choiceId)]));
+ expect(request.cancelID).to(equal(testCancelID));
+ });
+
+ it(@"should respond to submitted notifications", ^{
+ NSString *inputData = @"Test";
+ SDLRPCNotificationNotification *notification = nil;
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventSubmitted;
+ input.data = inputData;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventSubmitted];
+ }] text:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(NSString *)obj isEqualToString:inputData];
+ }]]);
+
+ OCMVerify([testKeyboardDelegate userDidSubmitInput:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(NSString *)obj isEqualToString:inputData];
+ }] withEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventSubmitted];
+ }]]);
+ });
+
+ it(@"should respond to voice request notifications", ^{
+ SDLRPCNotificationNotification *notification = nil;
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventVoice;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventVoice];
+ }] text:[OCMArg isNil]]);
+
+ OCMVerify([testKeyboardDelegate userDidSubmitInput:[OCMArg isNil] withEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventVoice];
+ }]]);
+ });
+
+ it(@"should respond to abort notifications", ^{
+ SDLRPCNotificationNotification *notification = nil;
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventAborted;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventAborted];
+ }] text:[OCMArg isNil]]);
+
+ OCMVerify([testKeyboardDelegate keyboardDidAbortWithReason:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventAborted];
+ }]]);
+ });
+
+ it(@"should respond to enabled keyboard event", ^{
+ SDLRPCNotificationNotification *notification = nil;
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventInputKeyMaskEnabled;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ }] text:[OCMArg isNil]]);
+
+ OCMVerify([testKeyboardDelegate keyboardDidUpdateInputMask:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ }]]);
+ });
+
+ it(@"should respond to cancellation notifications", ^{
+ SDLRPCNotificationNotification *notification = nil;
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventCancelled;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventCancelled];
+ }] text:[OCMArg isNil]]);
+
+ OCMVerify([testKeyboardDelegate keyboardDidAbortWithReason:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventCancelled];
+ }]]);
+ });
+
+ it(@"should respond to text input notification with autocomplete", ^{
+ NSString *inputData = @"Test";
+ SDLRPCNotificationNotification *notification = nil;
+
+ OCMStub([testKeyboardDelegate updateAutocompleteWithInput:[OCMArg any] autoCompleteResultsHandler:([OCMArg invokeBlockWithArgs:@[inputData], nil])]);
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventKeypress;
+ input.data = inputData;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventKeypress];
+ }] text:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(NSString *)obj isEqualToString:inputData];
+ }]]);
+
+ OCMVerify([testKeyboardDelegate updateAutocompleteWithInput:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(NSString *)obj isEqualToString:inputData];
+ }] autoCompleteResultsHandler:[OCMArg any]]);
+
+ expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
+
+ SDLSetGlobalProperties *setProperties = testConnectionManager.receivedRequests.lastObject;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(setProperties.keyboardProperties.autoCompleteText).to(equal(inputData));
+#pragma clang diagnostic pop
+ });
+
+ it(@"should respond to text input notification with character set", ^{
+ NSString *inputData = @"Test";
+ SDLRPCNotificationNotification *notification = nil;
+
+ OCMStub([testKeyboardDelegate updateCharacterSetWithInput:[OCMArg any] completionHandler:([OCMArg invokeBlockWithArgs:@[inputData], nil])]);
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventKeypress;
+ input.data = inputData;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventKeypress];
+ }] text:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(NSString *)obj isEqualToString:inputData];
+ }]]);
+
+ OCMVerify([testKeyboardDelegate updateCharacterSetWithInput:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(NSString *)obj isEqualToString:inputData];
+ }] completionHandler:[OCMArg any]]);
+
+ expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
+
+ SDLSetGlobalProperties *setProperties = testConnectionManager.receivedRequests.lastObject;
+ expect(setProperties.keyboardProperties.limitedCharacterList).to(equal(@[inputData]));
+ });
+
+ describe(@"after a perform interaction response", ^{
+ beforeEach(^{
+ SDLPerformInteractionResponse *response = [[SDLPerformInteractionResponse alloc] init];
+ response.success = @YES;
+ response.choiceID = @65535;
+ response.triggerSource = SDLTriggerSourceVoiceRecognition;
+
+ [testConnectionManager respondToLastRequestWithResponse:response];
+ });
+
+ it(@"should reset the keyboard properties", ^{
+ expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
+ });
+
+ describe(@"after the reset response", ^{
+ __block SDLSetGlobalPropertiesResponse *response = [[SDLSetGlobalPropertiesResponse alloc] init];
+ beforeEach(^{
+ response.success = @YES;
+ });
+
+ it(@"should be finished", ^{
+ OCMExpect([testChoiceDelegate choiceSet:[OCMArg isEqual:testChoiceSet] didSelectChoice:[OCMArg isNotNil] withSource:[OCMArg isEqual:SDLTriggerSourceVoiceRecognition] atRowIndex:0]);
+ OCMReject([testChoiceDelegate choiceSet:[OCMArg any] didReceiveError:[OCMArg any]]);
+
+ [testConnectionManager respondToLastRequestWithResponse:response];
+
+ expect(testOp.isFinished).to(beTrue());
+ });
+ });
+ });
+ });
+ });
+
+ describe(@"canceling the choice set", ^{
+ context(@"if the head unit supports the `CancelInteraction` RPC", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:6 minor:0 patch:0];
+ });
+
+ context(@"if the operation is executing", ^{
+ beforeEach(^{
+ [testOp start];
+ });
+
+ context(@"before the present is sent", ^{
+ it(@"should cancel without a CancelInteraction", ^{
+ expect(testOp.isExecuting).to(beTrue());
+ expect(testOp.isFinished).to(beFalse());
+ expect(testOp.isCancelled).to(beFalse());
+
+ [testChoiceSet cancel];
+
+ expect(testConnectionManager.receivedRequests.lastObject).toNot(beAnInstanceOf([SDLCancelInteraction class]));
+
+ expect(testOp.isExecuting).to(beTrue());
+ expect(testOp.isFinished).to(beFalse());
+ expect(testOp.isCancelled).to(beTrue());
+ });
+ });
+
+ context(@"if the present is in progress", ^{
+ beforeEach(^{
+ // Move us past the preload
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:0 error:nil];
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:1 error:nil];
+ [testConnectionManager respondToRequestWithResponse:testGoodResponse requestNumber:2 error:nil];
+ [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES];
+
+ // Move us past the SetGlobalProperties
+ SDLSetGlobalPropertiesResponse *sgpr = [[SDLSetGlobalPropertiesResponse alloc] init];
+ sgpr.success = @YES;
+ sgpr.resultCode = SDLResultSuccess;
+ [testConnectionManager respondToLastRequestWithResponse:sgpr];
+ });
+
+ it(@"should attempt to send a cancel interaction", ^{
+ expect(testOp.isExecuting).to(beTrue());
+ expect(testOp.isFinished).to(beFalse());
+ expect(testOp.isCancelled).to(beFalse());
+
+ [testChoiceSet cancel];
+
+ SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
+ expect(lastRequest).to(beAnInstanceOf([SDLCancelInteraction class]));
+ expect(lastRequest.cancelID).to(equal(testCancelID));
+ expect(lastRequest.functionID).to(equal([SDLFunctionID.sharedInstance functionIdForName:SDLRPCFunctionNamePerformInteraction]));
+ });
+
+ context(@"If the cancel interaction was successful", ^{
+ __block SDLCancelInteractionResponse *testCancelInteractionResponse = [[SDLCancelInteractionResponse alloc] init];
+ beforeEach(^{
+ testCancelInteractionResponse.success = @YES;
+ testCancelInteractionResponse.resultCode = SDLResultSuccess;
+ [testChoiceSet cancel];
+ });
+
+ it(@"should finish with an error", ^{
+ // Respond to the cancel interaction, then the perform interaction
+ [testConnectionManager respondToLastRequestWithResponse:testCancelInteractionResponse];
+
+ SDLPerformInteractionResponse *pir = [[SDLPerformInteractionResponse alloc] init];
+ pir.success = @NO;
+ pir.resultCode = SDLResultAborted;
+ [testConnectionManager respondToRequestWithResponse:pir requestNumber:4 error:[NSError sdl_choiceSetManager_cancelled]];
+
+ // Try to reset the keyboard
+ expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
+
+ SDLSetGlobalPropertiesResponse *sgpr = [[SDLSetGlobalPropertiesResponse alloc] init];
+ sgpr.success = @YES;
+ sgpr.resultCode = SDLResultSuccess;
+ [testConnectionManager respondToLastRequestWithResponse:sgpr];
+
+ OCMReject([testChoiceDelegate choiceSet:[OCMArg isNotNil] didSelectChoice:[OCMArg isNotNil] withSource:[OCMArg any] atRowIndex:0]);
+ OCMVerify([testChoiceDelegate choiceSet:[OCMArg isEqual:testChoiceSet] didReceiveError:[OCMArg isNotNil]]);
+ });
+ });
+
+ context(@"If the cancel interaction was not successful", ^{
+ __block NSError *testError = [NSError sdl_lifecycle_notConnectedError];
+ __block SDLCancelInteractionResponse *testCancelInteractionResponse = [[SDLCancelInteractionResponse alloc] init];
+
+ beforeEach(^{
+ testCancelInteractionResponse.success = @NO;
+ });
+
+ it(@"should error", ^{
+ OCMExpect([testChoiceDelegate choiceSet:[OCMArg any] didReceiveError:[OCMArg any]]);
+ OCMReject([testChoiceDelegate choiceSet:[OCMArg isEqual:testChoiceSet] didSelectChoice:[OCMArg isNotNil] withSource:[OCMArg isEqual:SDLTriggerSourceVoiceRecognition] atRowIndex:0]);
+ [testConnectionManager respondToLastRequestWithResponse:testCancelInteractionResponse error:testError];
+ });
+ });
+ });
+ });
+
+ context(@"if the operation has already finished", ^{
+ it(@"should not attempt to send a cancel interaction", ^{
+ [testOp finishOperation];
+
+ expect(testOp.isExecuting).to(beFalse());
+ expect(testOp.isFinished).to(beTrue());
+ expect(testOp.isCancelled).to(beFalse());
+
+ [testChoiceSet cancel];
+
+ SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
+ expect(lastRequest).to(beNil());
+ });
+ });
+
+ context(@"if the operation has not started", ^{
+ beforeEach(^{
+ expect(testOp.isExecuting).to(beFalse());
+ expect(testOp.isFinished).to(beFalse());
+ expect(testOp.isCancelled).to(beFalse());
+
+ [testChoiceSet cancel];
+ });
+
+ it(@"should not attempt to send a cancel interaction", ^{
+ expect(testOp.isExecuting).to(beFalse());
+ expect(testOp.isFinished).to(beFalse());
+ expect(testOp.isCancelled).to(beTrue());
+
+ SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
+ expect(lastRequest).to(beNil());
+ });
+
+ context(@"once the operation has started", ^{
+ beforeEach(^{
+ [testOp start];
+ });
+
+ it(@"immediately finish", ^{
+ expect(testConnectionManager.receivedRequests).to(haveCount(0));
+ expect(testOp.isExecuting).to(beFalse());
+ expect(testOp.isFinished).to(beTrue());
+ expect(testOp.isCancelled).to(beTrue());
+ });
+
+ it(@"should finish", ^{
+ expect(testOp.isExecuting).toEventually(beFalse());
+ expect(testOp.isFinished).toEventually(beTrue());
+ expect(testOp.isCancelled).toEventually(beTrue());
+ });
+ });
+ });
+ });
+
+ context(@"Head unit does not support the `CancelInteraction` RPC", ^{
+ beforeEach(^{
+ SDLVersion *unsupportedVersion = [SDLVersion versionWithMajor:5 minor:1 patch:0];
+ id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
+ OCMStub([globalMock rpcVersion]).andReturn(unsupportedVersion);
+ });
+
+ it(@"should not attempt to send a cancel interaction if the operation is executing", ^{
+ [testOp start];
+
+ expect(testOp.isExecuting).to(beTrue());
+ expect(testOp.isFinished).to(beFalse());
+ expect(testOp.isCancelled).to(beFalse());
+
+ [testChoiceSet cancel];
+
+ SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
+ expect(lastRequest).toNot(beAnInstanceOf([SDLCancelInteraction class]));
+ });
+
+ it(@"should cancel the operation if it has not yet been run", ^{
+ expect(testOp.isExecuting).to(beFalse());
+ expect(testOp.isFinished).to(beFalse());
+ expect(testOp.isCancelled).to(beFalse());
+
+ [testChoiceSet cancel];
+
+ SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
+ expect(lastRequest).to(beNil());
+
+ expect(testOp.isExecuting).to(beFalse());
+ expect(testOp.isFinished).to(beFalse());
+ expect(testOp.isCancelled).to(beTrue());
+ });
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadPresentChoicesOperationUtilitiesSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadPresentChoicesOperationUtilitiesSpec.m
new file mode 100644
index 000000000..b09d7a3e2
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadPresentChoicesOperationUtilitiesSpec.m
@@ -0,0 +1,504 @@
+//
+// SDLPreloadPresentChoiceSetOperationUtilitiesSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Joel Fischer on 8/27/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLPreloadPresentChoicesOperationUtilities.h"
+
+#import "SDLChoiceCell.h"
+#import "SDLChoiceSet.h"
+#import "SDLGlobals.h"
+#import "SDLImageField+ScreenManagerExtensions.h"
+#import "SDLTextField+ScreenManagerExtensions.h"
+#import "SDLVersion.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
+
+@interface SDLChoiceCell()
+
+@property (assign, nonatomic) UInt16 choiceId;
+
+@end
+
+@interface SDLPreloadPresentChoicesOperationUtilitiesSpec : QuickSpec @end
+@implementation SDLPreloadPresentChoicesOperationUtilitiesSpec
+
+- (NSOrderedSet<SDLChoiceCell *> *)sdl_cellsToLoadWithCount:(UInt16)count {
+ NSMutableOrderedSet<SDLChoiceCell *> *mutableCells = [NSMutableOrderedSet orderedSetWithCapacity:count];
+ for (NSUInteger i = 1; i <= count; i++) {
+ [mutableCells addObject:[[SDLChoiceCell alloc] initWithText:[NSString stringWithFormat:@"Cell %lu", i]]];
+ }
+
+ return mutableCells.copy;
+}
+
+- (NSSet<SDLChoiceCell *> *)sdl_loadedCellsWithStartNum:(UInt16)startNum endNum:(UInt16)endNum {
+ NSMutableSet<SDLChoiceCell *> *mutableCells = [NSMutableSet setWithCapacity:(endNum - startNum)];
+ for (NSUInteger i = startNum; i <= endNum; i++) {
+ SDLChoiceCell *cell = [[SDLChoiceCell alloc] initWithText:[NSString stringWithFormat:@"Loaded Cell %lu", i]];
+ cell.choiceId = (UInt16)i;
+
+ [mutableCells addObject:cell];
+ }
+
+ return mutableCells.copy;
+}
+
+- (void)spec {
+ __block NSOrderedSet<SDLChoiceCell *> *testCellsToLoad = nil;
+ __block NSSet<SDLChoiceCell *> *testLoadedCells = nil;
+
+ describe(@"assigning ids", ^{
+ context(@"when we're on the first loop of assigning ids", ^{
+ beforeEach(^{
+ SDLPreloadPresentChoicesOperationUtilities.reachedMaxId = NO;
+ SDLPreloadPresentChoicesOperationUtilities.choiceId = 1;
+ });
+
+ context(@"when there's no ids already set", ^{
+ beforeEach(^{
+ testLoadedCells = [NSSet set];
+ testCellsToLoad = [self sdl_cellsToLoadWithCount:50];
+ });
+
+ it(@"should set ids starting at 0", ^{
+ [SDLPreloadPresentChoicesOperationUtilities assignIdsToCells:testCellsToLoad loadedCells:testLoadedCells];
+ expect(testCellsToLoad.count).to(equal(50));
+ for (NSUInteger i = 0; i < testCellsToLoad.count; i++) {
+ expect((NSUInteger)testCellsToLoad[i].choiceId).to(equal(i + 1));
+ }
+ });
+ });
+
+ context(@"when ids are already set", ^{
+ context(@"when not reaching the max value", ^{
+ beforeEach(^{
+ SDLPreloadPresentChoicesOperationUtilities.choiceId = 100;
+
+ testLoadedCells = [NSSet set];
+ testCellsToLoad = [self sdl_cellsToLoadWithCount:50];
+ });
+
+ it(@"should set ids starting at the next id", ^{
+ [SDLPreloadPresentChoicesOperationUtilities assignIdsToCells:testCellsToLoad loadedCells:testLoadedCells];
+ expect(testCellsToLoad.count).to(equal(50));
+ for (NSUInteger i = 0; i < testCellsToLoad.count; i++) {
+ expect((NSUInteger)testCellsToLoad[i].choiceId).to(equal(i + 100));
+ }
+ expect(SDLPreloadPresentChoicesOperationUtilities.reachedMaxId).to(beFalse());
+ });
+ });
+
+ context(@"when reaching the max value", ^{
+ beforeEach(^{
+ SDLPreloadPresentChoicesOperationUtilities.choiceId = 65500;
+
+ testLoadedCells = [self sdl_loadedCellsWithStartNum:0 endNum:65499];
+ testCellsToLoad = [self sdl_cellsToLoadWithCount:35];
+ });
+
+ it(@"should set the reachedMaxId BOOL and not loop back over yet", ^{
+ [SDLPreloadPresentChoicesOperationUtilities assignIdsToCells:testCellsToLoad loadedCells:testLoadedCells];
+ expect(testCellsToLoad.count).to(equal(35));
+ for (NSUInteger i = 0; i < testCellsToLoad.count; i++) {
+ expect((NSUInteger)testCellsToLoad[i].choiceId).to(equal(i + 65500));
+ }
+ expect(SDLPreloadPresentChoicesOperationUtilities.reachedMaxId).to(beFalse());
+ });
+ });
+ });
+ });
+
+ context(@"on subsequent loops of assigning ids", ^{
+ beforeEach(^{
+ SDLPreloadPresentChoicesOperationUtilities.reachedMaxId = YES;
+ SDLPreloadPresentChoicesOperationUtilities.choiceId = 1;
+ });
+
+ context(@"when loadedCells is not full", ^{
+ context(@"when loaded cells are contiguous at the beginning", ^{
+ beforeEach(^{
+ SDLPreloadPresentChoicesOperationUtilities.choiceId = 99;
+
+ testLoadedCells = [self sdl_loadedCellsWithStartNum:0 endNum:99];
+ testCellsToLoad = [self sdl_cellsToLoadWithCount:35];
+ });
+
+ it(@"should assign ids after those", ^{
+ [SDLPreloadPresentChoicesOperationUtilities assignIdsToCells:testCellsToLoad loadedCells:testLoadedCells];
+ expect(testCellsToLoad.count).to(equal(35));
+ for (NSUInteger i = 0; i < testCellsToLoad.count; i++) {
+ expect((NSUInteger)testCellsToLoad[i].choiceId).to(equal(i + 100));
+ }
+ expect(SDLPreloadPresentChoicesOperationUtilities.reachedMaxId).to(beTrue());
+ });
+ });
+
+ context(@"when those items are contiguous in the middle so that assigning cells overlap", ^{
+ beforeEach(^{
+ SDLPreloadPresentChoicesOperationUtilities.choiceId = 10;
+
+ testLoadedCells = [self sdl_loadedCellsWithStartNum:3 endNum:10];
+ testCellsToLoad = [self sdl_cellsToLoadWithCount:13];
+ });
+
+ it(@"should start assigning from the last used id", ^{
+ [SDLPreloadPresentChoicesOperationUtilities assignIdsToCells:testCellsToLoad loadedCells:testLoadedCells];
+ expect(testCellsToLoad.count).to(equal(13));
+ for (NSUInteger i = 0; i < testCellsToLoad.count; i++) {
+ expect((NSUInteger)testCellsToLoad[i].choiceId).to(equal(i + 11));
+ }
+ expect(SDLPreloadPresentChoicesOperationUtilities.reachedMaxId).to(beTrue());
+ });
+ });
+
+ context(@"when there are items scattered and overlapping setting cells", ^{
+ beforeEach(^{
+ SDLPreloadPresentChoicesOperationUtilities.choiceId = 10;
+
+ testLoadedCells = [self sdl_loadedCellsWithStartNum:3 endNum:10];
+ NSSet<SDLChoiceCell *> *secondLoadedCells = [self sdl_loadedCellsWithStartNum:50 endNum:55];
+ testLoadedCells = [testLoadedCells setByAddingObjectsFromSet:secondLoadedCells];
+
+ testCellsToLoad = [self sdl_cellsToLoadWithCount:10];
+ });
+
+ it(@"start from the last used id", ^{
+ [SDLPreloadPresentChoicesOperationUtilities assignIdsToCells:testCellsToLoad loadedCells:testLoadedCells];
+ expect(testCellsToLoad.count).to(equal(10));
+ for (NSUInteger i = 0; i < testCellsToLoad.count; i++) {
+ expect((NSUInteger)testCellsToLoad[i].choiceId).to(equal(i + 56));
+ }
+ expect(SDLPreloadPresentChoicesOperationUtilities.reachedMaxId).to(beTrue());
+ });
+ });
+
+ context(@"when not enough open ids are available", ^{
+ beforeEach(^{
+ SDLPreloadPresentChoicesOperationUtilities.choiceId = 10;
+
+ testLoadedCells = [self sdl_loadedCellsWithStartNum:3 endNum:10];
+ NSSet<SDLChoiceCell *> *secondLoadedCells = [self sdl_loadedCellsWithStartNum:12 endNum:65533];
+ testLoadedCells = [testLoadedCells setByAddingObjectsFromSet:secondLoadedCells];
+
+ testCellsToLoad = [self sdl_cellsToLoadWithCount:10];
+ });
+ it(@"should assign what it can and the rest should be UINT16_MAX", ^{
+ [SDLPreloadPresentChoicesOperationUtilities assignIdsToCells:testCellsToLoad loadedCells:testLoadedCells];
+ expect(testCellsToLoad.count).to(equal(10));
+
+ expect((NSUInteger)testCellsToLoad[0].choiceId).to(equal(65534));
+ expect((NSUInteger)testCellsToLoad[1].choiceId).to(equal(65535));
+ expect((NSUInteger)testCellsToLoad[2].choiceId).to(equal(0));
+ expect((NSUInteger)testCellsToLoad[3].choiceId).to(equal(1));
+ expect((NSUInteger)testCellsToLoad[4].choiceId).to(equal(2));
+ expect((NSUInteger)testCellsToLoad[5].choiceId).to(equal(11));
+ expect((NSUInteger)testCellsToLoad[6].choiceId).to(equal(65535));
+ expect((NSUInteger)testCellsToLoad[7].choiceId).to(equal(65535));
+ expect((NSUInteger)testCellsToLoad[8].choiceId).to(equal(65535));
+ expect((NSUInteger)testCellsToLoad[9].choiceId).to(equal(65535));
+
+ expect(SDLPreloadPresentChoicesOperationUtilities.reachedMaxId).to(beTrue());
+ });
+ });
+ });
+
+ context(@"when loadedCells is full", ^{
+ beforeEach(^{
+ SDLPreloadPresentChoicesOperationUtilities.choiceId = 65535;
+
+ testLoadedCells = [self sdl_loadedCellsWithStartNum:0 endNum:65535];
+ testCellsToLoad = [self sdl_cellsToLoadWithCount:10];
+ });
+
+ it(@"should set all ids to UINT16_MAX", ^{
+ [SDLPreloadPresentChoicesOperationUtilities assignIdsToCells:testCellsToLoad loadedCells:testLoadedCells];
+ expect(testCellsToLoad.count).to(equal(10));
+ for (NSUInteger i = 0; i < testCellsToLoad.count; i++) {
+ expect((NSUInteger)testCellsToLoad[i].choiceId).to(equal(65535));
+ }
+ expect(SDLPreloadPresentChoicesOperationUtilities.reachedMaxId).to(beTrue());
+ });
+ });
+ });
+ });
+
+ describe(@"making cells unique", ^{
+ __block SDLWindowCapability *enabledWindowCapability = nil;
+ __block SDLWindowCapability *primaryTextOnlyCapability = nil;
+
+ beforeEach(^{
+ enabledWindowCapability = [[SDLWindowCapability alloc] init];
+ enabledWindowCapability.textFields = @[
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuName characterSet:SDLCharacterSetUtf8 width:500 rows:1],
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameSecondaryText characterSet:SDLCharacterSetUtf8 width:500 rows:1],
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameTertiaryText characterSet:SDLCharacterSetUtf8 width:500 rows:1]
+ ];
+ enabledWindowCapability.imageFields = @[
+ [[SDLImageField alloc] initWithName:SDLImageFieldNameChoiceImage imageTypeSupported:@[SDLFileTypePNG] imageResolution:nil],
+ [[SDLImageField alloc] initWithName:SDLImageFieldNameChoiceSecondaryImage imageTypeSupported:@[SDLFileTypePNG] imageResolution:nil]
+ ];
+ primaryTextOnlyCapability = [[SDLWindowCapability alloc] init];
+ primaryTextOnlyCapability.textFields = @[
+ [[SDLTextField alloc] initWithName:SDLTextFieldNameMenuName characterSet:SDLCharacterSetUtf8 width:500 rows:1],
+ ];
+
+ testLoadedCells = [NSSet set];
+ });
+
+ context(@"at RPC v7.1", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:7 minor:1 patch:0];
+ });
+
+ context(@"when cells are unique except when stripped", ^{
+ beforeEach(^{
+ testCellsToLoad = [NSOrderedSet orderedSetWithArray:@[
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:@"Unique 1" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:@"Unique 2" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:@"Unique 3" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique 1" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil]
+ ]];
+ });
+
+ context(@"with full window capability", ^{
+ beforeEach(^{
+ [SDLPreloadPresentChoicesOperationUtilities makeCellsToUploadUnique:testCellsToLoad.mutableCopy basedOnLoadedCells:testLoadedCells.mutableCopy windowCapability:enabledWindowCapability];
+ });
+
+ it(@"should not set unique titles", ^{
+ expect(testCellsToLoad[0].uniqueText).to(equal(testCellsToLoad[0].text));
+ expect(testCellsToLoad[1].uniqueText).to(equal(testCellsToLoad[1].text));
+ expect(testCellsToLoad[2].uniqueText).to(equal(testCellsToLoad[2].text));
+ expect(testCellsToLoad[3].uniqueText).to(equal(testCellsToLoad[3].text));
+ });
+ });
+
+ context(@"with primary text only capability", ^{
+ beforeEach(^{
+ [SDLPreloadPresentChoicesOperationUtilities makeCellsToUploadUnique:testCellsToLoad.mutableCopy basedOnLoadedCells:testLoadedCells.mutableCopy windowCapability:primaryTextOnlyCapability];
+ });
+
+ it(@"should set unique titles", ^{
+ expect(testCellsToLoad[0].uniqueText).to(equal(testCellsToLoad[0].text));
+ expect(testCellsToLoad[1].uniqueText).toNot(equal(testCellsToLoad[1].text));
+ expect(testCellsToLoad[2].uniqueText).toNot(equal(testCellsToLoad[2].text));
+ expect(testCellsToLoad[3].uniqueText).to(equal(testCellsToLoad[3].text));
+ });
+ });
+ });
+
+ context(@"when cells are unique", ^{
+ beforeEach(^{
+ testCellsToLoad = [NSOrderedSet orderedSetWithArray:@[
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 3" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 4" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil]
+ ]];
+
+ [SDLPreloadPresentChoicesOperationUtilities makeCellsToUploadUnique:testCellsToLoad.mutableCopy basedOnLoadedCells:testLoadedCells.mutableCopy windowCapability:enabledWindowCapability];
+ });
+
+ it(@"should not set unique titles", ^{
+ expect(testCellsToLoad[0].uniqueText).to(equal(testCellsToLoad[0].text));
+ expect(testCellsToLoad[1].uniqueText).to(equal(testCellsToLoad[1].text));
+ expect(testCellsToLoad[2].uniqueText).to(equal(testCellsToLoad[2].text));
+ expect(testCellsToLoad[3].uniqueText).to(equal(testCellsToLoad[3].text));
+ });
+ });
+
+ context(@"when loaded cells match the cells when stripped", ^{
+ beforeEach(^{
+ testLoadedCells = [NSSet setWithArray:@[
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1"],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 2"],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 3"],
+ ]];
+
+ testCellsToLoad = [NSOrderedSet orderedSetWithArray:@[
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:@"Unique" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:@"Unique 2" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 4" secondaryText:@"Unique" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil]
+ ]];
+ });
+
+ context(@"with full window capability", ^{
+ beforeEach(^{
+ [SDLPreloadPresentChoicesOperationUtilities makeCellsToUploadUnique:testCellsToLoad.mutableCopy basedOnLoadedCells:testLoadedCells.mutableCopy windowCapability:enabledWindowCapability];
+ });
+
+ it(@"should not make unique text", ^{
+ expect(testCellsToLoad[0].uniqueText).to(equal(testCellsToLoad[0].text));
+ expect(testCellsToLoad[1].uniqueText).to(equal(testCellsToLoad[1].text));
+ expect(testCellsToLoad[2].uniqueText).to(equal(testCellsToLoad[2].text));
+ expect(testCellsToLoad[3].uniqueText).to(equal(testCellsToLoad[3].text));
+ });
+ });
+
+ context(@"with primary text only capability", ^{
+ beforeEach(^{
+ [SDLPreloadPresentChoicesOperationUtilities makeCellsToUploadUnique:testCellsToLoad.mutableCopy basedOnLoadedCells:testLoadedCells.mutableCopy windowCapability:primaryTextOnlyCapability];
+ });
+
+ it(@"should not make unique text", ^{
+ expect(testCellsToLoad[0].uniqueText).toNot(equal(testCellsToLoad[0].text));
+ expect(testCellsToLoad[1].uniqueText).toNot(equal(testCellsToLoad[1].text));
+ expect(testCellsToLoad[2].uniqueText).toNot(equal(testCellsToLoad[2].text));
+ expect(testCellsToLoad[3].uniqueText).to(equal(testCellsToLoad[3].text));
+ });
+ });
+ });
+ });
+
+ context(@"below RPC v7.1", ^{
+ beforeEach(^{
+ [SDLGlobals sharedGlobals].rpcVersion = [SDLVersion versionWithMajor:7 minor:0 patch:0];
+ });
+
+ context(@"when cells are unique except when stripped", ^{
+ beforeEach(^{
+ testCellsToLoad = [NSOrderedSet orderedSetWithArray:@[
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:@"Unique 1" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:@"Unique 2" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:@"Unique 3" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique 1" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil]
+ ]];
+
+ [SDLPreloadPresentChoicesOperationUtilities makeCellsToUploadUnique:testCellsToLoad.mutableCopy basedOnLoadedCells:testLoadedCells.mutableCopy windowCapability:enabledWindowCapability];
+ });
+
+ it(@"should set unique titles except the first and last", ^{
+ expect(testCellsToLoad[0].uniqueText).to(equal(testCellsToLoad[0].text));
+ expect(testCellsToLoad[1].uniqueText).toNot(equal(testCellsToLoad[1].text));
+ expect(testCellsToLoad[2].uniqueText).toNot(equal(testCellsToLoad[2].text));
+ expect(testCellsToLoad[3].uniqueText).to(equal(testCellsToLoad[3].text));
+ });
+ });
+
+ context(@"when cells are unique", ^{
+ beforeEach(^{
+ testCellsToLoad = [NSOrderedSet orderedSetWithArray:@[
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 3" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 4" secondaryText:nil tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil]
+ ]];
+
+ [SDLPreloadPresentChoicesOperationUtilities makeCellsToUploadUnique:testCellsToLoad.mutableCopy basedOnLoadedCells:testLoadedCells.mutableCopy windowCapability:enabledWindowCapability];
+ });
+
+ it(@"should not set unique titles", ^{
+ expect(testCellsToLoad[0].uniqueText).to(equal(testCellsToLoad[0].text));
+ expect(testCellsToLoad[1].uniqueText).to(equal(testCellsToLoad[1].text));
+ expect(testCellsToLoad[2].uniqueText).to(equal(testCellsToLoad[2].text));
+ expect(testCellsToLoad[3].uniqueText).to(equal(testCellsToLoad[3].text));
+ });
+ });
+
+ context(@"when loaded cells match the cells when stripped", ^{
+ beforeEach(^{
+ testLoadedCells = [NSSet setWithArray:@[
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1"],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 2"],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 3"],
+ ]];
+
+ testCellsToLoad = [NSOrderedSet orderedSetWithArray:@[
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:@"Unique" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 2" secondaryText:@"Unique" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1" secondaryText:@"Unique 2" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 4" secondaryText:@"Unique" tertiaryText:nil voiceCommands:nil artwork:nil secondaryArtwork:nil]
+ ]];
+ });
+
+ context(@"with full window capability", ^{
+ beforeEach(^{
+ [SDLPreloadPresentChoicesOperationUtilities makeCellsToUploadUnique:testCellsToLoad.mutableCopy basedOnLoadedCells:testLoadedCells.mutableCopy windowCapability:enabledWindowCapability];
+ });
+
+ it(@"should make unique text", ^{
+ expect(testCellsToLoad[0].uniqueText).toNot(equal(testCellsToLoad[0].text));
+ expect(testCellsToLoad[1].uniqueText).toNot(equal(testCellsToLoad[1].text));
+ expect(testCellsToLoad[2].uniqueText).toNot(equal(testCellsToLoad[2].text));
+ expect(testCellsToLoad[3].uniqueText).to(equal(testCellsToLoad[3].text));
+ });
+ });
+
+ context(@"with primary text only capability", ^{
+ beforeEach(^{
+ [SDLPreloadPresentChoicesOperationUtilities makeCellsToUploadUnique:testCellsToLoad.mutableCopy basedOnLoadedCells:testLoadedCells.mutableCopy windowCapability:primaryTextOnlyCapability];
+ });
+
+ it(@"should not make unique text", ^{
+ expect(testCellsToLoad[0].uniqueText).toNot(equal(testCellsToLoad[0].text));
+ expect(testCellsToLoad[1].uniqueText).toNot(equal(testCellsToLoad[1].text));
+ expect(testCellsToLoad[2].uniqueText).toNot(equal(testCellsToLoad[2].text));
+ expect(testCellsToLoad[3].uniqueText).to(equal(testCellsToLoad[3].text));
+ });
+ });
+ });
+ });
+ });
+
+ describe(@"updating a choice set based on loaded cells and cells to upload", ^{
+ __block SDLChoiceSet *testChoiceSet = nil;
+ __block NSArray<SDLChoiceCell *> *basicChoiceCells = nil;
+ __block NSMutableArray<SDLChoiceCell *> *testLoadedCellsArray = nil;
+
+ beforeEach(^{
+ basicChoiceCells = @[
+ [[SDLChoiceCell alloc] initWithText:@"Cell 1"],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 2"],
+ [[SDLChoiceCell alloc] initWithText:@"Cell 3"],
+ ];
+
+ // Has all three cells with no ids
+ testChoiceSet = [[SDLChoiceSet alloc] init];
+ testChoiceSet.choices = basicChoiceCells;
+
+ // Has all three cells with different ids
+ testCellsToLoad = [NSOrderedSet orderedSetWithArray:basicChoiceCells range:NSMakeRange(0, 3) copyItems:YES];
+ for (NSUInteger i = 0; i < testCellsToLoad.count; i++) {
+ testCellsToLoad[i].choiceId = i;
+ }
+
+ // Loaded cells has first two items with different ids
+ testLoadedCellsArray = [[NSMutableArray alloc] initWithArray:basicChoiceCells copyItems:YES];
+ [testLoadedCellsArray removeLastObject];
+ for (NSUInteger i = 0; i < testLoadedCellsArray.count; i++) {
+ testLoadedCellsArray[i].choiceId = i + 10;
+ }
+ testLoadedCells = [NSSet setWithArray:testLoadedCellsArray];
+ });
+
+ context(@"when there are no loaded cells", ^{
+ it(@"should have all cells the same as cells to upload", ^{
+ [SDLPreloadPresentChoicesOperationUtilities updateChoiceSet:testChoiceSet withLoadedCells:[NSSet set] cellsToUpload:testCellsToLoad.set];
+
+ for (NSUInteger i = 0; i < testChoiceSet.choices.count; i++) {
+ expect((NSUInteger)testChoiceSet.choices[i].choiceId).to(equal(testCellsToLoad[i].choiceId));
+ }
+ });
+ });
+
+ context(@"when some loaded cells match", ^{
+ it(@"should use the loaded cells when possible", ^{
+ [SDLPreloadPresentChoicesOperationUtilities updateChoiceSet:testChoiceSet withLoadedCells:testLoadedCells cellsToUpload:testCellsToLoad.set];
+
+ expect((NSUInteger)testChoiceSet.choices[0].choiceId).to(equal(testLoadedCellsArray[0].choiceId));
+ expect((NSUInteger)testChoiceSet.choices[1].choiceId).to(equal(testLoadedCellsArray[1].choiceId));
+ expect((NSUInteger)testChoiceSet.choices[2].choiceId).to(equal(testCellsToLoad[2].choiceId));
+ });
+ });
+ });
+}
+
+@end
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m
deleted file mode 100644
index f918c6909..000000000
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m
+++ /dev/null
@@ -1,549 +0,0 @@
-#import <Quick/Quick.h>
-#import <Nimble/Nimble.h>
-#import <OCMock/OCMock.h>
-
-#import "SDLPresentChoiceSetOperation.h"
-
-#import "SDLCancelInteraction.h"
-#import "SDLCancelInteractionResponse.h"
-#import "SDLChoiceCell.h"
-#import "SDLChoiceSet.h"
-#import "SDLChoiceSetDelegate.h"
-#import "SDLError.h"
-#import "SDLFunctionID.h"
-#import "SDLKeyboardDelegate.h"
-#import "SDLOnKeyboardInput.h"
-#import "SDLKeyboardProperties.h"
-#import "SDLPerformInteraction.h"
-#import "SDLPerformInteractionResponse.h"
-#import "SDLRPCNotificationNotification.h"
-#import "SDLGlobals.h"
-#import "SDLSetGlobalProperties.h"
-#import "SDLSetGlobalPropertiesResponse.h"
-#import "SDLVersion.h"
-#import "TestConnectionManager.h"
-
-@interface SDLChoiceSet()
-
-@property (nullable, copy, nonatomic) SDLChoiceSetCanceledHandler canceledHandler;
-
-@end
-
-QuickSpecBegin(SDLPresentChoiceSetOperationSpec)
-
-describe(@"present choice operation", ^{
- __block TestConnectionManager *testConnectionManager = nil;
- __block SDLPresentChoiceSetOperation *testOp = nil;
-
- __block SDLInteractionMode testInteractionMode = SDLInteractionModeBoth;
- __block SDLChoiceSet *testChoiceSet = nil;
- __block id<SDLChoiceSetDelegate> testChoiceDelegate = nil;
- __block NSArray<SDLChoiceCell *> *testChoices = nil;
- __block int testCancelID = 98;
-
- __block id<SDLKeyboardDelegate> testKeyboardDelegate = nil;
- __block SDLKeyboardProperties *testKeyboardProperties = nil;
-
- __block BOOL hasCalledOperationCompletionHandler = NO;
- __block NSError *resultError = nil;
- __block SDLWindowCapability *windowCapability = nil;
-
- beforeEach(^{
- resultError = nil;
- hasCalledOperationCompletionHandler = NO;
-
- testConnectionManager = [[TestConnectionManager alloc] init];
-
- testChoiceDelegate = OCMProtocolMock(@protocol(SDLChoiceSetDelegate));
- SDLChoiceCell *cell1 = [[SDLChoiceCell alloc] initWithText:@"Cell 1"];
- testChoices = @[cell1];
- testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:@"Test Title" delegate:testChoiceDelegate layout:SDLChoiceSetLayoutTiles timeout:13 initialPromptString:@"Test initial prompt" timeoutPromptString:@"Test timeout prompt" helpPromptString:@"Test help prompt" vrHelpList:nil choices:testChoices];
-
- windowCapability = [[SDLWindowCapability alloc] init];
- testKeyboardDelegate = OCMProtocolMock(@protocol(SDLKeyboardDelegate));
- OCMStub([testKeyboardDelegate customKeyboardConfiguration]).andReturn(nil);
- testKeyboardProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageArSa keyboardLayout:SDLKeyboardLayoutAZERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil maskInputCharacters:nil customKeys:nil];
- });
-
- it(@"should have a priority of 'normal'", ^{
- testOp = [[SDLPresentChoiceSetOperation alloc] init];
-
- expect(@(testOp.queuePriority)).to(equal(@(NSOperationQueuePriorityNormal)));
- });
-
- describe(@"running a non-searchable choice set operation", ^{
- beforeEach(^{
- testOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:nil keyboardDelegate:nil cancelID:testCancelID windowCapability:windowCapability];
- testOp.completionBlock = ^{
- hasCalledOperationCompletionHandler = YES;
- };
- [testOp start];
- });
-
- it(@"should not update global keyboard properties", ^{
- expect(testConnectionManager.receivedRequests.lastObject).toNot(beAnInstanceOf([SDLSetGlobalProperties class]));
- });
-
- describe(@"presenting the choice set", ^{
- it(@"should send the perform interaction", ^{
- expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLPerformInteraction class]));
- SDLPerformInteraction *request = testConnectionManager.receivedRequests.lastObject;
- expect(request.initialText).to(equal(testChoiceSet.title));
- expect(request.initialPrompt).to(equal(testChoiceSet.initialPrompt));
- expect(request.interactionMode).to(equal(testInteractionMode));
- expect(request.interactionLayout).to(equal(SDLLayoutModeIconOnly));
- expect(request.timeoutPrompt).to(equal(testChoiceSet.timeoutPrompt));
- expect(request.helpPrompt).to(equal(testChoiceSet.helpPrompt));
- expect(request.timeout).to(equal(testChoiceSet.timeout * 1000));
- expect(request.vrHelp).to(beNil());
- expect(request.interactionChoiceSetIDList).to(equal(@[@65535]));
- expect(request.cancelID).to(equal(testCancelID));
- });
-
- describe(@"after a perform interaction response", ^{
- __block UInt16 responseChoiceId = UINT16_MAX;
- __block SDLTriggerSource responseTriggerSource = SDLTriggerSourceMenu;
-
- beforeEach(^{
- SDLPerformInteractionResponse *response = [[SDLPerformInteractionResponse alloc] init];
- response.success = @YES;
- response.choiceID = @(responseChoiceId);
- response.triggerSource = responseTriggerSource;
-
- [testConnectionManager respondToLastRequestWithResponse:response];
- });
-
- it(@"should not reset the keyboard properties and should be finished", ^{
- expect(testConnectionManager.receivedRequests.lastObject).toNot(beAnInstanceOf([SDLSetGlobalProperties class]));
- expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
- expect(testOp.isFinished).to(beTrue());
- expect(testOp.selectedCell).to(equal(testChoices.firstObject));
- expect(testOp.selectedTriggerSource).to(equal(responseTriggerSource));
- });
- });
- });
-
- describe(@"Canceling the choice set", ^{
- __block SDLPresentChoiceSetOperation *testCancelOp = nil;
-
- beforeEach(^{
- testCancelOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:nil keyboardDelegate:nil cancelID:testCancelID windowCapability:windowCapability];
- testCancelOp.completionBlock = ^{
- hasCalledOperationCompletionHandler = YES;
- };
- });
-
- context(@"Head unit supports the `CancelInteration` RPC", ^{
- beforeEach(^{
- SDLVersion *supportedVersion = [SDLVersion versionWithMajor:6 minor:0 patch:0];
- id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
- OCMStub([globalMock rpcVersion]).andReturn(supportedVersion);
- });
-
- context(@"If the operation is executing", ^{
- beforeEach(^{
- [testCancelOp start];
-
- expect(testCancelOp.isExecuting).to(beTrue());
- expect(testCancelOp.isFinished).to(beFalse());
- expect(testCancelOp.isCancelled).to(beFalse());
-
- [testChoiceSet cancel];
- });
-
- it(@"should attempt to send a cancel interaction", ^{
- SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
- expect(lastRequest).to(beAnInstanceOf([SDLCancelInteraction class]));
- expect(lastRequest.cancelID).to(equal(testCancelID));
- expect(lastRequest.functionID).to(equal([SDLFunctionID.sharedInstance functionIdForName:SDLRPCFunctionNamePerformInteraction]));
- });
-
- context(@"If the cancel interaction was successful", ^{
- beforeEach(^{
- SDLCancelInteractionResponse *testCancelInteractionResponse = [[SDLCancelInteractionResponse alloc] init];
- testCancelInteractionResponse.success = @YES;
- [testConnectionManager respondToLastRequestWithResponse:testCancelInteractionResponse];
- });
-
- it(@"should not error", ^{
- expect(testCancelOp.error).to(beNil());
- });
-
- it(@"should not finish", ^{
- expect(hasCalledOperationCompletionHandler).to(beFalse());
- expect(testCancelOp.isExecuting).to(beTrue());
- expect(testCancelOp.isFinished).to(beFalse());
- expect(testCancelOp.isCancelled).to(beFalse());
- });
- });
-
- context(@"If the cancel interaction was not successful", ^{
- __block NSError *testError = [NSError sdl_lifecycle_notConnectedError];
-
- beforeEach(^{
- SDLCancelInteractionResponse *testCancelInteractionResponse = [[SDLCancelInteractionResponse alloc] init];
- testCancelInteractionResponse.success = @NO;
- [testConnectionManager respondToLastRequestWithResponse:testCancelInteractionResponse error:testError];
- });
-
- it(@"should error", ^{
- expect(testCancelOp.error).to(equal(testError));
- });
-
- it(@"should not finish", ^{
- expect(hasCalledOperationCompletionHandler).to(beFalse());
- expect(testCancelOp.isExecuting).to(beTrue());
- expect(testCancelOp.isFinished).to(beFalse());
- expect(testCancelOp.isCancelled).to(beFalse());
- });
- });
- });
-
- context(@"If the operation has already finished", ^{
- beforeEach(^{
- [testCancelOp finishOperation];
-
- expect(testCancelOp.isExecuting).to(beFalse());
- expect(testCancelOp.isFinished).to(beTrue());
- expect(testCancelOp.isCancelled).to(beFalse());
-
- [testChoiceSet cancel];
- });
-
- it(@"should not attempt to send a cancel interaction", ^{
- SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
- expect(lastRequest).toNot(beAnInstanceOf([SDLCancelInteraction class]));
- });
- });
-
- context(@"If the started operation has been canceled", ^{
- beforeEach(^{
- [testCancelOp start];
- [testCancelOp cancel];
-
- expect(testCancelOp.isExecuting).to(beTrue());
- expect(testCancelOp.isFinished).to(beFalse());
- expect(testCancelOp.isCancelled).to(beTrue());
-
- [testChoiceSet cancel];
- });
-
- it(@"should not attempt to send a cancel interaction", ^{
- SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
- expect(lastRequest).toNot(beAnInstanceOf([SDLCancelInteraction class]));
- });
-
- it(@"should not finish", ^{
- expect(hasCalledOperationCompletionHandler).toEventually(beFalse());
- expect(testCancelOp.isExecuting).toEventually(beTrue());
- expect(testCancelOp.isFinished).toEventually(beFalse());
- expect(testCancelOp.isCancelled).toEventually(beTrue());
- });
- });
-
- context(@"If the operation has not started", ^{
- beforeEach(^{
- expect(testCancelOp.isExecuting).to(beFalse());
- expect(testCancelOp.isFinished).to(beFalse());
- expect(testCancelOp.isCancelled).to(beFalse());
-
- [testChoiceSet cancel];
- });
-
- it(@"should not attempt to send a cancel interaction", ^{
- SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
- expect(lastRequest).toNot(beAnInstanceOf([SDLCancelInteraction class]));
- });
-
- context(@"Once the operation has started", ^{
- beforeEach(^{
- [testCancelOp start];
- });
-
- it(@"should not attempt to send a cancel interaction", ^{
- SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
- expect(lastRequest).toNot(beAnInstanceOf([SDLCancelInteraction class]));
- });
-
- it(@"should finish", ^{
- expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
- expect(testCancelOp.isExecuting).toEventually(beFalse());
- expect(testCancelOp.isFinished).toEventually(beTrue());
- expect(testCancelOp.isCancelled).toEventually(beTrue());
- });
- });
- });
- });
-
- context(@"Head unit does not support the `CancelInteration` RPC", ^{
- beforeEach(^{
- SDLVersion *unsupportedVersion = [SDLVersion versionWithMajor:5 minor:1 patch:0];
- id globalMock = OCMPartialMock([SDLGlobals sharedGlobals]);
- OCMStub([globalMock rpcVersion]).andReturn(unsupportedVersion);
- });
-
- it(@"should not attempt to send a cancel interaction if the operation is executing", ^{
- [testCancelOp start];
-
- expect(testCancelOp.isExecuting).to(beTrue());
- expect(testCancelOp.isFinished).to(beFalse());
- expect(testCancelOp.isCancelled).to(beFalse());
-
- [testChoiceSet cancel];
-
- SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
- expect(lastRequest).toNot(beAnInstanceOf([SDLCancelInteraction class]));
- });
-
- it(@"should cancel the operation if it has not yet been run", ^{
- expect(testCancelOp.isExecuting).to(beFalse());
- expect(testCancelOp.isFinished).to(beFalse());
- expect(testCancelOp.isCancelled).to(beFalse());
-
- [testChoiceSet cancel];
-
- SDLCancelInteraction *lastRequest = testConnectionManager.receivedRequests.lastObject;
- expect(lastRequest).toNot(beAnInstanceOf([SDLCancelInteraction class]));
-
- expect(testCancelOp.isExecuting).to(beFalse());
- expect(testCancelOp.isFinished).to(beFalse());
- expect(testCancelOp.isCancelled).to(beTrue());
- });
- });
- });
- });
-
- describe(@"running a searchable choice set operation", ^{
- beforeEach(^{
- testOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:testKeyboardProperties keyboardDelegate:testKeyboardDelegate cancelID:testCancelID windowCapability:windowCapability];
-
- testOp.completionBlock = ^{
- hasCalledOperationCompletionHandler = YES;
- };
- [testOp start];
- });
-
- it(@"should ask for custom properties", ^{
- OCMVerify([testKeyboardDelegate customKeyboardConfiguration]);
- });
-
- it(@"should update global keyboard properties", ^{
- expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
- });
-
- describe(@"presenting the keyboard", ^{
- beforeEach(^{
- SDLSetGlobalPropertiesResponse *response = [[SDLSetGlobalPropertiesResponse alloc] init];
- response.success = @YES;
- [testConnectionManager respondToLastRequestWithResponse:response];
- });
-
- it(@"should send the perform interaction", ^{
- expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLPerformInteraction class]));
- SDLPerformInteraction *request = testConnectionManager.receivedRequests.lastObject;
- expect(request.initialText).to(equal(testChoiceSet.title));
- expect(request.initialPrompt).to(equal(testChoiceSet.initialPrompt));
- expect(request.interactionMode).to(equal(testInteractionMode));
- expect(request.interactionLayout).to(equal(SDLLayoutModeIconWithSearch));
- expect(request.timeoutPrompt).to(equal(testChoiceSet.timeoutPrompt));
- expect(request.helpPrompt).to(equal(testChoiceSet.helpPrompt));
- expect(request.timeout).to(equal(testChoiceSet.timeout * 1000));
- expect(request.vrHelp).to(beNil());
- expect(request.interactionChoiceSetIDList).to(equal(@[@65535]));
- expect(request.cancelID).to(equal(testCancelID));
- });
-
- it(@"should respond to submitted notifications", ^{
- NSString *inputData = @"Test";
- SDLRPCNotificationNotification *notification = nil;
-
- // Submit notification
- SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
- input.event = SDLKeyboardEventSubmitted;
- input.data = inputData;
- notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
-
- [[NSNotificationCenter defaultCenter] postNotification:notification];
-
- OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventSubmitted];
- }] text:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(NSString *)obj isEqualToString:inputData];
- }]]);
-
- OCMVerify([testKeyboardDelegate userDidSubmitInput:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(NSString *)obj isEqualToString:inputData];
- }] withEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventSubmitted];
- }]]);
- });
-
- it(@"should respond to voice request notifications", ^{
- SDLRPCNotificationNotification *notification = nil;
-
- // Submit notification
- SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
- input.event = SDLKeyboardEventVoice;
- notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
-
- [[NSNotificationCenter defaultCenter] postNotification:notification];
-
- OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventVoice];
- }] text:[OCMArg isNil]]);
-
- OCMVerify([testKeyboardDelegate userDidSubmitInput:[OCMArg isNil] withEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventVoice];
- }]]);
- });
-
- it(@"should respond to abort notifications", ^{
- SDLRPCNotificationNotification *notification = nil;
-
- // Submit notification
- SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
- input.event = SDLKeyboardEventAborted;
- notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
-
- [[NSNotificationCenter defaultCenter] postNotification:notification];
-
- OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventAborted];
- }] text:[OCMArg isNil]]);
-
- OCMVerify([testKeyboardDelegate keyboardDidAbortWithReason:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventAborted];
- }]]);
- });
-
- it(@"should respond to enabled keyboard event", ^{
- SDLRPCNotificationNotification *notification = nil;
-
- // Submit notification
- SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
- input.event = SDLKeyboardEventInputKeyMaskEnabled;
- notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
-
- [[NSNotificationCenter defaultCenter] postNotification:notification];
-
- OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
- }] text:[OCMArg isNil]]);
-
- OCMVerify([testKeyboardDelegate keyboardDidUpdateInputMask:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
- }]]);
- });
-
- it(@"should respond to cancellation notifications", ^{
- SDLRPCNotificationNotification *notification = nil;
-
- // Submit notification
- SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
- input.event = SDLKeyboardEventCancelled;
- notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
-
- [[NSNotificationCenter defaultCenter] postNotification:notification];
-
- OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventCancelled];
- }] text:[OCMArg isNil]]);
-
- OCMVerify([testKeyboardDelegate keyboardDidAbortWithReason:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventCancelled];
- }]]);
- });
-
- it(@"should respond to text input notification with autocomplete", ^{
- NSString *inputData = @"Test";
- SDLRPCNotificationNotification *notification = nil;
-
- OCMStub([testKeyboardDelegate updateAutocompleteWithInput:[OCMArg any] autoCompleteResultsHandler:([OCMArg invokeBlockWithArgs:@[inputData], nil])]);
-
- // Submit notification
- SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
- input.event = SDLKeyboardEventKeypress;
- input.data = inputData;
- notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
-
- [[NSNotificationCenter defaultCenter] postNotification:notification];
-
- OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventKeypress];
- }] text:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(NSString *)obj isEqualToString:inputData];
- }]]);
-
- OCMVerify([testKeyboardDelegate updateAutocompleteWithInput:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(NSString *)obj isEqualToString:inputData];
- }] autoCompleteResultsHandler:[OCMArg any]]);
-
- expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
-
- SDLSetGlobalProperties *setProperties = testConnectionManager.receivedRequests.lastObject;
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(setProperties.keyboardProperties.autoCompleteText).to(equal(inputData));
-#pragma clang diagnostic pop
- });
-
- it(@"should respond to text input notification with character set", ^{
- NSString *inputData = @"Test";
- SDLRPCNotificationNotification *notification = nil;
-
- OCMStub([testKeyboardDelegate updateCharacterSetWithInput:[OCMArg any] completionHandler:([OCMArg invokeBlockWithArgs:@[inputData], nil])]);
-
- // Submit notification
- SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
- input.event = SDLKeyboardEventKeypress;
- input.data = inputData;
- notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
-
- [[NSNotificationCenter defaultCenter] postNotification:notification];
-
- OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventKeypress];
- }] text:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(NSString *)obj isEqualToString:inputData];
- }]]);
-
- OCMVerify([testKeyboardDelegate updateCharacterSetWithInput:[OCMArg checkWithBlock:^BOOL(id obj) {
- return [(NSString *)obj isEqualToString:inputData];
- }] completionHandler:[OCMArg any]]);
-
- expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
-
- SDLSetGlobalProperties *setProperties = testConnectionManager.receivedRequests.lastObject;
- expect(setProperties.keyboardProperties.limitedCharacterList).to(equal(@[inputData]));
- });
-
- describe(@"after a perform interaction response", ^{
- beforeEach(^{
- SDLPerformInteractionResponse *response = [[SDLPerformInteractionResponse alloc] init];
- response.success = @YES;
-
- [testConnectionManager respondToLastRequestWithResponse:response];
- });
-
- it(@"should reset the keyboard properties", ^{
- expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLSetGlobalProperties class]));
- });
-
- describe(@"after the reset response", ^{
- beforeEach(^{
- SDLSetGlobalPropertiesResponse *response = [[SDLSetGlobalPropertiesResponse alloc] init];
- response.success = @YES;
- [testConnectionManager respondToLastRequestWithResponse:response];
- });
-
- it(@"should be finished", ^{
- expect(hasCalledOperationCompletionHandler).toEventually(beTrue());
- expect(testOp.isFinished).toEventually(beTrue());
- });
- });
- });
- });
- });
-});
-
-QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
index e18bda43f..4b4b0ecf9 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
@@ -1,8 +1,10 @@
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
#import "SDLError.h"
#import "SDLFile.h"
+#import "SDLFileManager.h"
#import "SDLFileWrapper.h"
#import "SDLGlobals.h"
#import "SDLProtocolHeader.h"
@@ -91,6 +93,7 @@ describe(@"Streaming upload of data", ^{
__block NSUInteger expectedNumberOfPutFiles = 0;
__block TestConnectionManager *testConnectionManager = nil;
+ __block SDLFileManager *mockFileManager = nil;
__block SDLUploadFileOperation *testOperation = nil;
__block BOOL successResult = NO;
@@ -112,18 +115,71 @@ describe(@"Streaming upload of data", ^{
testOperation = nil;
testConnectionManager = [[TestConnectionManager alloc] init];
+ mockFileManager = OCMClassMock([SDLFileManager class]);
successResult = NO;
bytesAvailableResult = NO;
errorResult = nil;
});
- describe(@"When uploading data", ^{
+ describe(@"when the file is already on the head unit", ^{
+ context(@"when not overwriting", ^{
+ beforeEach(^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(NO);
+ });
+
+ it(@"should not send the upload RPCs and finish the operation", ^{
+ testFileName = @"TestSmallMemory";
+ testFileData = [@"test1234" dataUsingEncoding:NSUTF8StringEncoding];
+ testFile = [SDLFile fileWithData:testFileData name:testFileName fileExtension:@"bin"];
+
+ testFileWrapper = [SDLFileWrapper wrapperWithFile:testFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ expect(success).to(beFalse());
+ expect(bytesAvailable).to(equal(NSNotFound));
+ expect(error).toNot(beNil());
+ }];
+
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager fileManager:mockFileManager];
+ [testOperation start];
+
+ expect(testConnectionManager.receivedRequests).to(haveCount(0));
+ expect(testOperation.isFinished).to(beTrue());
+ });
+ });
+
+ context(@"when overwriting", ^{
+ beforeEach(^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(YES);
+ });
+
+ it(@"should send the upload RPCs", ^{
+ testFileName = @"TestSmallMemory";
+ testFileData = [@"test1234" dataUsingEncoding:NSUTF8StringEncoding];
+ testFile = [SDLFile fileWithData:testFileData name:testFileName fileExtension:@"bin"];
+ testFile.overwrite = YES;
+
+ testFileWrapper = [SDLFileWrapper wrapperWithFile:testFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ expect(success).to(beFalse());
+ expect(bytesAvailable).to(equal(NSNotFound));
+ expect(error).toNot(beNil());
+ }];
+
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager fileManager:mockFileManager];
+ [testOperation start];
+
+ expect(testConnectionManager.receivedRequests).to(haveCount(1));
+ expect(testOperation.isFinished).to(beFalse());
+ });
+ });
+ });
+
+ describe(@"when uploading data", ^{
__block NSInteger spaceLeft = 0;
__block SDLPutFileResponse *successResponse = nil;
beforeEach(^{
spaceLeft = 11212512;
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
});
context(@"data should be split into smaller packets if too large to send all at once", ^{
@@ -140,7 +196,7 @@ describe(@"Streaming upload of data", ^{
expectedNumberOfPutFiles = [UploadFileOperationSpecHelpers testNumberOfPutFiles:testFile mtuSize:testMTUSize];
- testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager fileManager:mockFileManager];
[testOperation start];
NSArray<SDLPutFile *> *testPutFiles = testConnectionManager.receivedRequests;
@@ -174,7 +230,7 @@ describe(@"Streaming upload of data", ^{
expectedNumberOfPutFiles = [UploadFileOperationSpecHelpers testNumberOfPutFiles:testFile mtuSize:testMTUSize];
- testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager fileManager:mockFileManager];
[testOperation start];
NSArray<SDLPutFile *> *putFiles = testConnectionManager.receivedRequests;
@@ -208,7 +264,7 @@ describe(@"Streaming upload of data", ^{
expectedNumberOfPutFiles = [UploadFileOperationSpecHelpers testNumberOfPutFiles:testFile mtuSize:testMTUSize];
- testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager fileManager:mockFileManager];
[testOperation start];
NSArray<SDLPutFile *> *putFiles = testConnectionManager.receivedRequests;
@@ -243,7 +299,7 @@ describe(@"Streaming upload of data", ^{
expectedNumberOfPutFiles = [UploadFileOperationSpecHelpers testNumberOfPutFiles:testFile mtuSize:testMTUSize];
- testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager fileManager:mockFileManager];
[testOperation start];
NSArray<SDLPutFile *> *putFiles = testConnectionManager.receivedRequests;
@@ -264,8 +320,9 @@ describe(@"Streaming upload of data", ^{
});
});
- describe(@"When a response to the data upload comes back", ^{
+ describe(@"when a response to the data upload comes back", ^{
beforeEach(^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg isNotNil]]).andReturn(YES);
testFileName = @"TestLargeMemory";
UIImage *testImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
testFileData = UIImageJPEGRepresentation(testImage, 1.0);
@@ -279,11 +336,11 @@ describe(@"Streaming upload of data", ^{
expectedNumberOfPutFiles = [UploadFileOperationSpecHelpers testNumberOfPutFiles:testFile mtuSize:testMTUSize];
testConnectionManager = [[TestConnectionManager alloc] init];
- testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager fileManager:mockFileManager];
[testOperation start];
});
- context(@"If data was sent successfully", ^{
+ context(@"if data was sent successfully", ^{
__block NSInteger spaceLeft = 0;
__block SDLPutFileResponse *successResponse = nil;
@@ -308,7 +365,7 @@ describe(@"Streaming upload of data", ^{
});
});
- context(@"If data was not sent successfully", ^{
+ context(@"if data was not sent successfully", ^{
__block SDLPutFileResponse *response = nil;
__block NSString *responseErrorDescription = nil;
__block NSString *responseErrorReason = nil;
@@ -321,74 +378,86 @@ describe(@"Streaming upload of data", ^{
spaceLeft = 11212512;
});
- it(@"should have called the completion handler with error if the first packet was not sent successfully", ^{
- for (int i = 0; i < expectedNumberOfPutFiles; i++) {
- response = [[SDLPutFileResponse alloc] init];
- response.spaceAvailable = @(spaceLeft -= 1024);
-
- if (i == 0) {
- // Only the first packet is sent unsuccessfully
- response.success = @NO;
- responseErrorDescription = @"some description";
- responseErrorReason = @"some reason";
- error = [NSError sdl_lifecycle_unknownRemoteErrorWithDescription:responseErrorDescription andReason:responseErrorReason];
- } else {
- response.success = @YES;
- error = nil;
+ context(@"when the first packet is not successful", ^{
+ beforeEach(^{
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
+ response = [[SDLPutFileResponse alloc] init];
+ response.spaceAvailable = @(spaceLeft -= 1024);
+
+ if (i == 0) {
+ // Only the first packet is sent unsuccessfully
+ response.success = @NO;
+ responseErrorDescription = @"some description";
+ responseErrorReason = @"some reason";
+ error = [NSError sdl_lifecycle_unknownRemoteErrorWithDescription:responseErrorDescription andReason:responseErrorReason];
+ } else {
+ response.success = @YES;
+ error = nil;
+ }
+
+ [testConnectionManager respondToRequestWithResponse:response requestNumber:i error:error];
}
+ });
- [testConnectionManager respondToRequestWithResponse:response requestNumber:i error:error];
- }
-
- expect(errorResult.localizedDescription).toEventually(match(responseErrorDescription));
- expect(errorResult.localizedFailureReason).toEventually(match(responseErrorReason));
- expect(successResult).toEventually(beFalse());
+ it(@"should have called the completion handler with error", ^{
+ expect(errorResult.localizedDescription).toEventually(match(responseErrorDescription));
+ expect(errorResult.localizedFailureReason).toEventually(match(responseErrorReason));
+ expect(successResult).toEventually(beFalse());
+ });
});
- it(@"should have called the completion handler with error if the last packet was not sent successfully", ^{
- for (int i = 0; i < expectedNumberOfPutFiles; i++) {
- response = [[SDLPutFileResponse alloc] init];
- response.spaceAvailable = @(spaceLeft -= 1024);
-
- if (i == (expectedNumberOfPutFiles - 1)) {
- // Only the last packet is sent unsuccessfully
- response.success = @NO;
- responseErrorDescription = @"some description";
- responseErrorReason = @"some reason";
- error = [NSError sdl_lifecycle_unknownRemoteErrorWithDescription:responseErrorDescription andReason:responseErrorReason];
- } else {
- response.success = @YES;
- error = nil;
+ context(@"when the last packet is not successful", ^{
+ it(@"should have called the completion handler with error", ^{
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
+ response = [[SDLPutFileResponse alloc] init];
+ response.spaceAvailable = @(spaceLeft -= 1024);
+
+ if (i == (expectedNumberOfPutFiles - 1)) {
+ // Only the last packet is sent unsuccessfully
+ response.success = @NO;
+ responseErrorDescription = @"some description";
+ responseErrorReason = @"some reason";
+ error = [NSError sdl_lifecycle_unknownRemoteErrorWithDescription:responseErrorDescription andReason:responseErrorReason];
+ } else {
+ response.success = @YES;
+ error = nil;
+ }
+
+ [testConnectionManager respondToRequestWithResponse:response requestNumber:i error:error];
}
- [testConnectionManager respondToRequestWithResponse:response requestNumber:i error:error];
- }
-
- expect(errorResult.localizedDescription).toEventually(match(responseErrorDescription));
- expect(errorResult.localizedFailureReason).toEventually(match(responseErrorReason));
- expect(successResult).toEventually(beFalse());
+ expect(errorResult.localizedDescription).toEventually(match(responseErrorDescription));
+ expect(errorResult.localizedFailureReason).toEventually(match(responseErrorReason));
+ expect(successResult).toEventually(beFalse());
+ });
});
- it(@"should have called the completion handler with error if all packets were not sent successfully", ^{
- for (int i = 0; i < expectedNumberOfPutFiles; i++) {
- response = [[SDLPutFileResponse alloc] init];
- response.success = @NO;
- response.spaceAvailable = @(spaceLeft -= 1024);
+ context(@"when all the packets are not successful", ^{
+ it(@"should have called the completion handler with error if all packets were not sent successfully", ^{
+ for (int i = 0; i < expectedNumberOfPutFiles; i++) {
+ response = [[SDLPutFileResponse alloc] init];
+ response.success = @NO;
+ response.spaceAvailable = @(spaceLeft -= 1024);
- responseErrorDescription = @"some description";
- responseErrorReason = @"some reason";
+ responseErrorDescription = @"some description";
+ responseErrorReason = @"some reason";
- [testConnectionManager respondToRequestWithResponse:response requestNumber:i error:[NSError sdl_lifecycle_unknownRemoteErrorWithDescription:responseErrorDescription andReason:responseErrorReason]];
- }
+ [testConnectionManager respondToRequestWithResponse:response requestNumber:i error:[NSError sdl_lifecycle_unknownRemoteErrorWithDescription:responseErrorDescription andReason:responseErrorReason]];
+ }
- expect(errorResult.localizedDescription).toEventually(match(responseErrorDescription));
- expect(errorResult.localizedFailureReason).toEventually(match(responseErrorReason));
- expect(successResult).toEventually(beFalse());
+ expect(errorResult.localizedDescription).toEventually(match(responseErrorDescription));
+ expect(errorResult.localizedFailureReason).toEventually(match(responseErrorReason));
+ expect(successResult).toEventually(beFalse());
+ });
});
});
});
describe(@"when an incorrect file url is passed", ^{
+ beforeEach(^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(YES);
+ });
+
it(@"should have called the completion handler with an error", ^{
NSString *fileName = @"testImagePNG";
testFileName = fileName;
@@ -402,12 +471,16 @@ describe(@"Streaming upload of data", ^{
}];
testConnectionManager = [[TestConnectionManager alloc] init];
- testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager fileManager:mockFileManager];
[testOperation start];
});
});
describe(@"when empty data is passed", ^{
+ beforeEach(^{
+ OCMStub([mockFileManager fileNeedsUpload:[OCMArg any]]).andReturn(YES);
+ });
+
it(@"should have called the completion handler with an error", ^{
testFileName = @"TestEmptyMemory";
testFileData = [@"" dataUsingEncoding:NSUTF8StringEncoding];
@@ -419,7 +492,7 @@ describe(@"Streaming upload of data", ^{
}];
testConnectionManager = [[TestConnectionManager alloc] init];
- testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager fileManager:mockFileManager];
[testOperation start];
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/PayloadSpecs/SDLSecurityQueryPayloadSpec.m b/SmartDeviceLinkTests/RPCSpecs/PayloadSpecs/SDLSecurityQueryPayloadSpec.m
new file mode 100644
index 000000000..5ebe9ce28
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/PayloadSpecs/SDLSecurityQueryPayloadSpec.m
@@ -0,0 +1,80 @@
+//
+// SDLSecurityQueryPayloadSpec.m
+// SmartDeviceLinkTests
+//
+// Created by Frank Elias on 8/12/21.
+// Copyright © 2021 smartdevicelink. All rights reserved.
+//
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLRPCParameterNames.h"
+#import "SDLRPCFunctionNames.h"
+#import "SDLSecurityQueryPayload.h"
+#import "SDLSecurityQueryErrorCode.h"
+
+QuickSpecBegin(SDLSecurityQueryPayloadSpec)
+
+__block SDLSecurityQueryPayload* testPayload;
+__block NSDictionary* dict = @{@"id": @"3", @"text": @"SDL does not support encryption"};
+
+NSData* (^testData)(void) = ^NSData* {
+ NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:0];
+ NSData* binaryData = [NSData dataWithBytes:"PrimitiveString" length:strlen("PrimitiveString")];
+
+ Byte header[12] = {0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0x43, 0x00, 0x00, 0x00, 0x00};
+ *(UInt32 *)&header[8] = CFSwapInt32HostToBig((unsigned int)jsonData.length);
+
+ NSMutableData *data = [NSMutableData dataWithCapacity:12 + jsonData.length];
+ [data appendBytes:&header length:12];
+ [data appendData:jsonData];
+ [data appendData:binaryData];
+
+ return data;
+};
+
+beforeSuite(^{
+ testPayload = [[SDLSecurityQueryPayload alloc] init];
+
+ testPayload.queryType = 0x20;
+ testPayload.queryID = 0x02;
+ testPayload.sequenceNumber = 0x1443;
+ testPayload.jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:0];
+ testPayload.binaryData = [NSData dataWithBytes:"PrimitiveString" length:strlen("PrimitiveString")];
+});
+
+describe(@"Getter/Setter Tests", ^ {
+ it(@"should set and get correctly", ^ {
+ expect(@(testPayload.queryType)).to(equal(SDLSecurityQueryTypeNotification));
+ expect(@(testPayload.queryID)).to(equal(SDLSecurityQueryIdSendInternalError));
+ expect(@(testPayload.sequenceNumber)).to(equal(@0x1443));
+ expect([NSJSONSerialization JSONObjectWithData:testPayload.jsonData options:0 error:0]).to(equal(dict));
+ expect([NSString stringWithUTF8String:[testPayload binaryData].bytes]).to(equal(@"PrimitiveString"));
+ });
+});
+
+describe(@"Data Tests", ^ {
+ it(@"should convert to byte data correctly", ^ {
+ expect(testPayload.convertToData).to(equal(testData()));
+ });
+});
+
+describe(@"RPCPayloadWithData Test", ^ {
+ it(@"should convert from byte data correctly", ^ {
+ SDLSecurityQueryPayload* constructedPayload = [SDLSecurityQueryPayload securityPayloadWithData:testData()];
+
+ expect(@(constructedPayload.queryType)).to(equal(SDLSecurityQueryTypeNotification));
+ expect(@(constructedPayload.queryID)).to(equal(SDLSecurityQueryIdSendInternalError));
+ expect(@(constructedPayload.sequenceNumber)).to(equal(@0x1443));
+ NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:constructedPayload.jsonData options:0 error:0];
+ expect(jsonDict).to(equal(dict));
+ expect(jsonDict[@"text"]).to(equal(SDLSecurityQueryErrorCodeNotSupported));
+ expect([NSString stringWithUTF8String:[constructedPayload binaryData].bytes]).to(equal(@"PrimitiveString"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTireStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTireStatusSpec.m
index 67243d863..81c96a865 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTireStatusSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTireStatusSpec.m
@@ -8,22 +8,39 @@
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
-#import "SDLTireStatus.h"
#import "SDLSingleTireStatus.h"
-#import "SDLWarningLightStatus.h"
+#import "SDLTireStatus.h"
#import "SDLRPCParameterNames.h"
+#import "SDLWarningLightStatus.h"
QuickSpecBegin(SDLTireStatusSpec)
-SDLSingleTireStatus* tire1 = [[SDLSingleTireStatus alloc] init];
-SDLSingleTireStatus* tire2 = [[SDLSingleTireStatus alloc] init];
-SDLSingleTireStatus* tire3 = [[SDLSingleTireStatus alloc] init];
-SDLSingleTireStatus* tire4 = [[SDLSingleTireStatus alloc] init];
-SDLSingleTireStatus* tire5 = [[SDLSingleTireStatus alloc] init];
-SDLSingleTireStatus* tire6 = [[SDLSingleTireStatus alloc] init];
+__block SDLSingleTireStatus* tire1 = nil;
+__block SDLSingleTireStatus* tire2 = nil;
+__block SDLSingleTireStatus* tire3 = nil;
+__block SDLSingleTireStatus* tire4 = nil;
+__block SDLSingleTireStatus* tire5 = nil;
+__block SDLSingleTireStatus* tire6 = nil;
+
+describe(@"Getter/Setter Tests", ^{
-describe(@"Getter/Setter Tests", ^ {
- it(@"Should set and get correctly", ^ {
+ beforeEach(^{
+ tire1 = [[SDLSingleTireStatus alloc] init];
+ tire2 = [[SDLSingleTireStatus alloc] init];
+ tire3 = [[SDLSingleTireStatus alloc] init];
+ tire4 = [[SDLSingleTireStatus alloc] init];
+ tire5 = [[SDLSingleTireStatus alloc] init];
+ tire6 = [[SDLSingleTireStatus alloc] init];
+ // make all tires different to prevent misplacement (eg left front != right front etc.)
+ tire1.pressure = @(1.0);
+ tire2.pressure = @(2.0);
+ tire3.pressure = @(3.0);
+ tire4.pressure = @(4.0);
+ tire5.pressure = @(5.0);
+ tire6.pressure = @(6.0);
+ });
+
+ it(@"Should set and get correctly", ^{
SDLTireStatus* testStruct = [[SDLTireStatus alloc] init];
testStruct.pressureTelltale = SDLWarningLightStatusOff;
@@ -43,7 +60,7 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.innerRightRear).to(equal(tire6));
});
- it(@"Should get correctly when initialized", ^ {
+ it(@"Should get correctly when initialized", ^{
NSMutableDictionary* dict = [@{SDLRPCParameterNamePressureTelltale:SDLWarningLightStatusOff,
SDLRPCParameterNameLeftFront:tire1,
SDLRPCParameterNameRightFront:tire2,
@@ -62,16 +79,37 @@ describe(@"Getter/Setter Tests", ^ {
expect(testStruct.innerRightRear).to(equal(tire6));
});
- it(@"Should return nil if not set", ^ {
- SDLTireStatus* testStruct = [[SDLTireStatus alloc] init];
-
- expect(testStruct.pressureTelltale).to(beNil());
- expect(testStruct.leftFront).to(beNil());
- expect(testStruct.rightFront).to(beNil());
- expect(testStruct.leftRear).to(beNil());
- expect(testStruct.rightRear).to(beNil());
- expect(testStruct.innerLeftRear).to(beNil());
- expect(testStruct.innerRightRear).to(beNil());
+ context(@"Should not return nil if not set", ^{
+ __block SDLTireStatus* testStruct = nil;
+ // default tire status (when it is set to nil)
+ __block SDLSingleTireStatus* tireDefault = nil;
+
+ beforeEach(^{
+ testStruct = [[SDLTireStatus alloc] init];
+ tireDefault = [[SDLSingleTireStatus alloc] init];
+ tireDefault.status = SDLComponentVolumeStatusUnknown;
+ tireDefault.pressure = nil;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
+ testStruct.pressureTelltale = nil;
+ testStruct.leftFront = nil;
+ testStruct.rightFront = nil;
+ testStruct.leftRear = nil;
+ testStruct.rightRear = nil;
+ testStruct.innerLeftRear = nil;
+ testStruct.innerRightRear = nil;
+#pragma clang diagnostic pop
+ });
+
+ it(@"Should not return nil if not set", ^{
+ expect(testStruct.pressureTelltale).to(equal(SDLWarningLightStatusNotUsed));
+ expect(testStruct.leftFront).to(equal(tireDefault));
+ expect(testStruct.rightFront).to(equal(tireDefault));
+ expect(testStruct.leftRear).to(equal(tireDefault));
+ expect(testStruct.rightRear).to(equal(tireDefault));
+ expect(testStruct.innerLeftRear).to(equal(tireDefault));
+ expect(testStruct.innerRightRear).to(equal(tireDefault));
+ });
});
});
diff --git a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m
index 63eb97f95..92f3e9abb 100644
--- a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m
+++ b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m
@@ -22,7 +22,7 @@ typedef NS_ENUM(NSUInteger, MenuCellState) {
MenuCellStateKeep
};
-describe(@"menuUpdateAlgorithm", ^{
+describe(@"The menu update algorithm", ^{
__block SDLDynamicMenuUpdateRunScore *runScore = nil;
__block SDLMenuCell *oldCell1 = nil;
@@ -39,7 +39,7 @@ describe(@"menuUpdateAlgorithm", ^{
__block SDLMenuCell *newCell5 = nil;
__block SDLMenuCell *newCell6 = nil;
- // 0 = Delete 1 = Add 2 = Keep
+ // 0 = Delete, 1 = Add, 2 = Keep
describe(@"compare old and new menu cells", ^{
beforeEach(^{
oldCell1 = [[SDLMenuCell alloc] initWithTitle:@"Cell 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}];
@@ -58,11 +58,10 @@ describe(@"menuUpdateAlgorithm", ^{
});
it(@"should have a new menu status of 22221 and an old menu status of 2222 on best run", ^{
-
NSArray<SDLMenuCell *> *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4];
NSArray<SDLMenuCell *> *updatedMenuCells = @[newCell1, newCell2, newCell3, newCell4, newCell5];
- runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
+ runScore = [SDLDynamicMenuUpdateAlgorithm dynamicRunScoreOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
expect(runScore.updatedStatus.count).to(equal(5));
expect(runScore.oldStatus.count).to(equal(4));
@@ -85,7 +84,7 @@ describe(@"menuUpdateAlgorithm", ^{
NSArray<SDLMenuCell *> *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4];
NSArray<SDLMenuCell *> *updatedMenuCells = @[newCell1, newCell2, newCell3];
- runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
+ runScore = [SDLDynamicMenuUpdateAlgorithm dynamicRunScoreOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
expect(runScore.updatedStatus.count).to(equal(3));
expect(runScore.oldStatus.count).to(equal(4));
@@ -105,7 +104,7 @@ describe(@"menuUpdateAlgorithm", ^{
NSArray<SDLMenuCell *> *oldMenuCells = @[oldCell1, oldCell2, oldCell3];
NSArray<SDLMenuCell *> *updatedMenuCells = @[newCell4, newCell5, newCell6];
- runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
+ runScore = [SDLDynamicMenuUpdateAlgorithm dynamicRunScoreOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
expect(runScore.updatedStatus.count).to(equal(3));
expect(runScore.oldStatus.count).to(equal(3));
@@ -124,7 +123,7 @@ describe(@"menuUpdateAlgorithm", ^{
NSArray<SDLMenuCell *> *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4];
NSArray<SDLMenuCell *> *updatedMenuCells = @[oldCell2, oldCell1, oldCell4, oldCell3 ];
- runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
+ runScore = [SDLDynamicMenuUpdateAlgorithm dynamicRunScoreOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
expect(runScore.updatedStatus.count).to(equal(4));
expect(runScore.oldStatus.count).to(equal(4));
@@ -145,7 +144,7 @@ describe(@"menuUpdateAlgorithm", ^{
NSArray<SDLMenuCell *> *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4];
NSArray<SDLMenuCell *> *updatedMenuCells = @[];
- runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
+ runScore = [SDLDynamicMenuUpdateAlgorithm dynamicRunScoreOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
expect(runScore.updatedStatus.count).to(equal(0));
expect(runScore.oldStatus.count).to(equal(4));
@@ -161,7 +160,7 @@ describe(@"menuUpdateAlgorithm", ^{
NSArray<SDLMenuCell *> *oldMenuCells = @[];
NSArray<SDLMenuCell *> *updatedMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4];
- runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
+ runScore = [SDLDynamicMenuUpdateAlgorithm dynamicRunScoreOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
expect(runScore.updatedStatus.count).to(equal(4));
expect(runScore.oldStatus.count).to(equal(0));
@@ -178,9 +177,9 @@ describe(@"menuUpdateAlgorithm", ^{
NSArray<SDLMenuCell *> *oldMenuCells = @[];
NSArray<SDLMenuCell *> *updatedMenuCells = @[];
- runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
+ runScore = [SDLDynamicMenuUpdateAlgorithm dynamicRunScoreOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells];
- expect(runScore).to(beNil());
+ expect(runScore.isEmpty).to(beTrue());
});
});
});
diff --git a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
index 525ad3052..2312e6084 100644
--- a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
+++ b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
@@ -55,6 +55,10 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)sendRequests:(nonnull NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleAsyncRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
+ if (requests.count == 0) {
+ return completionHandler(YES);
+ }
+
[requests enumerateObjectsUsingBlock:^(SDLRPCRequest * _Nonnull request, NSUInteger idx, BOOL * _Nonnull stop) {
[self sendConnectionRequest:request withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if (progressHandler != nil) {
@@ -67,6 +71,10 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)sendSequentialRequests:(nonnull NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleSequentialRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler {
+ if (requests.count == 0) {
+ return completionHandler(YES);
+ }
+
[requests enumerateObjectsUsingBlock:^(SDLRPCRequest * _Nonnull request, NSUInteger idx, BOOL * _Nonnull stop) {
[self sendConnectionRequest:request withResponseHandler:nil];
progressHandler(request, nil, nil, (double)idx / (double)requests.count);
diff --git a/docs/Classes.html b/docs/Classes.html
index 86cb90b3a..903dd2040 100644
--- a/docs/Classes.html
+++ b/docs/Classes.html
@@ -499,20 +499,13 @@
SDLAlertAudioData
</h3>
- <p>Undocumented</p>
+ <p>Audio data for an SDLAlertView</p>
<a href="Classes/SDLAlertAudioData.html" class="slightly-smaller">See more</a>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLAlertAudioData</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLAudioData.html">SDLAudioData</a></span>
-
-<span class="c1">/// Whether the alert tone should be played before the prompt (if any) is spoken. Defaults to NO.</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">BOOL</span> <span class="n">playTone</span><span class="p">;</span>
-
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_UNAVAILABLE</span><span class="p">;</span>
-
-<span class="k">@end</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLAlertAudioData</span> <span class="p">:</span> <span class="nc"><a href="Classes/SDLAudioData.html">SDLAudioData</a></span></code></pre>
<h4>Swift</h4>
@@ -587,65 +580,13 @@
SDLAlertView
</h3>
- <p>Undocumented</p>
+ <p>An alert view to be displayed on the remote module. Pass this object to the SDLScreenManager to display.</p>
<a href="Classes/SDLAlertView.html" class="slightly-smaller">See more</a>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLAlertView</span> <span class="p">:</span> <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span>
-
-<span class="c1">/// Set this to change the default timeout for all alerts. If a timeout is not set on an individual alert object (or if it is set to 0.0), then it will use this timeout instead. See `timeout` for more details. If this is not set by you, it will default to 5 seconds. The minimum is 3 seconds, the maximum is 10 seconds. If this is set below the minimum, it will be capped at 3 seconds. If this is set above the maximum, it will be capped at 10 seconds.</span>
-<span class="c1">/// Please note that if a button is added to the alert, the defaultTimeout and timeout values will be ignored.</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">class</span><span class="p">,</span> <span class="n">assign</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSTimeInterval</span> <span class="n">defaultTimeout</span><span class="p">;</span>
-
-<span class="c1">/// The primary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">text</span><span class="p">;</span>
-
-<span class="c1">/// The secondary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">secondaryText</span><span class="p">;</span>
-
-<span class="c1">/// The tertiary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">tertiaryText</span><span class="p">;</span>
-
-<span class="c1">/// Timeout in seconds. Defaults to 0, which will use `defaultTimeout`. If this is set below the minimum, it will be capped at 3 seconds. Minimum 3 seconds, maximum 10 seconds. If this is set above the maximum, it will be capped at 10 seconds. Defaults to 0.</span>
-<span class="c1">/// Please note that if a button is added to the alert, the defaultTimeout and timeout values will be ignored.</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSTimeInterval</span> <span class="n">timeout</span><span class="p">;</span>
-
-<span class="c1">/// Text spoken, file(s) played, and/or tone played when the alert appears</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="Classes/SDLAlertAudioData.html">SDLAlertAudioData</a></span> <span class="o">*</span><span class="n">audio</span><span class="p">;</span>
-
-<span class="c1">/// If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation. Defaults to NO.</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">BOOL</span> <span class="n">showWaitIndicator</span><span class="p">;</span>
-
-<span class="c1">/// Soft buttons the user may select to perform actions. Only one `SDLSoftButtonState` per object is supported; if any soft button object contains multiple states, an exception will be thrown.</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">softButtons</span><span class="p">;</span>
-
-<span class="c1">/// An artwork that will be displayed when the icon appears. This will be uploaded prior to the appearance of the alert if necessary. This will not be uploaded if the head unit does not declare support for alertIcon.</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="n">icon</span><span class="p">;</span>
-
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_DESIGNATED_INITIALIZER</span><span class="p">;</span>
-
-<span class="c1">/// Initialize a basic alert with a message and buttons</span>
-<span class="c1">/// @param text The primary line of text for display on the alert</span>
-<span class="c1">/// @param softButtons Soft buttons the user may select to perform actions</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithText</span><span class="p">:(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">text</span> <span class="nf">buttons</span><span class="p">:(</span><span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">softButtons</span><span class="p">;</span>
-
-<span class="c1">/// Initialize a alert with a text, image, buttons and sound</span>
-<span class="c1">/// @param text The primary line of text for display on the alert</span>
-<span class="c1">/// @param secondaryText The secondary line of text for display on the alert</span>
-<span class="c1">/// @param tertiaryText The tertiary line of text for display on the alert</span>
-<span class="c1">/// @param timeout Timeout in seconds</span>
-<span class="c1">/// @param showWaitIndicator If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation</span>
-<span class="c1">/// @param audio Text spoken and/or tone played when the alert appears</span>
-<span class="c1">/// @param softButtons Soft buttons the user may select to perform actions</span>
-<span class="c1">/// @param icon An artwork that will be displayed when the icon appears</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">text</span> <span class="nf">secondaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">secondaryText</span> <span class="nf">tertiaryText</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">tertiaryText</span> <span class="nf">timeout</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="Protocols.html#/c:objc(pl)SDLFloat">SDLFloat</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">timeout</span> <span class="nf">showWaitIndicator</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">showWaitIndicator</span> <span class="nf">audioIndication</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="Classes/SDLAlertAudioData.html">SDLAlertAudioData</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">audio</span> <span class="nf">buttons</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="Classes/SDLSoftButtonObject.html">SDLSoftButtonObject</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">softButtons</span> <span class="nf">icon</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="Classes/SDLArtwork.html">SDLArtwork</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">icon</span><span class="p">;</span>
-
-<span class="c1">/// Cancels the alert. If the alert has not yet been sent to the module, it will not be sent. If the alert is already presented on the module, the alert will be immediately dismissed. Canceling an already presented alert will only work if connected to modules supporting RPC Spec v.6.0+. On older versions the alert will not be dismissed.</span>
-<span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">cancel</span><span class="p">;</span>
-
-<span class="k">@end</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLAlertView</span> <span class="p">:</span> <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span></code></pre>
<h4>Swift</h4>
@@ -860,48 +801,13 @@
SDLAudioData
</h3>
- <p>Undocumented</p>
+ <p>Audio data for various SDLScreenManager views</p>
<a href="Classes/SDLAudioData.html" class="slightly-smaller">See more</a>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLAudioData</span> <span class="p">:</span> <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span>
-
-<span class="c1">/// The text-to-speech prompts that will used and/or audio files that will be played. The audio prompts and files will be played in the same order they are added.</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">copy</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">,</span> <span class="n">readonly</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="Classes/SDLTTSChunk.html">SDLTTSChunk</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">audioData</span><span class="p">;</span>
-
-<span class="c1">/// Initialize with an SDLFile holding data or pointing to a file on the file system. When this object is passed to an `Alert` or `Speak`, the file will be uploaded if it is not already, then played if the system supports that feature.</span>
-<span class="c1">/// @discussion Only available on systems supporting RPC Spec v5.0+</span>
-<span class="c1">///</span>
-<span class="c1">/// @param audioFile The audio file to be played by the system</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithAudioFile</span><span class="p">:(</span><span class="n"><a href="Classes/SDLFile.html">SDLFile</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">audioFile</span><span class="p">;</span>
-
-<span class="c1">/// Initialize with a string to be spoken by the system speech synthesizer.</span>
-<span class="c1">/// @param spokenString The string to be spoken by the system speech synthesizer</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithSpeechSynthesizerString</span><span class="p">:(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">spokenString</span><span class="p">;</span>
-
-<span class="c1">/// Initialize with a string to be spoken by the system speech synthesizer using a phonetic string.</span>
-<span class="c1">/// @param phoneticString The string to be spoken by the system speech synthesizer</span>
-<span class="c1">/// @param phoneticType Must be one of `SAPI_PHONEMES`, `LHPLUS_PHONEMES`, `TEXT`, or `PRE_RECORDED` or no object will be created</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithPhoneticSpeechSynthesizerString</span><span class="p">:(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">phoneticString</span> <span class="nf">phoneticType</span><span class="p">:(</span><span class="n"><a href="Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities">SDLSpeechCapabilities</a></span><span class="p">)</span><span class="nv">phoneticType</span><span class="p">;</span>
-
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_UNAVAILABLE</span><span class="p">;</span>
-
-<span class="c1">/// Add additional SDLFiles holding data or pointing to a file on the file system. When this object is passed to an `Alert` or `Speak`, the file will be uploaded if it is not already, then played if the system supports that feature.</span>
-<span class="c1">/// @param audioFiles An array of audio file to be played by the system</span>
-<span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">addAudioFiles</span><span class="p">:(</span><span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="Classes/SDLFile.html">SDLFile</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">audioFiles</span><span class="p">;</span>
-
-<span class="c1">/// Create additional strings to be spoken by the system speech synthesizer.</span>
-<span class="c1">/// @param spokenStrings The strings to be spoken by the system speech synthesizer</span>
-<span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">addSpeechSynthesizerStrings</span><span class="p">:(</span><span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">spokenStrings</span><span class="p">;</span>
-
-<span class="c1">/// Create additional strings to be spoken by the system speech synthesizer using a phonetic string.</span>
-<span class="c1">/// @param phoneticStrings The strings to be spoken by the system speech synthesizer</span>
-<span class="c1">/// @param phoneticType Must be one of `SAPI_PHONEMES`, `LHPLUS_PHONEMES`, `TEXT`, or `PRE_RECORDED` or no object will be created</span>
-<span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">addPhoneticSpeechSynthesizerStrings</span><span class="p">:(</span><span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">phoneticStrings</span> <span class="nf">phoneticType</span><span class="p">:(</span><span class="n"><a href="Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities">SDLSpeechCapabilities</a></span><span class="p">)</span><span class="nv">phoneticType</span><span class="p">;</span>
-
-<span class="k">@end</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLAudioData</span> <span class="p">:</span> <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span></code></pre>
<h4>Swift</h4>
@@ -992,7 +898,7 @@
SDLBodyInformation
</h3>
- <p>Undocumented</p>
+ <p>Vehicle data body information containing information like the park brake status, the ignition status, gate and roof statuses, etc.</p>
<a href="Classes/SDLBodyInformation.html" class="slightly-smaller">See more</a>
@@ -6532,39 +6438,13 @@ change the settings of a specific remote control module.</p>
SDLSystemInfo
</h3>
- <p>Undocumented</p>
+ <p>Basic information about the connected module system</p>
<a href="Classes/SDLSystemInfo.html" class="slightly-smaller">See more</a>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLSystemInfo</span> <span class="p">:</span> <span class="nc">NSObject</span>
-
-<span class="c1">/// The connected module's vehicle type: it's make, model, trim, and model year</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="Classes/SDLVehicleType.html">SDLVehicleType</a></span> <span class="o">*</span><span class="n">vehicleType</span><span class="p">;</span>
-
-<span class="c1">/// The connected module's software version</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">systemSoftwareVersion</span><span class="p">;</span>
-
-<span class="c1">/// The connected module's hardware version</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">,</span> <span class="n">readonly</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">systemHardwareVersion</span><span class="p">;</span>
-
-<span class="c1">/// Initialize a system info object with individual pieces</span>
-<span class="c1">/// @param make The vehicle's make</span>
-<span class="c1">/// @param model The vehicle's model</span>
-<span class="c1">/// @param trim The vehicle's trim</span>
-<span class="c1">/// @param modelYear The vehicle's model year</span>
-<span class="c1">/// @param softwareVersion The vehicle's software version</span>
-<span class="c1">/// @param hardwareVersion The vehicle's hardware version</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithMake</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">make</span> <span class="nf">model</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">model</span> <span class="nf">trim</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">trim</span> <span class="nf">modelYear</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">modelYear</span> <span class="nf">softwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">softwareVersion</span> <span class="nf">hardwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">hardwareVersion</span><span class="p">;</span>
-
-<span class="c1">/// Initialize a system info object with the vehicle type and versions</span>
-<span class="c1">/// @param vehicleType The vehicle information</span>
-<span class="c1">/// @param softwareVersion The vehicle's software version</span>
-<span class="c1">/// @param hardwareVersion The vehicle's hardware version</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithVehicleType</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="Classes/SDLVehicleType.html">SDLVehicleType</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">vehicleType</span> <span class="nf">softwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">softwareVersion</span> <span class="nf">hardwareVersion</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">hardwareVersion</span><span class="p">;</span>
-
-<span class="k">@end</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLSystemInfo</span> <span class="p">:</span> <span class="nc">NSObject</span></code></pre>
<h4>Swift</h4>
@@ -7219,52 +7099,13 @@ See SDLSubscribeButton</p>
SDLVideoStreamingRange
</h3>
- <p>Undocumented</p>
+ <p>A range of supported video streaming sizes from minimum to maximum</p>
<a href="Classes/SDLVideoStreamingRange.html" class="slightly-smaller">See more</a>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLVideoStreamingRange</span> <span class="p">:</span> <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span>
-
-<span class="c1">/// The minimum supported normalized aspect ratio, min value is 1.0, defaults to 1.0</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">assign</span><span class="p">)</span> <span class="kt">float</span> <span class="n">minimumAspectRatio</span><span class="p">;</span>
-
-<span class="c1">/// The maximum supported normalized aspect ratio, min value is 1.0, defaults to 9999.0</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">assign</span><span class="p">)</span> <span class="kt">float</span> <span class="n">maximumAspectRatio</span><span class="p">;</span>
-
-<span class="c1">/// The minimum supported diagonal screen size in inches, defaults to 0.0 (matches any size)</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">assign</span><span class="p">)</span> <span class="kt">float</span> <span class="n">minimumDiagonal</span><span class="p">;</span>
-
-<span class="c1">/// The minimum resolution to support, it overrides .minimumAspectRatio</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="n">minimumResolution</span><span class="p">;</span>
-
-<span class="c1">/// The maximum resolution to support, it overrides .maximumAspectRatio</span>
-<span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="n">maximumResolution</span><span class="p">;</span>
-
-<span class="c1">/// Create a video streaming range based on a minimum and maximum resolution</span>
-<span class="c1">/// @param minResolution The minimum supported height / width resolution</span>
-<span class="c1">/// @param maxResolution The maximum supported height / width resolution</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithMinimumResolution</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">minResolution</span> <span class="nf">maximumResolution</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">maxResolution</span><span class="p">;</span>
-
-<span class="c1">/// Create a video streaming range with all supported options</span>
-<span class="c1">/// @param minResolution The minimum supported height / width resolution</span>
-<span class="c1">/// @param maxResolution The maximum supported height / width resolution</span>
-<span class="c1">/// @param minimumAspectRatio The minimum supported normalized aspect ratio, min value is 1.0, defaults to 1.0</span>
-<span class="c1">/// @param maximumAspectRatio The maximum supported normalized aspect ratio, min value is 1.0, defaults to 9999.0</span>
-<span class="c1">/// @param minimumDiagonal The minimum supported diagonal screen size in inches, defaults to 0 (0 matches any size)</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithMinimumResolution</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">minResolution</span> <span class="nf">maximumResolution</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">maxResolution</span> <span class="nf">minimumAspectRatio</span><span class="p">:(</span><span class="kt">float</span><span class="p">)</span><span class="nv">minimumAspectRatio</span> <span class="nf">maximumAspectRatio</span><span class="p">:(</span><span class="kt">float</span><span class="p">)</span><span class="nv">maximumAspectRatio</span> <span class="nf">minimumDiagonal</span><span class="p">:(</span><span class="kt">float</span><span class="p">)</span><span class="nv">minimumDiagonal</span><span class="p">;</span>
-
-<span class="c1">/// A convenience method to create a disabled range with the min and max resolutions equal to zero</span>
-<span class="k">+</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">disabled</span><span class="p">;</span>
-
-<span class="c1">/// Check if the argument is within the [.minimumResolution, .maximumResolution] range</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">BOOL</span><span class="p">)</span><span class="nf">isImageResolutionInRange</span><span class="p">:(</span><span class="n"><a href="Classes/SDLImageResolution.html">SDLImageResolution</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">imageResolution</span><span class="p">;</span>
-
-<span class="c1">/// Check if the argument is within the [.minimumAspectRatio, .maximumAspectRatio] range</span>
-<span class="k">-</span> <span class="p">(</span><span class="n">BOOL</span><span class="p">)</span><span class="nf">isAspectRatioInRange</span><span class="p">:(</span><span class="kt">float</span><span class="p">)</span><span class="nv">aspectRatio</span><span class="p">;</span>
-
-<span class="k">@end</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@interface</span> <span class="nc">SDLVideoStreamingRange</span> <span class="p">:</span> <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span></code></pre>
<h4>Swift</h4>
diff --git a/docs/Classes/SDLAlertAudioData.html b/docs/Classes/SDLAlertAudioData.html
index d80b7c2ad..5c12b6578 100644
--- a/docs/Classes/SDLAlertAudioData.html
+++ b/docs/Classes/SDLAlertAudioData.html
@@ -9,7 +9,7 @@
<h3>Overview</h3>
-<p>Undocumented</p>
+<p>Audio data for an SDLAlertView</p>
<section class="section task-group-section">
@@ -35,12 +35,12 @@
-init
</h3>
- <p>Undocumented</p>
+ <p>Use another init instead. See superclass SDLAudioData.</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_UNAVAILABLE</span><span class="p">;</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="n">init</span><span class="p">;</span></code></pre>
diff --git a/docs/Classes/SDLAlertView.html b/docs/Classes/SDLAlertView.html
index 3ce1d7e9d..865a39974 100644
--- a/docs/Classes/SDLAlertView.html
+++ b/docs/Classes/SDLAlertView.html
@@ -20,7 +20,7 @@
<h3>Overview</h3>
-<p>Undocumented</p>
+<p>An alert view to be displayed on the remote module. Pass this object to the SDLScreenManager to display.</p>
<section class="section task-group-section">
@@ -192,12 +192,12 @@ Please note that if a button is added to the alert, the defaultTimeout and timeo
-init
</h3>
- <p>Undocumented</p>
+ <p>Use one of the other init methods</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_DESIGNATED_INITIALIZER</span><span class="p">;</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="n">init</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
diff --git a/docs/Classes/SDLAudioData.html b/docs/Classes/SDLAudioData.html
index ebc9fba1d..1e58914c4 100644
--- a/docs/Classes/SDLAudioData.html
+++ b/docs/Classes/SDLAudioData.html
@@ -15,7 +15,7 @@
<h3>Overview</h3>
-<p>Undocumented</p>
+<p>Audio data for various SDLScreenManager views</p>
<section class="section task-group-section">
@@ -117,12 +117,12 @@
-init
</h3>
- <p>Undocumented</p>
+ <p>Use another init method instead.</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="n">init</span> <span class="n">NS_UNAVAILABLE</span><span class="p">;</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="n">init</span><span class="p">;</span></code></pre>
diff --git a/docs/Classes/SDLBodyInformation.html b/docs/Classes/SDLBodyInformation.html
index c8c57d92d..89e76acea 100644
--- a/docs/Classes/SDLBodyInformation.html
+++ b/docs/Classes/SDLBodyInformation.html
@@ -19,7 +19,7 @@
<h3>Overview</h3>
-<p>Undocumented</p>
+<p>Vehicle data body information containing information like the park brake status, the ignition status, gate and roof statuses, etc.</p>
<section class="section task-group-section">
diff --git a/docs/Classes/SDLCreateWindow.html b/docs/Classes/SDLCreateWindow.html
index 72a8b4982..91bef269f 100644
--- a/docs/Classes/SDLCreateWindow.html
+++ b/docs/Classes/SDLCreateWindow.html
@@ -54,7 +54,7 @@
-initWithId:windowName:windowType:associatedServiceType:duplicateUpdatesFromWindowID:
</h3>
- <p>Convinience constructor with all the parameters.</p>
+ <p>Convenience constructor with all the parameters.</p>
diff --git a/docs/Classes/SDLDoorStatus.html b/docs/Classes/SDLDoorStatus.html
index 8ebbf4f26..77e9bfdaa 100644
--- a/docs/Classes/SDLDoorStatus.html
+++ b/docs/Classes/SDLDoorStatus.html
@@ -49,12 +49,12 @@
location
</h3>
- <p>Undocumented</p>
+ <p>The location of the door on the vehicle grid</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="n">location</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">location</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
@@ -67,12 +67,12 @@
status
</h3>
- <p>Undocumented</p>
+ <p>The status of the door</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">status</span></code></pre>
+ <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:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">_Nonnull</span> <span class="n">status</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
diff --git a/docs/Classes/SDLFileManager.html b/docs/Classes/SDLFileManager.html
index cd49b858c..e9d74c904 100644
--- a/docs/Classes/SDLFileManager.html
+++ b/docs/Classes/SDLFileManager.html
@@ -183,7 +183,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">start</span><span class="p">(</span><span class="nv">completionHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManager.h@T@SDLFileManagerStartupCompletionHandler">SDLFileManagerStartupCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">start</span><span class="p">()</span> <span class="k">async</span> <span class="k">throws</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
@@ -253,7 +253,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">delete</span><span class="p">(</span><span class="n">fileName</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="n">completionHandler</span> <span class="nv">completion</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerDeleteCompletionHandler">SDLFileManagerDeleteCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">delete</span><span class="p">(</span><span class="n">fileName</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="k">async</span> <span class="k">throws</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">Bool</span><span class="p">,</span> <span class="kt">UInt</span><span class="p">)</span></code></pre>
@@ -269,7 +269,7 @@
-deleteRemoteFilesWithNames:completionHandler:
</h3>
- <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>
+ <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 delete request is sent.</p>
@@ -281,7 +281,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">delete</span><span class="p">(</span><span class="n">fileNames</span> <span class="nv">names</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">],</span> <span class="nv">completionHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiDeleteCompletionHandler">SDLFileManagerMultiDeleteCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">delete</span><span class="p">(</span><span class="n">fileNames</span> <span class="nv">names</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">])</span> <span class="k">async</span> <span class="k">throws</span></code></pre>
@@ -308,7 +308,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">file</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">,</span> <span class="n">completionHandler</span> <span class="nv">completion</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadCompletionHandler">SDLFileManagerUploadCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">file</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">)</span> <span class="k">async</span> <span class="k">throws</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">Bool</span><span class="p">,</span> <span class="kt">UInt</span><span class="p">)</span></code></pre>
@@ -326,7 +326,7 @@
<p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>
-<p>The optional progress handler can be used to keep track of the upload progress. After each file upload, the progress handler returns the upload percentage and an error, if one occured during the upload process. The progress handler also includes an option to cancel the upload of all remaining files in queue.</p>
+<p>The optional progress handler can be used to keep track of the upload progress. After each file upload, the progress handler returns the upload percentage and an error, if one occurred during the upload process. The progress handler also includes an option to cancel the upload of all remaining files in queue.</p>
@@ -339,7 +339,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">files</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">],</span> <span class="nv">progressHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadProgressHandler">SDLFileManagerMultiUploadProgressHandler</a></span><span class="p">?,</span> <span class="nv">completionHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadCompletionHandler">SDLFileManagerMultiUploadCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">files</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">],</span> <span class="nv">progressHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadProgressHandler">SDLFileManagerMultiUploadProgressHandler</a></span><span class="p">?)</span> <span class="k">async</span> <span class="k">throws</span></code></pre>
@@ -368,7 +368,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">files</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">],</span> <span class="nv">completionHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadCompletionHandler">SDLFileManagerMultiUploadCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">files</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">])</span> <span class="k">async</span> <span class="k">throws</span></code></pre>
@@ -426,7 +426,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">artwork</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">,</span> <span class="n">completionHandler</span> <span class="nv">completion</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadArtworkCompletionHandler">SDLFileManagerUploadArtworkCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">artwork</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">)</span> <span class="k">async</span> <span class="k">throws</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="kt">Bool</span><span class="p">,</span> <span class="kt">String</span><span class="p">,</span> <span class="kt">UInt</span><span class="p">)</span></code></pre>
@@ -453,7 +453,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">artworks</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">],</span> <span class="n">completionHandler</span> <span class="nv">completion</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkCompletionHandler">SDLFileManagerMultiUploadArtworkCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">artworks</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">])</span> <span class="k">async</span> <span class="k">throws</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">String</span><span class="p">]</span></code></pre>
@@ -485,7 +485,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">artworks</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">],</span> <span class="nv">progressHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkProgressHandler">SDLFileManagerMultiUploadArtworkProgressHandler</a></span><span class="p">?,</span> <span class="n">completionHandler</span> <span class="nv">completion</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkCompletionHandler">SDLFileManagerMultiUploadArtworkCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">upload</span><span class="p">(</span><span class="nv">artworks</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLArtwork.html">SDLArtwork</a></span><span class="p">],</span> <span class="nv">progressHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkProgressHandler">SDLFileManagerMultiUploadArtworkProgressHandler</a></span><span class="p">?)</span> <span class="k">async</span> <span class="k">throws</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">String</span><span class="p">]</span></code></pre>
diff --git a/docs/Classes/SDLGateStatus.html b/docs/Classes/SDLGateStatus.html
index 98af5996f..23566b36b 100644
--- a/docs/Classes/SDLGateStatus.html
+++ b/docs/Classes/SDLGateStatus.html
@@ -49,12 +49,12 @@
location
</h3>
- <p>Undocumented</p>
+ <p>The location of the gate on the vehicle grid</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="n">location</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">location</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
@@ -67,12 +67,12 @@
status
</h3>
- <p>Undocumented</p>
+ <p>The status of the gate</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">status</span></code></pre>
+ <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:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">_Nonnull</span> <span class="n">status</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
diff --git a/docs/Classes/SDLKeyboardLayoutCapability.html b/docs/Classes/SDLKeyboardLayoutCapability.html
index fc9230969..d8d80cf03 100644
--- a/docs/Classes/SDLKeyboardLayoutCapability.html
+++ b/docs/Classes/SDLKeyboardLayoutCapability.html
@@ -50,12 +50,12 @@
keyboardLayout
</h3>
- <p>Undocumented</p>
+ <p>The keyboard layout of this capability</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span> <span class="n">keyboardLayout</span></code></pre>
+ <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:SDLKeyboardLayout.h@T@SDLKeyboardLayout">SDLKeyboardLayout</a></span> <span class="n">_Nonnull</span> <span class="n">keyboardLayout</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
diff --git a/docs/Classes/SDLManager.html b/docs/Classes/SDLManager.html
index 15485ef65..6e5c1a0cf 100644
--- a/docs/Classes/SDLManager.html
+++ b/docs/Classes/SDLManager.html
@@ -447,7 +447,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">send</span><span class="p">(</span><span class="n">_</span> <span class="nv">requests</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLRPCRequest.html">SDLRPCRequest</a></span><span class="p">],</span> <span class="nv">progressHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleAsyncRequestProgressHandler">SDLMultipleAsyncRequestProgressHandler</a></span><span class="p">?,</span> <span class="nv">completionHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleRequestCompletionHandler">SDLMultipleRequestCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">send</span><span class="p">(</span><span class="n">_</span> <span class="nv">requests</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLRPCRequest.html">SDLRPCRequest</a></span><span class="p">],</span> <span class="nv">progressHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleAsyncRequestProgressHandler">SDLMultipleAsyncRequestProgressHandler</a></span><span class="p">?)</span> <span class="k">async</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
@@ -479,7 +479,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">sendSequential</span><span class="p">(</span><span class="nv">requests</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLRPCRequest.html">SDLRPCRequest</a></span><span class="p">],</span> <span class="nv">progressHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleSequentialRequestProgressHandler">SDLMultipleSequentialRequestProgressHandler</a></span><span class="p">?,</span> <span class="nv">completionHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleRequestCompletionHandler">SDLMultipleRequestCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">sendSequential</span><span class="p">(</span><span class="nv">requests</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLRPCRequest.html">SDLRPCRequest</a></span><span class="p">],</span> <span class="nv">progressHandler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleSequentialRequestProgressHandler">SDLMultipleSequentialRequestProgressHandler</a></span><span class="p">?)</span> <span class="k">async</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
diff --git a/docs/Classes/SDLPermissionManager.html b/docs/Classes/SDLPermissionManager.html
index d2602b9f4..558c41e62 100644
--- a/docs/Classes/SDLPermissionManager.html
+++ b/docs/Classes/SDLPermissionManager.html
@@ -54,7 +54,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">start</span><span class="p">(</span><span class="nv">completionHandler</span><span class="p">:</span> <span class="kd">@escaping</span> <span class="p">(</span><span class="kt">Bool</span><span class="p">,</span> <span class="kt">Error</span><span class="p">?)</span> <span class="o">-&gt;</span> <span class="kt">Void</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">start</span><span class="p">()</span> <span class="k">async</span> <span class="k">throws</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
diff --git a/docs/Classes/SDLRoofStatus.html b/docs/Classes/SDLRoofStatus.html
index 5192c99ea..c737ac82d 100644
--- a/docs/Classes/SDLRoofStatus.html
+++ b/docs/Classes/SDLRoofStatus.html
@@ -83,12 +83,12 @@
location
</h3>
- <p>Undocumented</p>
+ <p>The location of the roof on the vehicle grid</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="n">location</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLGrid.html">SDLGrid</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">location</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
@@ -101,12 +101,12 @@
status
</h3>
- <p>Undocumented</p>
+ <p>The status of the roof (e.g. if it is detachable)</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">status</span></code></pre>
+ <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:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">_Nonnull</span> <span class="n">status</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
@@ -119,12 +119,12 @@
state
</h3>
- <p>Undocumented</p>
+ <p>The state of the roof if it has a window</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nullable</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLWindowState.html">SDLWindowState</a></span> <span class="o">*</span><span class="n">state</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLWindowState.html">SDLWindowState</a></span> <span class="o">*</span><span class="n">state</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
diff --git a/docs/Classes/SDLScreenManager.html b/docs/Classes/SDLScreenManager.html
index f5f5427fd..487e1bb3a 100644
--- a/docs/Classes/SDLScreenManager.html
+++ b/docs/Classes/SDLScreenManager.html
@@ -560,7 +560,7 @@
<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">completionHandler</span> <span class="nv">handler</span><span class="p">:</span> <span class="kd">@escaping</span> <span class="p">(</span><span class="kt">Error</span><span class="p">?)</span> <span class="o">-&gt;</span> <span class="kt">Void</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">start</span><span class="p">()</span> <span class="k">async</span> <span class="k">throws</span></code></pre>
@@ -653,7 +653,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">endUpdates</span><span class="p">(</span><span class="n">completionHandler</span> <span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler">SDLScreenManagerUpdateCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">endUpdates</span><span class="p">()</span> <span class="k">async</span> <span class="k">throws</span></code></pre>
@@ -684,7 +684,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">changeLayout</span><span class="p">(</span><span class="n">_</span> <span class="nv">templateConfiguration</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLTemplateConfiguration.html">SDLTemplateConfiguration</a></span><span class="p">,</span> <span class="n">withCompletionHandler</span> <span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler">SDLScreenManagerUpdateCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">changeLayout</span><span class="p">(</span><span class="n">_</span> <span class="nv">templateConfiguration</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLTemplateConfiguration.html">SDLTemplateConfiguration</a></span><span class="p">)</span> <span class="k">async</span> <span class="k">throws</span></code></pre>
@@ -808,7 +808,7 @@
<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>
+ <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="k">async</span> <span class="k">throws</span></code></pre>
@@ -836,7 +836,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">preloadChoices</span><span class="p">(</span><span class="n">_</span> <span class="nv">choices</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLChoiceCell.html">SDLChoiceCell</a></span><span class="p">],</span> <span class="n">withCompletionHandler</span> <span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLPreloadChoiceCompletionHandler">SDLPreloadChoiceCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">preloadChoices</span><span class="p">(</span><span class="n">_</span> <span class="nv">choices</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLChoiceCell.html">SDLChoiceCell</a></span><span class="p">])</span> <span class="k">async</span> <span class="k">throws</span></code></pre>
@@ -1035,7 +1035,7 @@
<p>If the alert contains an audio indication with a file that needs to be uploaded, it will be uploaded before presenting the alert. If the alert contains soft buttons with images, they will be uploaded before presenting the alert. If the alert contains an icon, that will be uploaded before presenting the alert.</p>
-<p>The handler will be called when the alert either dismisses from the screen or it has failed to present. If the error value in the handler is present, then the alert failed to appear or was aborted, if not, then the alert dismissed without error. The <code>userInfo</code> object on the error contais an <code>error</code> key with more information about the error. If the alert failed to present, the <code>userInfo</code> object will contain a <code>tryAgainTime</code> key with information on how long to wait before trying to send another alert. The value for <code>tryAgainTime</code> may be <code>nil</code> if the module did not return a value in its response.</p>
+<p>The handler will be called when the alert either dismisses from the screen or it has failed to present. If the error value in the handler is present, then the alert failed to appear or was aborted, if not, then the alert dismissed without error. The <code>userInfo</code> object on the error contains an <code>error</code> key with more information about the error. If the alert failed to present, the <code>userInfo</code> object will contain a <code>tryAgainTime</code> key with information on how long to wait before trying to send another alert. The value for <code>tryAgainTime</code> may be <code>nil</code> if the module did not return a value in its response.</p>
@@ -1046,7 +1046,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">presentAlert</span><span class="p">(</span><span class="n">_</span> <span class="nv">alert</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLAlertView.html">SDLAlertView</a></span><span class="p">,</span> <span class="n">withCompletionHandler</span> <span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler">SDLScreenManagerUpdateCompletionHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">presentAlert</span><span class="p">(</span><span class="n">_</span> <span class="nv">alert</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLAlertView.html">SDLAlertView</a></span><span class="p">)</span> <span class="k">async</span> <span class="k">throws</span></code></pre>
diff --git a/docs/Classes/SDLSeatControlCapabilities.html b/docs/Classes/SDLSeatControlCapabilities.html
index 31bf5ce4e..5a2077648 100644
--- a/docs/Classes/SDLSeatControlCapabilities.html
+++ b/docs/Classes/SDLSeatControlCapabilities.html
@@ -141,7 +141,7 @@
moduleName
</h3>
- <p>@abstract The short friendly name of the light control module.
+ <p>@abstract The short friendly name of the seat control module.
It should not be used to identify a module by mobile application.</p>
<p>Required, Max length 100 chars</p>
diff --git a/docs/Classes/SDLSeatStatus.html b/docs/Classes/SDLSeatStatus.html
index dfa795c82..d7024cd92 100644
--- a/docs/Classes/SDLSeatStatus.html
+++ b/docs/Classes/SDLSeatStatus.html
@@ -50,12 +50,12 @@
seatLocation
</h3>
- <p>Undocumented</p>
+ <p>The location of the seat on the vehicle grid</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLSeatLocation.html">SDLSeatLocation</a></span> <span class="o">*</span><span class="n">seatLocation</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLSeatLocation.html">SDLSeatLocation</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">seatLocation</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
@@ -68,12 +68,12 @@
conditionActive
</h3>
- <p>Undocumented</p>
+ <p>If the seat condition is active (see the containing object parameter, such as &lsquo;seatsOccupied&rsquo;)</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">conditionActive</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n">NSNumber</span><span class="o">&lt;</span><span class="n"><a href="../Protocols.html#/c:objc(pl)SDLBool">SDLBool</a></span><span class="o">&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">conditionActive</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
diff --git a/docs/Classes/SDLSeekStreamingIndicator.html b/docs/Classes/SDLSeekStreamingIndicator.html
index dd8387b37..d075fff8b 100644
--- a/docs/Classes/SDLSeekStreamingIndicator.html
+++ b/docs/Classes/SDLSeekStreamingIndicator.html
@@ -103,12 +103,12 @@
type
</h3>
- <p>Undocumented</p>
+ <p>The type of seek indicator to be displayed on the module UI</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@property</span> <span class="p">(</span><span class="n">strong</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span> <span class="n">type</span></code></pre>
+ <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:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span> <span class="n">_Nonnull</span> <span class="n">type</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
diff --git a/docs/Classes/SDLStreamingMediaConfiguration.html b/docs/Classes/SDLStreamingMediaConfiguration.html
index bad8b638b..ab2674319 100644
--- a/docs/Classes/SDLStreamingMediaConfiguration.html
+++ b/docs/Classes/SDLStreamingMediaConfiguration.html
@@ -180,7 +180,7 @@
supportedLandscapeStreamingRange
</h3>
- <p>Set a landscape image dimension range and/or aspect ratio range that your rootViewController supports. If the module&rsquo;s screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to <code>nil</code>, the default is to support all lanscape streaming ranges. If you wish to disable support for streaming in landscape mode, set a <code>disabled</code> video streaming range.
+ <p>Set a landscape image dimension range and/or aspect ratio range that your rootViewController supports. If the module&rsquo;s screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to <code>nil</code>, the default is to support all landscape streaming ranges. If you wish to disable support for streaming in landscape mode, set a <code>disabled</code> video streaming range.
If desired, you can subscribe to screen size updates via the SDLStreamingVideoDelegate.</p>
<div class="aside aside-warning">
<p class="aside-title">Warning</p>
diff --git a/docs/Classes/SDLSystemCapabilityManager.html b/docs/Classes/SDLSystemCapabilityManager.html
index 9868f4d82..2d79f503b 100644
--- a/docs/Classes/SDLSystemCapabilityManager.html
+++ b/docs/Classes/SDLSystemCapabilityManager.html
@@ -645,7 +645,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">updateCapabilityType</span><span class="p">(</span><span class="n">_</span> <span class="nv">type</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLSystemCapabilityType.h@T@SDLSystemCapabilityType">SDLSystemCapabilityType</a></span><span class="p">,</span> <span class="n">completionHandler</span> <span class="nv">handler</span><span class="p">:</span> <span class="kd">@escaping</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLUpdateCapabilityHandler">SDLUpdateCapabilityHandler</a></span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">updateCapabilityType</span><span class="p">(</span><span class="n">_</span> <span class="nv">type</span><span class="p">:</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLSystemCapabilityType.h@T@SDLSystemCapabilityType">SDLSystemCapabilityType</a></span><span class="p">)</span> <span class="k">async</span> <span class="k">throws</span> <span class="o">-&gt;</span> <span class="kt">SDLSystemCapabilityManager</span></code></pre>
diff --git a/docs/Classes/SDLSystemInfo.html b/docs/Classes/SDLSystemInfo.html
index 2bf12a9d1..57da10501 100644
--- a/docs/Classes/SDLSystemInfo.html
+++ b/docs/Classes/SDLSystemInfo.html
@@ -12,7 +12,7 @@
<h3>Overview</h3>
-<p>Undocumented</p>
+<p>Basic information about the connected module system</p>
<section class="section task-group-section">
diff --git a/docs/Classes/SDLVideoStreamingRange.html b/docs/Classes/SDLVideoStreamingRange.html
index b23ebcba9..bd9d672b1 100644
--- a/docs/Classes/SDLVideoStreamingRange.html
+++ b/docs/Classes/SDLVideoStreamingRange.html
@@ -17,7 +17,7 @@
<h3>Overview</h3>
-<p>Undocumented</p>
+<p>A range of supported video streaming sizes from minimum to maximum</p>
<section class="section task-group-section">
diff --git a/docs/Constants.html b/docs/Constants.html
index 7d0b10606..93d2cc297 100644
--- a/docs/Constants.html
+++ b/docs/Constants.html
@@ -193,6 +193,7 @@
<li><a href="#section-SDLEmergencyEventTypeRollover">SDLEmergencyEventTypeRollover</a></li>
<li><a href="#section-SDLEmergencyEventTypeNotSupported">SDLEmergencyEventTypeNotSupported</a></li>
<li><a href="#section-SDLEmergencyEventTypeFault">SDLEmergencyEventTypeFault</a></li>
+ <li><a href="#section-SDLErrorDomainSystem">SDLErrorDomainSystem</a></li>
<li><a href="#section-SDLErrorDomainAudioStreamManager">SDLErrorDomainAudioStreamManager</a></li>
<li><a href="#section-SDLErrorDomainCacheFileManager">SDLErrorDomainCacheFileManager</a></li>
<li><a href="#section-SDLErrorDomainChoiceSetManager">SDLErrorDomainChoiceSetManager</a></li>
@@ -1443,12 +1444,12 @@
SDLAppCapabilityTypeVideoStreaming
</h3>
- <p>Undocumented</p>
+ <p>Video streaming app capability. Used internally.</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType">SDLAppCapabilityType</a></span> <span class="k">const</span> <span class="n">SDLAppCapabilityTypeVideoStreaming</span></code></pre>
+ <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:SDLAppCapabilityType.h@T@SDLAppCapabilityType">SDLAppCapabilityType</a></span> <span class="n">SDLAppCapabilityTypeVideoStreaming</span></code></pre>
<h4>Swift</h4>
@@ -4313,12 +4314,12 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
SDLDoorStatusTypeClosed
</h3>
- <p>Undocumented</p>
+ <p>Door is closed and unlocked</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="k">const</span> <span class="n">SDLDoorStatusTypeClosed</span></code></pre>
+ <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:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">SDLDoorStatusTypeClosed</span></code></pre>
<h4>Swift</h4>
@@ -4331,12 +4332,12 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
SDLDoorStatusTypeLocked
</h3>
- <p>Undocumented</p>
+ <p>Door is closed and locked</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="k">const</span> <span class="n">SDLDoorStatusTypeLocked</span></code></pre>
+ <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:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">SDLDoorStatusTypeLocked</span></code></pre>
<h4>Swift</h4>
@@ -4349,12 +4350,12 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
SDLDoorStatusTypeAjar
</h3>
- <p>Undocumented</p>
+ <p>Door is open</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="k">const</span> <span class="n">SDLDoorStatusTypeAjar</span></code></pre>
+ <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:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">SDLDoorStatusTypeAjar</span></code></pre>
<h4>Swift</h4>
@@ -4367,12 +4368,12 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
SDLDoorStatusTypeRemoved
</h3>
- <p>Undocumented</p>
+ <p>Door is removed from the vehicle</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="k">const</span> <span class="n">SDLDoorStatusTypeRemoved</span></code></pre>
+ <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:SDLDoorStatusType.h@T@SDLDoorStatusType">SDLDoorStatusType</a></span> <span class="n">SDLDoorStatusTypeRemoved</span></code></pre>
<h4>Swift</h4>
@@ -4761,6 +4762,24 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
+ <h3 id="section-SDLErrorDomainSystem">
+ SDLErrorDomainSystem
+ </h3>
+
+ <p>An error with the iOS system</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLErrorConstants.h@T@SDLErrorDomain">SDLErrorDomain</a></span> <span class="o">*</span><span class="k">const</span> <span class="n">SDLErrorDomainSystem</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">let</span> <span class="nv">SDLErrorDomainSystem</span><span class="p">:</span> <span class="kt">String</span></code></pre>
+
+
+
+
<h3 id="section-SDLErrorDomainAudioStreamManager">
SDLErrorDomainAudioStreamManager
</h3>
@@ -6375,12 +6394,12 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
SDLKeyboardInputMaskEnableInputKeyMask
</h3>
- <p>Undocumented</p>
+ <p>Key mask is enabled. Input characters will not be viewable by the user.</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span> <span class="k">const</span> <span class="n">SDLKeyboardInputMaskEnableInputKeyMask</span></code></pre>
+ <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:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span> <span class="n">SDLKeyboardInputMaskEnableInputKeyMask</span></code></pre>
<h4>Swift</h4>
@@ -6393,12 +6412,12 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
SDLKeyboardInputMaskDisableInputKeyMask
</h3>
- <p>Undocumented</p>
+ <p>Key mask is disabled. Input characters will be viewable by the user.</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span> <span class="k">const</span> <span class="n">SDLKeyboardInputMaskDisableInputKeyMask</span></code></pre>
+ <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:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span> <span class="n">SDLKeyboardInputMaskDisableInputKeyMask</span></code></pre>
<h4>Swift</h4>
@@ -6411,12 +6430,12 @@ By default the playback indicator should be PLAY_PAUSE when:</p>
SDLKeyboardInputMaskUserChoiceInputKeyMask
</h3>
- <p>Undocumented</p>
+ <p>Key mask can be toggled by the user.</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span> <span class="k">const</span> <span class="n">SDLKeyboardInputMaskUserChoiceInputKeyMask</span></code></pre>
+ <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:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask">SDLKeyboardInputMask</a></span> <span class="n">SDLKeyboardInputMaskUserChoiceInputKeyMask</span></code></pre>
<h4>Swift</h4>
@@ -16839,12 +16858,12 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
SDLSeekIndicatorTypeTrack
</h3>
- <p>Undocumented</p>
+ <p>Seek indicator UI that is appropriate for skipping tracks</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span> <span class="k">const</span> <span class="n">SDLSeekIndicatorTypeTrack</span></code></pre>
+ <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:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span> <span class="n">SDLSeekIndicatorTypeTrack</span></code></pre>
<h4>Swift</h4>
@@ -16857,12 +16876,12 @@ appropriate permissions to show the application&rsquo;s own web view.</p>
SDLSeekIndicatorTypeTime
</h3>
- <p>Undocumented</p>
+ <p>Seek indicator UI that is appropriate for skipping time</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">extern</span> <span class="n"><a href="Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span> <span class="k">const</span> <span class="n">SDLSeekIndicatorTypeTime</span></code></pre>
+ <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:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType">SDLSeekIndicatorType</a></span> <span class="n">SDLSeekIndicatorTypeTime</span></code></pre>
<h4>Swift</h4>
diff --git a/docs/Enums.html b/docs/Enums.html
index 328d17bef..a7dceb2af 100644
--- a/docs/Enums.html
+++ b/docs/Enums.html
@@ -5,6 +5,7 @@
<ul>
<li><a href="#section-SDLArtworkImageFormat">SDLArtworkImageFormat</a></li>
<li><a href="#section-SDLChoiceSetLayout">SDLChoiceSetLayout</a></li>
+ <li><a href="#section-SDLSystemError">SDLSystemError</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>
@@ -26,7 +27,6 @@
<li><a href="#section-SDLLogLevel">SDLLogLevel</a></li>
<li><a href="#section-SDLLogFormatType">SDLLogFormatType</a></li>
<li><a href="#section-SDLDynamicMenuUpdatesMode">SDLDynamicMenuUpdatesMode</a></li>
- <li><a href="#section-MenuCellState">MenuCellState</a></li>
<li><a href="#section-SDLPermissionGroupType">SDLPermissionGroupType</a></li>
<li><a href="#section-SDLPermissionGroupStatus">SDLPermissionGroupStatus</a></li>
<li><a href="#section-SDLPredefinedWindows">SDLPredefinedWindows</a></li>
@@ -83,6 +83,25 @@
+ <h3 id="section-SDLSystemError">
+ SDLSystemError
+ </h3>
+
+ <p>Error associated with the underlying operating system</p>
+
+ <a href="Enums/SDLSystemError.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">SDLSystemError</span> <span class="o">:</span> <span class="n">NSInteger</span> <span class="p">{}</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="kd">enum</span> <span class="kt">SDLSystemError</span> <span class="p">:</span> <span class="kt">Int</span></code></pre>
+
+
+
+
<h3 id="section-SDLEncryptionLifecycleManagerError">
SDLEncryptionLifecycleManagerError
</h3>
@@ -484,27 +503,6 @@
- <h3 id="section-MenuCellState">
- MenuCellState
- </h3>
-
- <p>Menu cell state</p>
-
-<p>Cell state that tells the menu manager what it should do with a given SDLMenuCell</p>
-
- <a href="Enums/MenuCellState.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">MenuCellState</span> <span class="o">:</span> <span class="n">NSUInteger</span> <span class="p">{}</span></code></pre>
-
-
- <h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">enum</span> <span class="kt">MenuCellState</span> <span class="p">:</span> <span class="kt">UInt</span></code></pre>
-
-
-
-
<h3 id="section-SDLPermissionGroupType">
SDLPermissionGroupType
</h3>
diff --git a/docs/Enums/MenuCellState.html b/docs/Enums/MenuCellState.html
deleted file mode 100644
index 541e97d71..000000000
--- a/docs/Enums/MenuCellState.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<h1>MenuCellState Enumeration Reference</h1>
-
-<h3>Section Contents</h3>
-
-<ul>
- <li><a href="#section-MenuCellStateDelete">MenuCellStateDelete</a></li>
- <li><a href="#section-MenuCellStateAdd">MenuCellStateAdd</a></li>
- <li><a href="#section-MenuCellStateKeep">MenuCellStateKeep</a></li>
-</ul>
-
-<h3>Overview</h3>
-
-<p>Menu cell state</p>
-
-<p>Cell state that tells the menu manager what it should do with a given SDLMenuCell</p>
-
-
-<section class="section task-group-section">
- <h3 id="section-MenuCellStateDelete">
- MenuCellStateDelete
- </h3>
-
- <p>Marks the cell to be deleted</p>
-
-
-
- <h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="n">MenuCellStateDelete</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">delete</span> <span class="o">=</span> <span class="mi">0</span></code></pre>
-
-
-
-
- <h3 id="section-MenuCellStateAdd">
- MenuCellStateAdd
- </h3>
-
- <p>Marks the cell to be added</p>
-
-
-
- <h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="n">MenuCellStateAdd</span></code></pre>
-
-
- <h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">case</span> <span class="n">add</span> <span class="o">=</span> <span class="mi">1</span></code></pre>
-
-
-
-
- <h3 id="section-MenuCellStateKeep">
- MenuCellStateKeep
- </h3>
-
- <p>Marks the cell to be kept</p>
-
-
-
- <h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="n">MenuCellStateKeep</span></code></pre>
-
-
- <h4>Swift</h4>
- <pre class="highlight swift"><code><span class="k">case</span> <span class="n">keep</span> <span class="o">=</span> <span class="mi">2</span></code></pre>
-
-
-
-
-</section>
diff --git a/docs/Enums/SDLChoiceSetManagerError.html b/docs/Enums/SDLChoiceSetManagerError.html
index b72be0336..abb8b4ded 100644
--- a/docs/Enums/SDLChoiceSetManagerError.html
+++ b/docs/Enums/SDLChoiceSetManagerError.html
@@ -3,11 +3,13 @@
<h3>Section Contents</h3>
<ul>
- <li><a href="#section-SDLChoiceSetManagerErrorPendingPresentationDeleted">SDLChoiceSetManagerErrorPendingPresentationDeleted</a></li>
+ <li><a href="#section-SDLChoiceSetManagerErrorNeededChoicesUnavailable">SDLChoiceSetManagerErrorNeededChoicesUnavailable</a></li>
<li><a href="#section-SDLChoiceSetManagerErrorDeletionFailed">SDLChoiceSetManagerErrorDeletionFailed</a></li>
<li><a href="#section-SDLChoiceSetManagerErrorUploadFailed">SDLChoiceSetManagerErrorUploadFailed</a></li>
<li><a href="#section-SDLChoiceSetManagerErrorFailedToCreateMenuItems">SDLChoiceSetManagerErrorFailedToCreateMenuItems</a></li>
<li><a href="#section-SDLChoiceSetManagerErrorInvalidState">SDLChoiceSetManagerErrorInvalidState</a></li>
+ <li><a href="#section-SDLChoiceSetManagerErrorCancelled">SDLChoiceSetManagerErrorCancelled</a></li>
+ <li><a href="#section-SDLChoiceSetManagerErrorNoIdsAvailable">SDLChoiceSetManagerErrorNoIdsAvailable</a></li>
</ul>
<h3>Overview</h3>
@@ -16,20 +18,20 @@
<section class="section task-group-section">
- <h3 id="section-SDLChoiceSetManagerErrorPendingPresentationDeleted">
- SDLChoiceSetManagerErrorPendingPresentationDeleted
+ <h3 id="section-SDLChoiceSetManagerErrorNeededChoicesUnavailable">
+ SDLChoiceSetManagerErrorNeededChoicesUnavailable
</h3>
- <p>The choice set has been deleted before it was presented</p>
+ <p>Some needed choices for presentation are not available</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="n">SDLChoiceSetManagerErrorPendingPresentationDeleted</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="n">SDLChoiceSetManagerErrorNeededChoicesUnavailable</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">pendingPresentationDeleted</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">neededChoicesUnavailable</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
@@ -106,4 +108,40 @@
+ <h3 id="section-SDLChoiceSetManagerErrorCancelled">
+ SDLChoiceSetManagerErrorCancelled
+ </h3>
+
+ <p>An operation was cancelled and may or may not have succeeded</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLChoiceSetManagerErrorCancelled</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">cancelled</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLChoiceSetManagerErrorNoIdsAvailable">
+ SDLChoiceSetManagerErrorNoIdsAvailable
+ </h3>
+
+ <p>No new choices could be loaded because the maximum number of choices are loaded (65535)</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLChoiceSetManagerErrorNoIdsAvailable</span> <span class="o">=</span> <span class="o">-</span><span class="mi">7</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">noIdsAvailable</span> <span class="o">=</span> <span class="o">-</span><span class="mi">7</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Enums/SDLMenuManagerError.html b/docs/Enums/SDLMenuManagerError.html
index 71e27faa1..2c4a9c586 100644
--- a/docs/Enums/SDLMenuManagerError.html
+++ b/docs/Enums/SDLMenuManagerError.html
@@ -5,6 +5,10 @@
<ul>
<li><a href="#section-SDLMenuManagerErrorRPCsFailed">SDLMenuManagerErrorRPCsFailed</a></li>
<li><a href="#section-SDLMenuManagerErrorPendingUpdateSuperseded">SDLMenuManagerErrorPendingUpdateSuperseded</a></li>
+ <li><a href="#section-SDLMenuManagerErrorOperationCancelled">SDLMenuManagerErrorOperationCancelled</a></li>
+ <li><a href="#section-SDLMenuManagerErrorConfigurationUpdateLayoutNotSupported">SDLMenuManagerErrorConfigurationUpdateLayoutNotSupported</a></li>
+ <li><a href="#section-SDLMenuManagerErrorConfigurationUpdateFailed">SDLMenuManagerErrorConfigurationUpdateFailed</a></li>
+ <li><a href="#section-SDLMenuManagerErrorOpenMenuFailed">SDLMenuManagerErrorOpenMenuFailed</a></li>
</ul>
<h3>Overview</h3>
@@ -35,7 +39,7 @@
SDLMenuManagerErrorPendingUpdateSuperseded
</h3>
- <p>Sending menu-related RPCs returned an error from the remote system</p>
+ <p>A pending menu update was superseded by a later update and did not run</p>
@@ -49,4 +53,76 @@
+ <h3 id="section-SDLMenuManagerErrorOperationCancelled">
+ SDLMenuManagerErrorOperationCancelled
+ </h3>
+
+ <p>A pending or in-progress menu update was cancelled</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLMenuManagerErrorOperationCancelled</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">operationCancelled</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLMenuManagerErrorConfigurationUpdateLayoutNotSupported">
+ SDLMenuManagerErrorConfigurationUpdateLayoutNotSupported
+ </h3>
+
+ <p>A configuration update failed because the configuration is not supported</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLMenuManagerErrorConfigurationUpdateLayoutNotSupported</span> <span class="o">=</span> <span class="o">-</span><span class="mi">4</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">configurationUpdateLayoutNotSupported</span> <span class="o">=</span> <span class="o">-</span><span class="mi">4</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLMenuManagerErrorConfigurationUpdateFailed">
+ SDLMenuManagerErrorConfigurationUpdateFailed
+ </h3>
+
+ <p>A configuration update failed</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLMenuManagerErrorConfigurationUpdateFailed</span> <span class="o">=</span> <span class="o">-</span><span class="mi">5</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">configurationUpdateFailed</span> <span class="o">=</span> <span class="o">-</span><span class="mi">5</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLMenuManagerErrorOpenMenuFailed">
+ SDLMenuManagerErrorOpenMenuFailed
+ </h3>
+
+ <p>An open menu operation failed</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLMenuManagerErrorOpenMenuFailed</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">openMenuFailed</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Enums/SDLSystemCapabilityManagerError.html b/docs/Enums/SDLSystemCapabilityManagerError.html
index 846772d78..e0fa5e2bc 100644
--- a/docs/Enums/SDLSystemCapabilityManagerError.html
+++ b/docs/Enums/SDLSystemCapabilityManagerError.html
@@ -6,6 +6,7 @@
<li><a href="#section-SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities">SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities</a></li>
<li><a href="#section-SDLSystemCapabilityManagerErrorHMINone">SDLSystemCapabilityManagerErrorHMINone</a></li>
<li><a href="#section-SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays">SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays</a></li>
+ <li><a href="#section-SDLSystemCapabilityManagerErrorUnknownType">SDLSystemCapabilityManagerErrorUnknownType</a></li>
</ul>
<h3>Overview</h3>
@@ -68,4 +69,22 @@
+ <h3 id="section-SDLSystemCapabilityManagerErrorUnknownType">
+ SDLSystemCapabilityManagerErrorUnknownType
+ </h3>
+
+ <p>The module sent an unknown system capability type</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLSystemCapabilityManagerErrorUnknownType</span> <span class="o">=</span> <span class="o">-</span><span class="mi">4</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">unknownType</span> <span class="o">=</span> <span class="o">-</span><span class="mi">4</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Enums/SDLSystemError.html b/docs/Enums/SDLSystemError.html
new file mode 100644
index 000000000..475590b7a
--- /dev/null
+++ b/docs/Enums/SDLSystemError.html
@@ -0,0 +1,33 @@
+<h1>SDLSystemError Enumeration Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-SDLSystemErrorFailedToCreateObject">SDLSystemErrorFailedToCreateObject</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Error associated with the underlying operating system</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-SDLSystemErrorFailedToCreateObject">
+ SDLSystemErrorFailedToCreateObject
+ </h3>
+
+ <p>iOS failed to create an object</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLSystemErrorFailedToCreateObject</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">failedToCreateObject</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Enums/SDLTextAndGraphicManagerError.html b/docs/Enums/SDLTextAndGraphicManagerError.html
index 2bec3bb4a..4877dffc6 100644
--- a/docs/Enums/SDLTextAndGraphicManagerError.html
+++ b/docs/Enums/SDLTextAndGraphicManagerError.html
@@ -4,6 +4,8 @@
<ul>
<li><a href="#section-SDLTextAndGraphicManagerErrorPendingUpdateSuperseded">SDLTextAndGraphicManagerErrorPendingUpdateSuperseded</a></li>
+ <li><a href="#section-SDLTextAndGraphicManagerErrorCurrentlyBatching">SDLTextAndGraphicManagerErrorCurrentlyBatching</a></li>
+ <li><a href="#section-SDLTextAndGraphicManagerErrorNothingToUpdate">SDLTextAndGraphicManagerErrorNothingToUpdate</a></li>
</ul>
<h3>Overview</h3>
@@ -30,4 +32,40 @@
+ <h3 id="section-SDLTextAndGraphicManagerErrorCurrentlyBatching">
+ SDLTextAndGraphicManagerErrorCurrentlyBatching
+ </h3>
+
+ <p>The manager is currently batching updates so the update will not yet be sent and the handler will not be called</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLTextAndGraphicManagerErrorCurrentlyBatching</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">currentlyBatching</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLTextAndGraphicManagerErrorNothingToUpdate">
+ SDLTextAndGraphicManagerErrorNothingToUpdate
+ </h3>
+
+ <p>The manager could find nothing to update</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight objective_c"><code><span class="n">SDLTextAndGraphicManagerErrorNothingToUpdate</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight swift"><code><span class="k">case</span> <span class="n">nothingToUpdate</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span></code></pre>
+
+
+
+
</section>
diff --git a/docs/Protocols.html b/docs/Protocols.html
index f432119b2..a19e0783f 100644
--- a/docs/Protocols.html
+++ b/docs/Protocols.html
@@ -278,17 +278,13 @@
SDLStreamingVideoDelegate
</h3>
- <p>Undocumented</p>
+ <p>A delegate method about changes to streaming video for streaming video apps</p>
<a href="Protocols/SDLStreamingVideoDelegate.html" class="slightly-smaller">See more</a>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">@protocol</span> <span class="nc">SDLStreamingVideoDelegate</span> <span class="o">&lt;</span><span class="n">NSObject</span><span class="o">&gt;</span>
-
-<span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">videoStreamingSizeDidUpdate</span><span class="p">:(</span><span class="n">CGSize</span><span class="p">)</span><span class="nv">displaySize</span> <span class="n">NS_SWIFT_NAME</span><span class="p">(</span><span class="n">videoStreamingSizeDidUpdate</span><span class="p">(</span><span class="n">toSize</span><span class="o">:</span><span class="p">));</span>
-
-<span class="k">@end</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">@protocol</span> <span class="nc">SDLStreamingVideoDelegate</span> <span class="o">&lt;</span><span class="n">NSObject</span><span class="o">&gt;</span></code></pre>
<h4>Swift</h4>
diff --git a/docs/Protocols/SDLKeyboardDelegate.html b/docs/Protocols/SDLKeyboardDelegate.html
index d685fa7fb..088ec9160 100644
--- a/docs/Protocols/SDLKeyboardDelegate.html
+++ b/docs/Protocols/SDLKeyboardDelegate.html
@@ -138,7 +138,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">optional</span> <span class="kd">func</span> <span class="nf">updateCharacterSet</span><span class="p">(</span><span class="n">withInput</span> <span class="nv">currentInputText</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">completionHandler</span><span class="p">:</span> <span class="kd">@escaping</span> <span class="kt"><a href="../Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardCharacterSetCompletionHandler">SDLKeyboardCharacterSetCompletionHandler</a></span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">optional</span> <span class="kd">func</span> <span class="nf">updateCharacterSet</span><span class="p">(</span><span class="n">withInput</span> <span class="nv">currentInputText</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="k">async</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?</span></code></pre>
diff --git a/docs/Protocols/SDLSecurityType.html b/docs/Protocols/SDLSecurityType.html
index 42b474ef8..6d5c75387 100644
--- a/docs/Protocols/SDLSecurityType.html
+++ b/docs/Protocols/SDLSecurityType.html
@@ -56,7 +56,7 @@
<h4>Swift</h4>
- <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">withAppId</span> <span class="nv">appId</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">completionHandler</span><span class="p">:</span> <span class="kd">@escaping</span> <span class="p">(</span><span class="kt">Error</span><span class="p">?)</span> <span class="o">-&gt;</span> <span class="kt">Void</span><span class="p">)</span></code></pre>
+ <pre class="highlight swift"><code><span class="kd">func</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">withAppId</span> <span class="nv">appId</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="k">async</span> <span class="k">throws</span></code></pre>
diff --git a/docs/Protocols/SDLStreamingVideoDelegate.html b/docs/Protocols/SDLStreamingVideoDelegate.html
index bc1827780..239bf9fa9 100644
--- a/docs/Protocols/SDLStreamingVideoDelegate.html
+++ b/docs/Protocols/SDLStreamingVideoDelegate.html
@@ -8,7 +8,7 @@
<h3>Overview</h3>
-<p>Undocumented</p>
+<p>A delegate method about changes to streaming video for streaming video apps</p>
<section class="section task-group-section">
@@ -16,12 +16,12 @@
-videoStreamingSizeDidUpdate:
</h3>
- <p>Undocumented</p>
+ <p>Callback notifying of a size update for the video streaming window on the module UI</p>
<h4>Objective-C</h4>
- <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">videoStreamingSizeDidUpdate</span><span class="p">:(</span><span class="n">CGSize</span><span class="p">)</span><span class="nv">displaySize</span> <span class="n">NS_SWIFT_NAME</span><span class="p">(</span><span class="n">videoStreamingSizeDidUpdate</span><span class="p">(</span><span class="n">toSize</span><span class="o">:</span><span class="p">));</span></code></pre>
+ <pre class="highlight objective_c"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">videoStreamingSizeDidUpdate</span><span class="p">:(</span><span class="n">CGSize</span><span class="p">)</span><span class="nv">displaySize</span><span class="p">;</span></code></pre>
<h4>Swift</h4>
@@ -29,5 +29,10 @@
+ <h4>Parameters</h4>
+ <dl>
+ <dt>displaySize</dt>
+ <dd><p>The new size of the video streaming window on the module</p></dd>
+ </dl>
</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 70b25caf9..3aa4c8c80 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1404,6 +1404,8 @@
url: Constants.html#/c:@SDLErrorDomainSoftButtonManager
- name: SDLErrorDomainSubscribeButtonManager
url: Constants.html#/c:@SDLErrorDomainSubscribeButtonManager
+ - name: SDLErrorDomainSystem
+ url: Constants.html#/c:@SDLErrorDomainSystem
- name: SDLErrorDomainSystemCapabilityManager
url: Constants.html#/c:@SDLErrorDomainSystemCapabilityManager
- name: SDLErrorDomainTextAndGraphicManager
@@ -3238,8 +3240,6 @@
url: Constants.html#/c:@SmartDeviceLinkVersionString
- name: Enumerations
sub_nav:
- - name: MenuCellState
- url: Enums/MenuCellState.html
- name: SDLAlertManagerError
url: Enums/SDLAlertManagerError.html
- name: SDLArtworkImageFormat
@@ -3300,6 +3300,8 @@
url: Enums/SDLSubscribeButtonManagerError.html
- name: SDLSystemCapabilityManagerError
url: Enums/SDLSystemCapabilityManagerError.html
+ - name: SDLSystemError
+ url: Enums/SDLSystemError.html
- name: SDLTextAndGraphicManagerError
url: Enums/SDLTextAndGraphicManagerError.html
- name: SDLTouchIdentifier
diff --git a/docs/search.json b/docs/search.json
index 89d6107e7..ac43045a0 100644
--- a/docs/search.json
+++ b/docs/search.json
@@ -1 +1 @@
-{"Type%20Definitions.html#/c:SDLAlertView.h@T@SDLAlertCanceledHandler":{"name":"SDLAlertCanceledHandler","abstract":"<p>Notifies the subscriber that the alert should be cancelled.</p>"},"Type%20Definitions.html#/c:SDLAmbientLightStatus.h@T@SDLAmbientLightStatus":{"name":"SDLAmbientLightStatus","abstract":"<p>Reflects the status of the ambient light sensor for headlamps</p>"},"Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType":{"name":"SDLAppCapabilityType","abstract":"<p>Enumerations of all available app capability types</p>"},"Type%20Definitions.html#/c:SDLAppHMIType.h@T@SDLAppHMIType":{"name":"SDLAppHMIType","abstract":"<p>Enumeration listing possible app hmi types.</p>"},"Type%20Definitions.html#/c:SDLAppInterfaceUnregisteredReason.h@T@SDLAppInterfaceUnregisteredReason":{"name":"SDLAppInterfaceUnregisteredReason","abstract":"<p>Indicates reason why app interface was unregistered. The application is being disconnected by SDL.</p>"},"Type%20Definitions.html#/c:SDLAppServiceType.h@T@SDLAppServiceType":{"name":"SDLAppServiceType","abstract":"<p>Enumeration listing possible app service types.</p>"},"Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator":{"name":"SDLAudioStreamingIndicator","abstract":"<p>Enumeration listing possible indicators of audio streaming changes</p>"},"Type%20Definitions.html#/c:SDLAudioStreamingState.h@T@SDLAudioStreamingState":{"name":"SDLAudioStreamingState","abstract":"<p>Describes whether or not streaming audio is currently audible to the user. Though provided in every OnHMIStatus notification, this information is only relevant for applications that declare themselves as media apps in RegisterAppInterface</p>"},"Type%20Definitions.html#/c:SDLAudioType.h@T@SDLAudioType":{"name":"SDLAudioType","abstract":"<p>Describes different audio type options for PerformAudioPassThru</p>"},"Type%20Definitions.html#/c:SDLBitsPerSample.h@T@SDLBitsPerSample":{"name":"SDLBitsPerSample","abstract":"<p>Describes different bit depth options for PerformAudioPassThru</p>"},"Type%20Definitions.html#/c:SDLButtonEventMode.h@T@SDLButtonEventMode":{"name":"SDLButtonEventMode","abstract":"<p>Indicates whether the button was depressed or released. A BUTTONUP event will always be preceded by a BUTTONDOWN event.</p>"},"Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName":{"name":"SDLButtonName","abstract":"<p>Defines logical buttons which, on a given SDL unit, would correspond to either physical or soft (touchscreen) buttons. These logical buttons present a standard functional abstraction which the developer can rely upon, independent of the SDL unit. For example, the developer can rely upon the OK button having the same meaning to the user across SDL platforms.</p>"},"Type%20Definitions.html#/c:SDLButtonPressMode.h@T@SDLButtonPressMode":{"name":"SDLButtonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press</p>"},"Type%20Definitions.html#/c:SDLCapacityUnit.h@T@SDLCapacityUnit":{"name":"SDLCapacityUnit","abstract":"<p>@since SDL 7.0.0</p>"},"Type%20Definitions.html#/c:SDLCarModeStatus.h@T@SDLCarModeStatus":{"name":"SDLCarModeStatus","abstract":"<p>Describes the carmode the vehicle is in. Used in ClusterModeStatus</p>"},"Type%20Definitions.html#/c:SDLCharacterSet.h@T@SDLCharacterSet":{"name":"SDLCharacterSet","abstract":"<p>The list of potential character sets</p>"},"Type%20Definitions.html#/c:SDLChoiceSet.h@T@SDLChoiceSetCanceledHandler":{"name":"SDLChoiceSetCanceledHandler","abstract":"<p>Notifies the subscriber that the choice set should be cancelled.</p>"},"Type%20Definitions.html#/c:SDLCompassDirection.h@T@SDLCompassDirection":{"name":"SDLCompassDirection","abstract":"<p>The list of potential compass directions. Used in GPS data</p>"},"Type%20Definitions.html#/c:SDLComponentVolumeStatus.h@T@SDLComponentVolumeStatus":{"name":"SDLComponentVolumeStatus","abstract":"<p>The volume status of a vehicle component. Used in SingleTireStatus and VehicleData Fuel Level</p>"},"Type%20Definitions.html#/c:SDLDefrostZone.h@T@SDLDefrostZone":{"name":"SDLDefrostZone","abstract":"<p>Enumeration listing possible defrost zones. Used in ClimateControlCapabilities and Data.</p>"},"Type%20Definitions.html#/c:SDLDeliveryMode.h@T@SDLDeliveryMode":{"name":"SDLDeliveryMode","abstract":"<p>Specifies the mode in which the sendLocation request is sent. Used in SendLocation.</p>"},"Type%20Definitions.html#/c:SDLDeviceLevelStatus.h@T@SDLDeviceLevelStatus":{"name":"SDLDeviceLevelStatus","abstract":"<p>Reflects the reported battery status of the connected device, if reported. Used in DeviceStatus.</p>"},"Type%20Definitions.html#/c:SDLDimension.h@T@SDLDimension":{"name":"SDLDimension","abstract":"<p>The supported dimensions of the GPS. Used in GPSData</p>"},"Type%20Definitions.html#/c:SDLDirection.h@T@SDLDirection":{"name":"SDLDirection","abstract":"<p>A navigation direction.</p>"},"Type%20Definitions.html#/c:SDLDisplayMode.h@T@SDLDisplayMode":{"name":"SDLDisplayMode","abstract":"<p>Identifies the various display types used by SDL.</p>"},"Type%20Definitions.html#/c:SDLDisplayType.h@T@SDLDisplayType":{"name":"SDLDisplayType","abstract":"<p>Identifies the various display types used by SDL. Used in DisplayCapabilities.</p>"},"Type%20Definitions.html#/c:SDLDistanceUnit.h@T@SDLDistanceUnit":{"name":"SDLDistanceUnit","abstract":"<p>Wiper Status</p>"},"Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType":{"name":"SDLDoorStatusType","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Type%20Definitions.html#/c:SDLDriverDistractionState.h@T@SDLDriverDistractionState":{"name":"SDLDriverDistractionState","abstract":"<p>Enumeration that describes possible states of driver distraction. Used in OnDriverDistraction.</p>"},"Type%20Definitions.html#/c:SDLECallConfirmationStatus.h@T@SDLECallConfirmationStatus":{"name":"SDLECallConfirmationStatus","abstract":"<p>Reflects the status of the eCall Notification. Used in ECallInfo</p>"},"Type%20Definitions.html#/c:SDLElectronicParkBrakeStatus.h@T@SDLElectronicParkBrakeStatus":{"name":"SDLElectronicParkBrakeStatus","abstract":"<p>Reflects the status of the Electronic Parking Brake. A Vehicle Data Type.</p>"},"Type%20Definitions.html#/c:SDLEmergencyEventType.h@T@SDLEmergencyEventType":{"name":"SDLEmergencyEventType","abstract":"<p>Reflects the emergency event status of the vehicle. Used in EmergencyEvent</p>"},"Type%20Definitions.html#/c:SDLEnum.h@T@SDLEnum":{"name":"SDLEnum","abstract":"<p>NSString SDLEnum typedef</p>"},"Type%20Definitions.html#/c:SDLErrorConstants.h@T@SDLErrorDomain":{"name":"SDLErrorDomain","abstract":"<p>A typedef declaration of the SDL error domain</p>"},"Type%20Definitions.html#/c:SDLFileManager.h@T@SDLFileManagerStartupCompletionHandler":{"name":"SDLFileManagerStartupCompletionHandler","abstract":"<p>The handler that is called when the manager is set up or failed to set up with an error."},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileName":{"name":"SDLFileName","abstract":"<p>Typedef SDLFileName</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadCompletionHandler":{"name":"SDLFileManagerUploadCompletionHandler","abstract":"<p>A completion handler called after a response from Core to an upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadCompletionHandler":{"name":"SDLFileManagerMultiUploadCompletionHandler","abstract":"<p>A completion handler called after a set of upload requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadProgressHandler":{"name":"SDLFileManagerMultiUploadProgressHandler","abstract":"<p>In a multiple request send, a handler called after each response from Core to a upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerDeleteCompletionHandler":{"name":"SDLFileManagerDeleteCompletionHandler","abstract":"<p>A completion handler called after a response from Core to a delete request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiDeleteCompletionHandler":{"name":"SDLFileManagerMultiDeleteCompletionHandler","abstract":"<p>A completion handler called after a set of delete requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerListFilesCompletionHandler":{"name":"SDLFileManagerListFilesCompletionHandler","abstract":"<p>A completion handler called after response from Core to a list files request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadArtworkCompletionHandler":{"name":"SDLFileManagerUploadArtworkCompletionHandler","abstract":"<p>A completion handler called after a response from Core to an artwork upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkCompletionHandler":{"name":"SDLFileManagerMultiUploadArtworkCompletionHandler","abstract":"<p>A completion handler called after a set of upload artwork requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkProgressHandler":{"name":"SDLFileManagerMultiUploadArtworkProgressHandler","abstract":"<p>In a multiple request send, a handler called after each response from Core to an artwork upload request.</p>"},"Type%20Definitions.html#/c:SDLFileType.h@T@SDLFileType":{"name":"SDLFileType","abstract":"<p>Enumeration listing possible file types. Used in SDLFile, PutFile, ImageField, OnSystemRequest</p>"},"Type%20Definitions.html#/c:SDLFuelCutoffStatus.h@T@SDLFuelCutoffStatus":{"name":"SDLFuelCutoffStatus","abstract":"<p>Reflects the status of the Restraints Control Module fuel pump cutoff. The fuel pump is cut off typically after the vehicle has had a collision. Used in EmergencyEvent.</p>"},"Type%20Definitions.html#/c:SDLFuelType.h@T@SDLFuelType":{"name":"SDLFuelType","abstract":"<p>Enumeration listing possible fuel types.</p>"},"Type%20Definitions.html#/c:SDLGlobalProperty.h@T@SDLGlobalProperty":{"name":"SDLGlobalProperty","abstract":"<p>Properties of a user-initiated VR interaction (i.e. interactions started by the user pressing the PTT button). Used in RPCs related to ResetGlobalProperties</p>"},"Type%20Definitions.html#/c:SDLHMILevel.h@T@SDLHMILevel":{"name":"SDLHMILevel","abstract":"<p>Specifies current level of the HMI. An HMI level indicates the degree of user interaction possible through the HMI (e.g. TTS only, display only, VR, etc.). The HMI level varies for an application based on the type of display (i.e. Nav or non-Nav) and the user directing &ldquo;focus&rdquo; to other applications (e.g. phone, other mobile applications, etc.). Used in OnHMIStatus</p>"},"Type%20Definitions.html#/c:SDLHMIZoneCapabilities.h@T@SDLHMIZoneCapabilities":{"name":"SDLHMIZoneCapabilities","abstract":"<p>Specifies HMI Zones in the vehicle. Used in RegisterAppInterfaceResponse</p>"},"Type%20Definitions.html#/c:SDLHybridAppPreference.h@T@SDLHybridAppPreference":{"name":"SDLHybridAppPreference","abstract":"<p>Enumeration for the user&rsquo;s preference of which app type to use when both are available.</p>"},"Type%20Definitions.html#/c:SDLIgnitionStableStatus.h@T@SDLIgnitionStableStatus":{"name":"SDLIgnitionStableStatus","abstract":"<p>Reflects the ignition switch stability. Used in BodyInformation</p>"},"Type%20Definitions.html#/c:SDLIgnitionStatus.h@T@SDLIgnitionStatus":{"name":"SDLIgnitionStatus","abstract":"<p>Reflects the status of ignition. Used in BodyInformation.</p>"},"Type%20Definitions.html#/c:SDLImageFieldName.h@T@SDLImageFieldName":{"name":"SDLImageFieldName","abstract":"<p>The name that identifies the field. Used in DisplayCapabilities.</p>"},"Type%20Definitions.html#/c:SDLImageType.h@T@SDLImageType":{"name":"SDLImageType","abstract":"<p>Contains information about the type of image. Used in Image.</p>"},"Type%20Definitions.html#/c:SDLInteractionMode.h@T@SDLInteractionMode":{"name":"SDLInteractionMode","abstract":"<p>For application-initiated interactions (SDLPerformInteraction), this specifies the mode by which the user is prompted and by which the user&rsquo;s selection is indicated. Used in PerformInteraction.</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardAutocompleteCompletionHandler":{"name":"SDLKeyboardAutocompleteCompletionHandler","abstract":"<p>This handler is called when you wish to update your autocomplete text in response to the user&rsquo;s input</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardAutoCompleteResultsHandler":{"name":"SDLKeyboardAutoCompleteResultsHandler","abstract":"<p>This handler is called when you wish to update your autocomplete text in response to the user&rsquo;s input.</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardCharacterSetCompletionHandler":{"name":"SDLKeyboardCharacterSetCompletionHandler","abstract":"<p>This handler is called when you wish to update your keyboard&rsquo;s limitedCharacterSet in response to the user&rsquo;s input</p>"},"Type%20Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent":{"name":"SDLKeyboardEvent","abstract":"<p>Enumeration listing possible keyboard events. Used in OnKeyboardInput.</p>"},"Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask":{"name":"SDLKeyboardInputMask","abstract":"<p>Enumeration listing possible input character masking.</p>"},"Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout":{"name":"SDLKeyboardLayout","abstract":"<p>Enumeration listing possible keyboard layouts. Used in KeyboardProperties.</p>"},"Type%20Definitions.html#/c:SDLKeypressMode.h@T@SDLKeypressMode":{"name":"SDLKeypressMode","abstract":"<p>Enumeration listing possible keyboard events.</p>"},"Type%20Definitions.html#/c:SDLLanguage.h@T@SDLLanguage":{"name":"SDLLanguage","abstract":"<p>Specifies the language to be used for TTS, VR, displayed messages/menus. Used in ChangeRegistration and RegisterAppInterface.</p>"},"Type%20Definitions.html#/c:SDLLayoutMode.h@T@SDLLayoutMode":{"name":"SDLLayoutMode","abstract":"<p>For touchscreen interactions, the mode of how the choices are presented. Used in PerformInteraction.</p>"},"Type%20Definitions.html#/c:SDLLightName.h@T@SDLLightName":{"name":"SDLLightName","abstract":"<p>The name that identifies the Light</p>"},"Type%20Definitions.html#/c:SDLLightStatus.h@T@SDLLightStatus":{"name":"SDLLightStatus","abstract":"<p>Reflects the status of Light.</p>"},"Type%20Definitions.html#/c:SDLLockScreenViewController.h@T@SwipeGestureCallbackBlock":{"name":"SwipeGestureCallbackBlock","abstract":"<p>A block that can be used to close the lockscreen when the user swipes on the lockscreen. Override this in your own custom view controllers if you build a custom lock screen.</p>"},"Type%20Definitions.html#/c:SDLLogConstants.h@T@SDLLogFilterBlock":{"name":"SDLLogFilterBlock","abstract":"<p>A block that takes in a log model and returns whether or not the log passes the filter and should therefore be logged.</p>"},"Type%20Definitions.html#/c:SDLMaintenanceModeStatus.h@T@SDLMaintenanceModeStatus":{"name":"SDLMaintenanceModeStatus","abstract":"<p>Describes the maintenance mode. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLManager.h@T@SDLManagerReadyBlock":{"name":"SDLManagerReadyBlock","abstract":"<p>The block called when the manager is ready to be used or an error occurs while attempting to become ready.</p>"},"Type%20Definitions.html#/c:SDLManager.h@T@SDLRPCUpdatedBlock":{"name":"SDLRPCUpdatedBlock","abstract":"<p>The block that will be called every time an RPC is received when subscribed to an RPC.</p>"},"Type%20Definitions.html#/c:SDLMassageCushion.h@T@SDLMassageCushion":{"name":"SDLMassageCushion","abstract":"<p>The List possible cushions of a multi-contour massage seat.</p>"},"Type%20Definitions.html#/c:SDLMassageMode.h@T@SDLMassageMode":{"name":"SDLMassageMode","abstract":"<p>The List possible modes of a massage zone.</p>"},"Type%20Definitions.html#/c:SDLMassageZone.h@T@SDLMassageZone":{"name":"SDLMassageZone","abstract":"<p>List possible zones of a multi-contour massage seat.</p>"},"Type%20Definitions.html#/c:SDLMediaClockFormat.h@T@SDLMediaClockFormat":{"name":"SDLMediaClockFormat","abstract":"<p>Indicates the format of the time displayed on the connected SDL unit.</p>"},"Type%20Definitions.html#/c:SDLMediaType.h@T@SDLMediaType":{"name":"SDLMediaType","abstract":"<p>Enumeration listing possible media types.</p>"},"Type%20Definitions.html#/c:SDLMenuCell.h@T@SDLMenuCellSelectionHandler":{"name":"SDLMenuCellSelectionHandler","abstract":"<p>The handler to run when a menu item is selected.</p>"},"Type%20Definitions.html#/c:SDLMenuLayout.h@T@SDLMenuLayout":{"name":"SDLMenuLayout","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLMetadataType.h@T@SDLMetadataType":{"name":"SDLMetadataType","abstract":"<p>Text Field metadata types. Used in Show.</p>"},"Type%20Definitions.html#/c:SDLModuleType.h@T@SDLModuleType":{"name":"SDLModuleType","abstract":"<p>The type of remote control data. Used in ButtonPress, GetInteriorVehicleData, and ModuleData</p>"},"Type%20Definitions.html#/c:SDLNavigationAction.h@T@SDLNavigationAction":{"name":"SDLNavigationAction","abstract":"<p>A navigation action.</p>"},"Type%20Definitions.html#/c:SDLNavigationJunction.h@T@SDLNavigationJunction":{"name":"SDLNavigationJunction","abstract":"<p>A navigation junction type.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationName":{"name":"SDLNotificationName","abstract":"<p>NSNotification names specific to incoming SDL RPC</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationUserInfoKey":{"name":"SDLNotificationUserInfoKey","abstract":"<p>The key used in all SDL NSNotifications to extract the response or notification from the userInfo dictionary.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLAudioPassThruHandler":{"name":"SDLAudioPassThruHandler","abstract":"<p>A handler used on SDLPerformAudioPassThru.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLResponseHandler":{"name":"SDLResponseHandler","abstract":"<p>A handler used on all RPC requests which fires when the response is received.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleRequestCompletionHandler":{"name":"SDLMultipleRequestCompletionHandler","abstract":"<p>A completion handler called after a sequential or simultaneous set of requests have completed sending.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleSequentialRequestProgressHandler":{"name":"SDLMultipleSequentialRequestProgressHandler","abstract":"<p>A handler called after each response to a request comes in in a multiple request send.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleAsyncRequestProgressHandler":{"name":"SDLMultipleAsyncRequestProgressHandler","abstract":"<p>A handler called after each response to a request comes in in a multiple request send.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCButtonNotificationHandler":{"name":"SDLRPCButtonNotificationHandler","abstract":"<p>A handler that may optionally be run when an SDLSubscribeButton or SDLSoftButton has a corresponding notification occur.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCCommandNotificationHandler":{"name":"SDLRPCCommandNotificationHandler","abstract":"<p>A handler that may optionally be run when an SDLAddCommand has a corresponding notification occur.</p>"},"Type%20Definitions.html#/c:SDLPRNDL.h@T@SDLPRNDL":{"name":"SDLPRNDL","abstract":"<p>The selected gear the car is in. Used in retrieving vehicle data.</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName":{"name":"SDLPermissionRPCName","abstract":"<p>NSString typedef</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionObserverIdentifier":{"name":"SDLPermissionObserverIdentifier","abstract":"<p>NSUUID typedef</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionsChangedHandler":{"name":"SDLPermissionsChangedHandler","abstract":"<p>This is a block that is passed in to some methods that will be stored and called when specified permissions change.</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLRPCPermissionStatusChangedHandler":{"name":"SDLRPCPermissionStatusChangedHandler","abstract":"<p>A block that will be called when specified permissions change. It will return whether each RPC and its parameters are allowed as well as the permission group status of all the RPCs.</p>"},"Type%20Definitions.html#/c:SDLPermissionStatus.h@T@SDLPermissionStatus":{"name":"SDLPermissionStatus","abstract":"<p>Enumeration that describes possible permission states of a policy table entry. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLPowerModeQualificationStatus.h@T@SDLPowerModeQualificationStatus":{"name":"SDLPowerModeQualificationStatus","abstract":"<p>Describes the power mode qualification status. Used in ClusterModeStatus.</p>"},"Type%20Definitions.html#/c:SDLPowerModeStatus.h@T@SDLPowerModeStatus":{"name":"SDLPowerModeStatus","abstract":"<p>The status of the car&rsquo;s power. Used in ClusterModeStatus.</p>"},"Type%20Definitions.html#/c:SDLPredefinedLayout.h@T@SDLPredefinedLayout":{"name":"SDLPredefinedLayout","abstract":"<p>A template layout an app uses to display information. The broad details of the layout are defined, but the details depend on the IVI system. Used in SetDisplayLayout.</p>"},"Type%20Definitions.html#/c:SDLPrerecordedSpeech.h@T@SDLPrerecordedSpeech":{"name":"SDLPrerecordedSpeech","abstract":"<p>Contains information about the speech capabilities on the SDL platform. Used in RegisterAppInterfaceResponse to indicate capability.</p>"},"Type%20Definitions.html#/c:SDLPrimaryAudioSource.h@T@SDLPrimaryAudioSource":{"name":"SDLPrimaryAudioSource","abstract":"<p>Reflects the current primary audio source of SDL (if selected). Used in DeviceStatus.</p>"},"Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName":{"name":"SDLRPCFunctionName","abstract":"<p>All RPC request / response / notification names</p>"},"Type%20Definitions.html#/c:SDLRPCMessageType.h@T@SDLRPCMessageTypeName":{"name":"SDLRPCMessageTypeName","abstract":"<p>A type of RPC message</p>"},"Type%20Definitions.html#/c:SDLRadioBand.h@T@SDLRadioBand":{"name":"SDLRadioBand","abstract":"<p>Radio bands, such as AM and FM, used in RadioControlData</p>"},"Type%20Definitions.html#/c:SDLRadioState.h@T@SDLRadioState":{"name":"SDLRadioState","abstract":"<p>List possible states of a remote control radio module. Used in RadioControlData.</p>"},"Type%20Definitions.html#/c:SDLRequestType.h@T@SDLRequestType":{"name":"SDLRequestType","abstract":"<p>A type of system request. Used in SystemRequest.</p>"},"Type%20Definitions.html#/c:SDLResult.h@T@SDLResult":{"name":"SDLResult","abstract":"<p>Defines the possible result codes returned by SDL to the application in a response to a requested operation. Used in RPC responses</p>"},"Type%20Definitions.html#/c:SDLSamplingRate.h@T@SDLSamplingRate":{"name":"SDLSamplingRate","abstract":"<p>Describes different sampling rates for PerformAudioPassThru and AudioPassThruCapabilities</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler":{"name":"SDLScreenManagerUpdateCompletionHandler","abstract":"<p>The handler run when the update has completed</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLPreloadChoiceCompletionHandler":{"name":"SDLPreloadChoiceCompletionHandler","abstract":"<p>Return an error with userinfo [key: SDLChoiceCell, value: NSError] if choices failed to upload</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLSubscribeButtonHandler":{"name":"SDLSubscribeButtonHandler","abstract":"<p>A handler run when the subscribe button has been selected</p>"},"Type%20Definitions.html#/c:SDLSeatMemoryActionType.h@T@SDLSeatMemoryActionType":{"name":"SDLSeatMemoryActionType","abstract":"<p>List of possible actions on Seat Meomry</p>"},"Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType":{"name":"SDLSeekIndicatorType","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Type%20Definitions.html#/c:SDLServiceUpdateReason.h@T@SDLServiceUpdateReason":{"name":"SDLServiceUpdateReason","abstract":"<p>Enumeration listing possible service update reasons.</p>"},"Type%20Definitions.html#/c:SDLSoftButtonType.h@T@SDLSoftButtonType":{"name":"SDLSoftButtonType","abstract":"<p>SoftButtonType (TEXT / IMAGE / BOTH). Used by SoftButton.</p>"},"Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities":{"name":"SDLSpeechCapabilities","abstract":"<p>Contains information about TTS capabilities on the SDL platform. Used in RegisterAppInterfaceResponse, and TTSChunk.</p>"},"Type%20Definitions.html#/c:SDLStaticIconName.h@T@SDLStaticIconName":{"name":"SDLStaticIconName","abstract":"<p>Static icon names</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLVideoStreamManagerState":{"name":"SDLVideoStreamManagerState","abstract":"<p>The current state of the video stream manager</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAudioStreamManagerState":{"name":"SDLAudioStreamManagerState","abstract":"<p>The current state of the audio stream manager</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAppState":{"name":"SDLAppState","abstract":"<p>Typedef SDLAppState</p>"},"Type%20Definitions.html#/c:SDLSupportedSeat.h@T@SDLSupportedSeat":{"name":"SDLSupportedSeat","abstract":"<p>List possible seats that is a remote controllable seat.</p>"},"Type%20Definitions.html#/c:SDLSystemAction.h@T@SDLSystemAction":{"name":"SDLSystemAction","abstract":"<p>Enumeration that describes system actions that can be triggered. Used in SoftButton.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLUpdateCapabilityHandler":{"name":"SDLUpdateCapabilityHandler","abstract":"<p>A completion handler called after a request for the capability type is returned from the remote system.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLCapabilityUpdateHandler":{"name":"SDLCapabilityUpdateHandler","abstract":"<p>An observer block for whenever a subscription is called.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLCapabilityUpdateWithErrorHandler":{"name":"SDLCapabilityUpdateWithErrorHandler","abstract":"<p>An observer block for whenever a subscription or value is retrieved.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityType.h@T@SDLSystemCapabilityType":{"name":"SDLSystemCapabilityType","abstract":"<p>The type of system capability to get more information on. Used in GetSystemCapability.</p>"},"Type%20Definitions.html#/c:SDLSystemContext.h@T@SDLSystemContext":{"name":"SDLSystemContext","abstract":"<p>Indicates whether or not a user-initiated interaction is in progress, and if so, in what mode (i.e. MENU or VR). Used in OnHMIStatus</p>"},"Type%20Definitions.html#/c:SDLTBTState.h@T@SDLTBTState":{"name":"SDLTBTState","abstract":"<p>The turn-by-turn state, used in OnTBTClientState.</p>"},"Type%20Definitions.html#/c:SDLTPMS.h@T@SDLTPMS":{"name":"SDLTPMS","abstract":"<p>An enum representing values of the tire pressure monitoring system</p>"},"Type%20Definitions.html#/c:SDLTemperatureUnit.h@T@SDLTemperatureUnit":{"name":"SDLTemperatureUnit","abstract":"<p>The unit of temperature to display. Used in Temperature.</p>"},"Type%20Definitions.html#/c:SDLTextAlignment.h@T@SDLTextAlignment":{"name":"SDLTextAlignment","abstract":"<p>The list of possible alignments of text in a field. May only work on some display types. used in Show.</p>"},"Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName":{"name":"SDLTextFieldName","abstract":"<p>Names of the text fields that can appear on a SDL display. Used in TextFieldName.</p>"},"Type%20Definitions.html#/c:SDLTimerMode.h@T@SDLTimerMode":{"name":"SDLTimerMode","abstract":"<p>The direction of a timer. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLTouchManager.h@T@SDLTouchEventHandler":{"name":"SDLTouchEventHandler","abstract":"<p>Handler for touch events</p>"},"Type%20Definitions.html#/c:SDLTouchType.h@T@SDLTouchType":{"name":"SDLTouchType","abstract":"<p>The type of a touch in a projection application. Used in OnTouchEvent.</p>"},"Type%20Definitions.html#/c:SDLTransmissionType.h@T@SDLTransmissionType":{"name":"SDLTransmissionType","abstract":"<p>Type of transmission used in the vehicle.</p>"},"Type%20Definitions.html#/c:SDLTriggerSource.h@T@SDLTriggerSource":{"name":"SDLTriggerSource","abstract":"<p>Indicates whether choice/command was selected via VR or via a menu selection (using SEEKRIGHT/SEEKLEFT, TUNEUP, TUNEDOWN, OK buttons). Used in PerformInteractionResponse and OnCommand.</p>"},"Type%20Definitions.html#/c:SDLTurnSignal.h@T@SDLTurnSignal":{"name":"SDLTurnSignal","abstract":"<p>Enumeration that describes the status of the turn light indicator.</p>"},"Type%20Definitions.html#/c:SDLUpdateMode.h@T@SDLUpdateMode":{"name":"SDLUpdateMode","abstract":"<p>Specifies what function should be performed on the media clock/counter. Used in SetMediaClockTimer.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataActiveStatus.h@T@SDLVehicleDataActiveStatus":{"name":"SDLVehicleDataActiveStatus","abstract":"<p>Vehicle Data Activity Status. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataEventStatus.h@T@SDLVehicleDataEventStatus":{"name":"SDLVehicleDataEventStatus","abstract":"<p>Reflects the status of a vehicle data event; e.g. a seat belt event status. Used in retrieving vehicle data.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataNotificationStatus.h@T@SDLVehicleDataNotificationStatus":{"name":"SDLVehicleDataNotificationStatus","abstract":"<p>Reflects the status of a vehicle data notification. Used in ECallInfo</p>"},"Type%20Definitions.html#/c:SDLVehicleDataResultCode.h@T@SDLVehicleDataResultCode":{"name":"SDLVehicleDataResultCode","abstract":"<p>Vehicle Data Result Code. Used in DIDResult.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataStatus.h@T@SDLVehicleDataStatus":{"name":"SDLVehicleDataStatus","abstract":"<p>Reflects the status of a binary vehicle data item. Used in MyKey.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataType.h@T@SDLVehicleDataType":{"name":"SDLVehicleDataType","abstract":"<p>Defines the vehicle data types that can be published and/or subscribed to using SDLSubscribeVehicleData. Used in VehicleDataResult</p>"},"Type%20Definitions.html#/c:SDLVentilationMode.h@T@SDLVentilationMode":{"name":"SDLVentilationMode","abstract":"<p>The ventilation mode. Used in ClimateControlCapabilities</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingCodec.h@T@SDLVideoStreamingCodec":{"name":"SDLVideoStreamingCodec","abstract":"<p>Enum for each type of video streaming codec. Used in VideoStreamingFormat.</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingProtocol.h@T@SDLVideoStreamingProtocol":{"name":"SDLVideoStreamingProtocol","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingState.h@T@SDLVideoStreamingState":{"name":"SDLVideoStreamingState","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLVoiceCommand.h@T@SDLVoiceCommandSelectionHandler":{"name":"SDLVoiceCommandSelectionHandler","abstract":"<p>The handler that will be called when the command is activated</p>"},"Type%20Definitions.html#/c:SDLVrCapabilities.h@T@SDLVRCapabilities":{"name":"SDLVRCapabilities","abstract":"<p>The VR capabilities of the connected SDL platform. Used in RegisterAppInterfaceResponse.</p>"},"Type%20Definitions.html#/c:SDLWarningLightStatus.h@T@SDLWarningLightStatus":{"name":"SDLWarningLightStatus","abstract":"<p>Reflects the status of a cluster instrument warning light. Used in TireStatus</p>"},"Type%20Definitions.html#/c:SDLWayPointType.h@T@SDLWayPointType":{"name":"SDLWayPointType","abstract":"<p>The type of a navigation waypoint. Used in GetWayPoints.</p>"},"Type%20Definitions.html#/c:SDLWindowType.h@T@SDLWindowType":{"name":"SDLWindowType","abstract":"<p>The type of the window to be created. Main window or widget.</p>"},"Type%20Definitions.html#/c:SDLWiperStatus.h@T@SDLWiperStatus":{"name":"SDLWiperStatus","abstract":"<p>The status of the windshield wipers. Used in retrieving vehicle data.</p>"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveSingleTapForView:atPoint:":{"name":"-touchManager:didReceiveSingleTapForView:atPoint:","abstract":"<p>A single tap was received</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveDoubleTapForView:atPoint:":{"name":"-touchManager:didReceiveDoubleTapForView:atPoint:","abstract":"<p>A double tap was received</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidStartInView:atPoint:":{"name":"-touchManager:panningDidStartInView:atPoint:","abstract":"<p>Panning started</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePanningFromPoint:toPoint:":{"name":"-touchManager:didReceivePanningFromPoint:toPoint:","abstract":"<p>Panning moved between points</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidEndInView:atPoint:":{"name":"-touchManager:panningDidEndInView:atPoint:","abstract":"<p>Panning ended</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningCanceledAtPoint:":{"name":"-touchManager:panningCanceledAtPoint:","abstract":"<p>Panning canceled</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidStartInView:atCenterPoint:":{"name":"-touchManager:pinchDidStartInView:atCenterPoint:","abstract":"<p>Pinch did start</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchAtCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchAtCenterPoint:withScale:","abstract":"<p>@abstract","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchInView:atCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchInView:atCenterPoint:withScale:","abstract":"<p>Pinch moved and changed scale</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidEndInView:atCenterPoint:":{"name":"-touchManager:pinchDidEndInView:atCenterPoint:","abstract":"<p>Pinch did end</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchCanceledAtCenterPoint:":{"name":"-touchManager:pinchCanceledAtCenterPoint:","abstract":"<p>Pinch canceled</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLStreamingVideoDelegate.html#/c:objc(pl)SDLStreamingVideoDelegate(im)videoStreamingSizeDidUpdate:":{"name":"-videoStreamingSizeDidUpdate:","abstract":"<p>Undocumented</p>","parent_name":"SDLStreamingVideoDelegate"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)preferredVideoFormatOrderFromHeadUnitPreferredOrder:":{"name":"-preferredVideoFormatOrderFromHeadUnitPreferredOrder:","abstract":"<p>Implement to return a different preferred order of attempted format usage than the head unit&rsquo;s preferred order. In nearly all cases, it&rsquo;s best to simply return the head unit&rsquo;s preferred order, or not implement this method (which does the same thing).</p>","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)resolutionFromHeadUnitPreferredResolution:":{"name":"-resolutionFromHeadUnitPreferredResolution:","abstract":"<p>Implement to return a different resolution to use for video streaming than the head unit&rsquo;s requested resolution. If you return a resolution that the head unit does not like, the manager will fail to start up. In nearly all cases, it&rsquo;s best to simply return the head unit&rsquo;s preferred order, or not implement this method (which does the same thing), and adapt your UI to the head unit&rsquo;s preferred resolution instead.</p>","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(py)audioConnected":{"name":"audioConnected","abstract":"<p>Whether or not the audio byte stream is currently connected</p>","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"<p>Send audio data bytes over the audio byte stream</p>","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLServiceEncryptionDelegate.html#/c:objc(pl)SDLServiceEncryptionDelegate(im)serviceEncryptionUpdatedOnService:encrypted:error:":{"name":"-serviceEncryptionUpdatedOnService:encrypted:error:","abstract":"<p>Called when the encryption service has been.</p>","parent_name":"SDLServiceEncryptionDelegate"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(py)appId":{"name":"appId","abstract":"<p>The app id of the app</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)initializeWithAppId:completionHandler:":{"name":"-initializeWithAppId:completionHandler:","abstract":"<p>Initialize the SDL security library with the app&rsquo;s id and a completion handler</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)stop":{"name":"-stop","abstract":"<p>Stop the security library</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)runHandshakeWithClientData:error:":{"name":"-runHandshakeWithClientData:error:","abstract":"<p>Run the SSL/TLS handshake</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)encryptData:withError:":{"name":"-encryptData:withError:","abstract":"<p>Encrypt data using SSL/TLS</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)decryptData:withError:":{"name":"-decryptData:withError:","abstract":"<p>Decrypt data using SSL/TLS</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(cm)availableMakes":{"name":"+availableMakes","abstract":"<p>The vehicle makes this security library covers</p>","parent_name":"SDLSecurityType"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerDidDisconnect":{"name":"-managerDidDisconnect","abstract":"<p>Called upon a disconnection from the remote system.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)hmiLevel:didChangeToLevel:":{"name":"-hmiLevel:didChangeToLevel:","abstract":"<p>Called when the HMI level state of this application changes on the remote system. This is equivalent to the application&rsquo;s state changes in iOS such as foreground, background, or closed.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)audioStreamingState:didChangeToState:":{"name":"-audioStreamingState:didChangeToState:","abstract":"<p>Called when the audio streaming state of this application changes on the remote system. This refers to when streaming audio is audible to the user.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)videoStreamingState:didChangetoState:":{"name":"-videoStreamingState:didChangetoState:","abstract":"<p>Called when the video streaming state of this application changes. This refers to streaming video for navigation purposes. If you are &ldquo;autostreaming&rdquo; via CarWindow, you should not do anything with this method. Everything should be handled for you automatically.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)systemContext:didChangeToContext:":{"name":"-systemContext:didChangeToContext:","abstract":"<p>Called when the system context of this application changes on the remote system. This refers to whether or not a user-initiated interaction is in progress, and if so, what it is.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerShouldUpdateLifecycleToLanguage:hmiLanguage:":{"name":"-managerShouldUpdateLifecycleToLanguage:hmiLanguage:","abstract":"<p>Called when the lifecycle manager detected a language mismatch. In case of a language mismatch the manager should change the apps registration by updating the lifecycle configuration to the specified language. If the app can support the specified language it should return an Object of SDLLifecycleConfigurationUpdate, otherwise it should return nil to indicate that the language is not supported.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)didReceiveSystemInfo:":{"name":"-didReceiveSystemInfo:","abstract":"<p>A way to determine if this SDL session should continue to be active while connected to the determined system information of the vehicle.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(cm)logger":{"name":"+logger","abstract":"<p>A simple convenience initializer to create the object. This <em>should not</em> start up the logger.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)setupLogger":{"name":"-setupLogger","abstract":"<p>A call to setup the logger in whatever manner it needs to do so.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)logWithLog:formattedLog:":{"name":"-logWithLog:formattedLog:","abstract":"<p>Log a particular log using the model and the formatted log message to the target.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)teardownLogger":{"name":"-teardownLogger","abstract":"<p>The log target should be torn down. e.g. file handles should be closed</p>","parent_name":"SDLLogTarget"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)userDidSubmitInput:withEvent:":{"name":"-userDidSubmitInput:withEvent:","abstract":"<p>The keyboard session completed with some input.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidAbortWithReason:":{"name":"-keyboardDidAbortWithReason:","abstract":"<p>The keyboard session aborted.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)customKeyboardConfiguration":{"name":"-customKeyboardConfiguration","abstract":"<p>Implement this in order to provide a custom keyboard configuration to just this keyboard. To apply default settings to all keyboards, see SDLScreenManager.keyboardConfiguration</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateAutocompleteWithInput:autoCompleteResultsHandler:":{"name":"-updateAutocompleteWithInput:autoCompleteResultsHandler:","abstract":"<p>Implement this if you wish to updated the KeyboardProperties.autoCompleteList as the user updates their input. This is called upon a KEYPRESS event.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateCharacterSetWithInput:completionHandler:":{"name":"-updateCharacterSetWithInput:completionHandler:","abstract":"<p>Implement this if you wish to update the limitedCharacterSet as the user updates their input. This is called upon a KEYPRESS event.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidSendEvent:text:":{"name":"-keyboardDidSendEvent:text:","abstract":"<p>Implement this to be notified of all events occurring on the keyboard</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidUpdateInputMask:":{"name":"-keyboardDidUpdateInputMask:","abstract":"<p>Implement this to be notified of input key mask update (whether or not the user has changed the input to be hidden, like passwords)</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didSelectChoice:withSource:atRowIndex:":{"name":"-choiceSet:didSelectChoice:withSource:atRowIndex:","abstract":"<p>Delegate method called after a choice set item is selected</p>","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didReceiveError:":{"name":"-choiceSet:didReceiveError:","abstract":"<p>Delegate method called on an error</p>","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:fileDidFinishPlaying:successfully:":{"name":"-audioStreamManager:fileDidFinishPlaying:successfully:","abstract":"<p>Called when a file from the SDLAudioStreamManager finishes playing</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForFile:error:":{"name":"-audioStreamManager:errorDidOccurForFile:error:","abstract":"<p>Called when a file from the SDLAudioStreamManager could not play</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:dataBufferDidFinishPlayingSuccessfully:":{"name":"-audioStreamManager:dataBufferDidFinishPlayingSuccessfully:","abstract":"<p>Called when a data buffer from the SDLAudioStreamManager finishes playing</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForDataBuffer:":{"name":"-audioStreamManager:errorDidOccurForDataBuffer:","abstract":"<p>Called when a data buffer from the SDLAudioStreamManager could not play</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols.html#/c:objc(pl)SDLInt":{"name":"SDLInt","abstract":"<p>A declaration that this NSNumber contains an NSInteger.</p>"},"Protocols.html#/c:objc(pl)SDLUInt":{"name":"SDLUInt","abstract":"<p>A declaration that this NSNumber contains an NSUInteger.</p>"},"Protocols.html#/c:objc(pl)SDLBool":{"name":"SDLBool","abstract":"<p>A declaration that this NSNumber contains a BOOL.</p>"},"Protocols.html#/c:objc(pl)SDLFloat":{"name":"SDLFloat","abstract":"<p>A declaration that this NSNumber contains a float.</p>"},"Protocols/SDLAudioStreamManagerDelegate.html":{"name":"SDLAudioStreamManagerDelegate","abstract":"<p>Delegate for the AudioStreamManager</p>"},"Protocols/SDLChoiceSetDelegate.html":{"name":"SDLChoiceSetDelegate","abstract":"<p>Delegate for the SDLChoiceSet. Contains methods that get called when an action is taken on a choice cell.</p>"},"Protocols/SDLKeyboardDelegate.html":{"name":"SDLKeyboardDelegate","abstract":"<p>They delegate of a keyboard popup allowing customization at runtime of the keyboard.</p>"},"Protocols/SDLLogTarget.html":{"name":"SDLLogTarget","abstract":"<p>A protocol describing a place logs from SDLLogManager are logged to</p>"},"Protocols/SDLManagerDelegate.html":{"name":"SDLManagerDelegate","abstract":"<p>The manager&rsquo;s delegate</p>"},"Protocols/SDLSecurityType.html":{"name":"SDLSecurityType","abstract":"<p>A protocol used by SDL Security libraries.</p>"},"Protocols/SDLServiceEncryptionDelegate.html":{"name":"SDLServiceEncryptionDelegate","abstract":"<p>Delegate for the encryption service.</p>"},"Protocols/SDLStreamingAudioManagerType.html":{"name":"SDLStreamingAudioManagerType","abstract":"<p>Streaming audio manager</p>"},"Protocols/SDLStreamingMediaManagerDataSource.html":{"name":"SDLStreamingMediaManagerDataSource","abstract":"<p>A data source for the streaming manager&rsquo;s preferred resolutions and preferred formats.</p>"},"Protocols/SDLStreamingVideoDelegate.html":{"name":"SDLStreamingVideoDelegate","abstract":"<p>Undocumented</p>"},"Protocols/SDLTouchManagerDelegate.html":{"name":"SDLTouchManagerDelegate","abstract":"<p>The delegate to be notified of processed touches such as pinches, pans, and taps</p>"},"Enums/SDLTouchIdentifier.html#/c:@E@SDLTouchIdentifier@SDLTouchIdentifierFirstFinger":{"name":"SDLTouchIdentifierFirstFinger","abstract":"<p>Touch was first finger</p>","parent_name":"SDLTouchIdentifier"},"Enums/SDLTouchIdentifier.html#/c:@E@SDLTouchIdentifier@SDLTouchIdentifierSecondFinger":{"name":"SDLTouchIdentifierSecondFinger","abstract":"<p>Touch was second finger</p>","parent_name":"SDLTouchIdentifier"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagNone":{"name":"SDLStreamingEncryptionFlagNone","abstract":"<p>It should not be encrypted at all</p>","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagAuthenticateOnly":{"name":"SDLStreamingEncryptionFlagAuthenticateOnly","abstract":"<p>It should use SSL/TLS only to authenticate</p>","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagAuthenticateAndEncrypt":{"name":"SDLStreamingEncryptionFlagAuthenticateAndEncrypt","abstract":"<p>All data on these services should be encrypted using SSL/TLS</p>","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeLayer":{"name":"SDLCarWindowRenderingTypeLayer","abstract":"<p>Instead of rendering your UIViewController&rsquo;s view, this will render the layer using renderInContext</p>","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeViewAfterScreenUpdates":{"name":"SDLCarWindowRenderingTypeViewAfterScreenUpdates","abstract":"<p>Renders your UIViewController&rsquo;s view using drawViewHierarchyInRect:bounds afterScreenUpdates:YES</p>","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeViewBeforeScreenUpdates":{"name":"SDLCarWindowRenderingTypeViewBeforeScreenUpdates","abstract":"<p>Renders your UIViewController&rsquo;s view using drawViewHierarchyInRect:bounds afterScreenUpdates:NO</p>","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeRequest":{"name":"SDLRPCMessageTypeRequest","abstract":"<p>A request that will require a response</p>","parent_name":"SDLRPCMessageType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeResponse":{"name":"SDLRPCMessageTypeResponse","abstract":"<p>A response to a request</p>","parent_name":"SDLRPCMessageType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeNotification":{"name":"SDLRPCMessageTypeNotification","abstract":"<p>A message that does not have a response</p>","parent_name":"SDLRPCMessageType"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoHeartbeat":{"name":"SDLFrameInfoHeartbeat","abstract":"<p>A ping packet that is sent to ensure the connection is still active and the service is still valid.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoStartService":{"name":"SDLFrameInfoStartService","abstract":"<p>Requests that a specific type of service is started.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoStartServiceACK":{"name":"SDLFrameInfoStartServiceACK","abstract":"<p>Acknowledges that the specific service has been started successfully.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoStartServiceNACK":{"name":"SDLFrameInfoStartServiceNACK","abstract":"<p>Negatively acknowledges that the specific service was not started.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoEndService":{"name":"SDLFrameInfoEndService","abstract":"<p>Requests that a specific type of service is ended.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoEndServiceACK":{"name":"SDLFrameInfoEndServiceACK","abstract":"<p>Acknowledges that the specific service has been ended successfully.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoEndServiceNACK":{"name":"SDLFrameInfoEndServiceNACK","abstract":"<p>Negatively acknowledges that the specific service was not ended or has not yet been started.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoRegisterSecondaryTransport":{"name":"SDLFrameInfoRegisterSecondaryTransport","abstract":"<p>Notifies that a Secondary Transport has been established.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoRegisterSecondaryTransportACK":{"name":"SDLFrameInfoRegisterSecondaryTransportACK","abstract":"<p>Acknowledges that the Secondary Transport has been recognized.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoRegisterSecondaryTransportNACK":{"name":"SDLFrameInfoRegisterSecondaryTransportNACK","abstract":"<p>Negatively acknowledges that the Secondary Transport has not been recognized.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoTransportEventUpdate":{"name":"SDLFrameInfoTransportEventUpdate","abstract":"<p>Indicates the status or configuration of transport(s) is/are updated.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoServiceDataAck":{"name":"SDLFrameInfoServiceDataAck","abstract":"<p>Deprecated.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoHeartbeatACK":{"name":"SDLFrameInfoHeartbeatACK","abstract":"<p>Acknowledges that a Heartbeat control packet has been received.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoSingleFrame":{"name":"SDLFrameInfoSingleFrame","abstract":"<p>Payload contains a single packet.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoFirstFrame":{"name":"SDLFrameInfoFirstFrame","abstract":"<p>First frame in a multiple frame payload.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLFrameInfo.html#/c:@E@SDLFrameInfo@SDLFrameInfoConsecutiveLastFrame":{"name":"SDLFrameInfoConsecutiveLastFrame","abstract":"<p>Frame in a multiple frame payload.</p>","parent_name":"SDLFrameInfo"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeControl":{"name":"SDLServiceTypeControl","abstract":"<p>The lowest level service available.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeRPC":{"name":"SDLServiceTypeRPC","abstract":"<p>Used to send requests, responses, and notifications between an application and a head unit.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeAudio":{"name":"SDLServiceTypeAudio","abstract":"<p>The application can start the audio service to send PCM audio data to the head unit. After the StartService packet is sent and the ACK received, the payload for the Audio Service is only PCM audio data.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeVideo":{"name":"SDLServiceTypeVideo","abstract":"<p>The application can start the video service to send H.264 video data to the head unit. After the StartService packet is sent and the ACK received, the payload for the Video Service is only H.264 video data.</p>","parent_name":"SDLServiceType"},"Enums/SDLServiceType.html#/c:@E@SDLServiceType@SDLServiceTypeBulkData":{"name":"SDLServiceTypeBulkData","abstract":"<p>Similar to the RPC Service but adds a bulk data field. The payload of a message sent via the Hybrid service consists of a Binary Header, JSON Data, and Bulk Data.</p>","parent_name":"SDLServiceType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeControl":{"name":"SDLFrameTypeControl","abstract":"<p>Lowest-level type of packets. They can be sent over any of the defined services. They are used for the control of the services in which they are sent.</p>","parent_name":"SDLFrameType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeSingle":{"name":"SDLFrameTypeSingle","abstract":"<p>Contains all the data for a particular packet in the payload. The majority of frames sent over the protocol utilize this frame type.</p>","parent_name":"SDLFrameType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeFirst":{"name":"SDLFrameTypeFirst","abstract":"<p>The First Frame in a multiple frame payload contains information about the entire sequence of frames so that the receiving end can correctly parse all the frames and reassemble the entire payload. The payload of this frame is only eight bytes and contains information regarding the rest of the sequence.</p>","parent_name":"SDLFrameType"},"Enums/SDLFrameType.html#/c:@E@SDLFrameType@SDLFrameTypeConsecutive":{"name":"SDLFrameTypeConsecutive","abstract":"<p>The Consecutive Frames in a multiple frame payload contain the actual raw data of the original payload. The parsed payload contained in each of the Consecutive Frames&rsquo; payloads should be buffered until the entire sequence is complete.</p>","parent_name":"SDLFrameType"},"Enums/SDLPredefinedWindows.html#/c:@E@SDLPredefinedWindows@SDLPredefinedWindowsDefaultWindow":{"name":"SDLPredefinedWindowsDefaultWindow","abstract":"<p>The default window is a main window pre-created on behalf of the app.</p>","parent_name":"SDLPredefinedWindows"},"Enums/SDLPredefinedWindows.html#/c:@E@SDLPredefinedWindows@SDLPredefinedWindowsPrimaryWidget":{"name":"SDLPredefinedWindowsPrimaryWidget","abstract":"<p>The primary widget of the app.</p>","parent_name":"SDLPredefinedWindows"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusAllowed":{"name":"SDLPermissionGroupStatusAllowed","abstract":"<p>Every RPC in the group is currently allowed.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusDisallowed":{"name":"SDLPermissionGroupStatusDisallowed","abstract":"<p>Every RPC in the group is currently disallowed.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusMixed":{"name":"SDLPermissionGroupStatusMixed","abstract":"<p>Some RPCs in the group are allowed and some disallowed.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusUnknown":{"name":"SDLPermissionGroupStatusUnknown","abstract":"<p>The current status of the group is unknown.</p>","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupType.html#/c:@E@SDLPermissionGroupType@SDLPermissionGroupTypeAllAllowed":{"name":"SDLPermissionGroupTypeAllAllowed","abstract":"<p>Be notified when all of the RPC in the group are allowed, or, when they all stop being allowed in some sense, that is, when they were all allowed, and now they are not.</p>","parent_name":"SDLPermissionGroupType"},"Enums/SDLPermissionGroupType.html#/c:@E@SDLPermissionGroupType@SDLPermissionGroupTypeAny":{"name":"SDLPermissionGroupTypeAny","abstract":"<p>Be notified when any change in availability occurs among the group.</p>","parent_name":"SDLPermissionGroupType"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateDelete":{"name":"MenuCellStateDelete","abstract":"<p>Marks the cell to be deleted</p>","parent_name":"MenuCellState"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateAdd":{"name":"MenuCellStateAdd","abstract":"<p>Marks the cell to be added</p>","parent_name":"MenuCellState"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateKeep":{"name":"MenuCellStateKeep","abstract":"<p>Marks the cell to be kept</p>","parent_name":"MenuCellState"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeForceOn":{"name":"SDLDynamicMenuUpdatesModeForceOn","abstract":"<p>Forces on compatibility mode. This will force the menu manager to delete and re-add each menu item for every menu update. This mode is generally not advised due to performance issues.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeForceOff":{"name":"SDLDynamicMenuUpdatesModeForceOff","abstract":"<p>This mode forces the menu manager to always dynamically update menu items for each menu update. This will provide the best performance but may cause ordering issues on some SYNC Gen 3 head units.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeOnWithCompatibility":{"name":"SDLDynamicMenuUpdatesModeOnWithCompatibility","abstract":"<p>This mode checks whether the phone is connected to a SYNC Gen 3 head unit, which has known menu ordering issues. If it is, it will always delete and re-add every menu item, if not, it will dynamically update the menus.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeSimple":{"name":"SDLLogFormatTypeSimple","abstract":"<p>A bare-bones log format: <code>09:52:07:324 🔹 (SDL)Protocol – a random test i guess</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDefault":{"name":"SDLLogFormatTypeDefault","abstract":"<p>A middle detail default log format: <code>09:52:07:324 🔹 (SDL)Protocol:SDLV2ProtocolHeader:25 – Some log message</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDetailed":{"name":"SDLLogFormatTypeDetailed","abstract":"<p>A very detailed log format: <code>09:52:07:324 🔹 DEBUG com.apple.main-thread:(SDL)Protocol:[SDLV2ProtocolHeader parse:]:74 – Some log message</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDefault":{"name":"SDLLogLevelDefault","abstract":"<p>This is used to describe that a &ldquo;specific&rdquo; logging will instead use the global log level, for example, a module may use the global log level instead of its own by specifying this level.</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelOff":{"name":"SDLLogLevelOff","abstract":"<p>This is used to describe a level that involves absolutely no logs being output.</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelError":{"name":"SDLLogLevelError","abstract":"<p>Only error level logs will be output</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelWarning":{"name":"SDLLogLevelWarning","abstract":"<p>Both error and warning level logs will be output</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDebug":{"name":"SDLLogLevelDebug","abstract":"<p>Error, warning, and debug level logs will be output. This level will never be output in RELEASE environments</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelVerbose":{"name":"SDLLogLevelVerbose","abstract":"<p>All level logs will be output. This level will never be output in RELEASE environments</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagError":{"name":"SDLLogFlagError","abstract":"<p>Error level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagWarning":{"name":"SDLLogFlagWarning","abstract":"<p>Warning level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagDebug":{"name":"SDLLogFlagDebug","abstract":"<p>Debug level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagVerbose":{"name":"SDLLogFlagVerbose","abstract":"<p>Verbose level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionTransmit":{"name":"SDLLogBytesDirectionTransmit","abstract":"<p>Transmit from the app</p>","parent_name":"SDLLogBytesDirection"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionReceive":{"name":"SDLLogBytesDirectionReceive","abstract":"<p>Receive from the module</p>","parent_name":"SDLLogBytesDirection"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeNever":{"name":"SDLLockScreenConfigurationDisplayModeNever","abstract":"<p>The lock screen should never be shown. This should almost always mean that you will build your own lock screen.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeRequiredOnly":{"name":"SDLLockScreenConfigurationDisplayModeRequiredOnly","abstract":"<p>The lock screen should only be shown when it is required by the head unit.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeOptionalOrRequired":{"name":"SDLLockScreenConfigurationDisplayModeOptionalOrRequired","abstract":"<p>The lock screen should be shown when required by the head unit or when the head unit says that its optional, but <em>not</em> in other cases, such as before the user has interacted with your app on the head unit.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeAlways":{"name":"SDLLockScreenConfigurationDisplayModeAlways","abstract":"<p>The lock screen should always be shown after connection.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLSecondaryTransports.html#/c:@E@SDLSecondaryTransports@SDLSecondaryTransportsNone":{"name":"SDLSecondaryTransportsNone","abstract":"<p>No secondary transport</p>","parent_name":"SDLSecondaryTransports"},"Enums/SDLSecondaryTransports.html#/c:@E@SDLSecondaryTransports@SDLSecondaryTransportsTCP":{"name":"SDLSecondaryTransportsTCP","abstract":"<p>TCP as secondary transport</p>","parent_name":"SDLSecondaryTransports"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNotConnected":{"name":"SDLAudioStreamManagerErrorNotConnected","abstract":"<p>The audio stream is not currently connected</p>","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNoQueuedAudio":{"name":"SDLAudioStreamManagerErrorNoQueuedAudio","abstract":"<p>Attempted to play but there&rsquo;s no audio in the queue</p>","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLCacheFileManagerError.html#/c:@E@SDLCacheFileManagerError@SDLCacheManagerErrorUpdateIconArchiveFileFailure":{"name":"SDLCacheManagerErrorUpdateIconArchiveFileFailure","abstract":"<p>Failed to update archive file</p>","parent_name":"SDLCacheFileManagerError"},"Enums/SDLRPCStoreError.html#/c:@E@SDLRPCStoreError@SDLRPCStoreErrorGetInvalidObject":{"name":"SDLRPCStoreErrorGetInvalidObject","abstract":"<p>In dictionary stored value with unexpected type</p>","parent_name":"SDLRPCStoreError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorUnknown":{"name":"SDLTransportErrorUnknown","abstract":"<p>Connection cannot be established due to a reason not listed here.</p>","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionRefused":{"name":"SDLTransportErrorConnectionRefused","abstract":"<p>TCP connection is refused.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionTimedOut":{"name":"SDLTransportErrorConnectionTimedOut","abstract":"<p>TCP connection cannot be established within given time.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorNetworkDown":{"name":"SDLTransportErrorNetworkDown","abstract":"<p>TCP connection cannot be established since network is down.","parent_name":"SDLTransportError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities":{"name":"SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities","abstract":"<p>The connected head unit does not support any system capabilities</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorHMINone":{"name":"SDLSystemCapabilityManagerErrorHMINone","abstract":"<p>You must be in an HMI Level other than NONE to request or subscribe to capabilities other than DISPLAYS</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays":{"name":"SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays","abstract":"<p>You may not update the system capability type DISPLAYS because it is always subscribed</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLAlertManagerError.html#/c:@E@SDLAlertManagerError@SDLAlertManagerPresentationError":{"name":"SDLAlertManagerPresentationError","abstract":"<p>There was an error presenting the alert</p>","parent_name":"SDLAlertManagerError"},"Enums/SDLAlertManagerError.html#/c:@E@SDLAlertManagerError@SDLAlertManagerInvalidDataError":{"name":"SDLAlertManagerInvalidDataError","abstract":"<p>The alert data is invalid</p>","parent_name":"SDLAlertManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorPendingPresentationDeleted":{"name":"SDLChoiceSetManagerErrorPendingPresentationDeleted","abstract":"<p>The choice set has been deleted before it was presented</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorDeletionFailed":{"name":"SDLChoiceSetManagerErrorDeletionFailed","abstract":"<p>The choice set failed to delete</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorUploadFailed":{"name":"SDLChoiceSetManagerErrorUploadFailed","abstract":"<p>The upload failed</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorFailedToCreateMenuItems":{"name":"SDLChoiceSetManagerErrorFailedToCreateMenuItems","abstract":"<p>The menu items failed to be created</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorInvalidState":{"name":"SDLChoiceSetManagerErrorInvalidState","abstract":"<p>Invalid state</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorRPCsFailed":{"name":"SDLMenuManagerErrorRPCsFailed","abstract":"<p>Sending menu-related RPCs returned an error from the remote system</p>","parent_name":"SDLMenuManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorPendingUpdateSuperseded":{"name":"SDLMenuManagerErrorPendingUpdateSuperseded","abstract":"<p>Sending menu-related RPCs returned an error from the remote system</p>","parent_name":"SDLMenuManagerError"},"Enums/SDLSubscribeButtonManagerError.html#/c:@E@SDLSubscribeButtonManagerError@SDLSubscribeButtonManagerErrorNotSubscribed":{"name":"SDLSubscribeButtonManagerErrorNotSubscribed","abstract":"<p>Attempting to unsubscribe to a subscribe button that has not yet been subscribed to yet.</p>","parent_name":"SDLSubscribeButtonManagerError"},"Enums/SDLSoftButtonManagerError.html#/c:@E@SDLSoftButtonManagerError@SDLSoftButtonManagerErrorPendingUpdateSuperseded":{"name":"SDLSoftButtonManagerErrorPendingUpdateSuperseded","abstract":"<p>A pending update was superseded by a newer requested update. The old update will not be sent</p>","parent_name":"SDLSoftButtonManagerError"},"Enums/SDLTextAndGraphicManagerError.html#/c:@E@SDLTextAndGraphicManagerError@SDLTextAndGraphicManagerErrorPendingUpdateSuperseded":{"name":"SDLTextAndGraphicManagerErrorPendingUpdateSuperseded","abstract":"<p>A pending update was superseded by a newer requested update. The old update will not be sent</p>","parent_name":"SDLTextAndGraphicManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorCannotOverwrite":{"name":"SDLFileManagerErrorCannotOverwrite","abstract":"<p>A file attempted to send, but a file with that name already exists on the remote head unit, and the file was not configured to overwrite.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorNoKnownFile":{"name":"SDLFileManagerErrorNoKnownFile","abstract":"<p>A file was attempted to be accessed but it does not exist.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorUnableToStart":{"name":"SDLFileManagerErrorUnableToStart","abstract":"<p>The file manager attempted to start but encountered an error.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorUnableToUpload":{"name":"SDLFileManagerErrorUnableToUpload","abstract":"<p>The file manager was unable to send this file.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorFileDoesNotExist":{"name":"SDLFileManagerErrorFileDoesNotExist","abstract":"<p>The file manager could not find the local file.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerUploadCanceled":{"name":"SDLFileManagerUploadCanceled","abstract":"<p>The file upload was canceled.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerMultipleFileUploadTasksFailed":{"name":"SDLFileManagerMultipleFileUploadTasksFailed","abstract":"<p>One or more of multiple files being uploaded or deleted failed.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerMultipleFileDeleteTasksFailed":{"name":"SDLFileManagerMultipleFileDeleteTasksFailed","abstract":"<p>One or more of multiple files being uploaded or deleted failed.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorFileDataMissing":{"name":"SDLFileManagerErrorFileDataMissing","abstract":"<p>The file data is nil or empty.</p>","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorStaticIcon":{"name":"SDLFileManagerErrorStaticIcon","abstract":"<p>The file is a static icon, which cannot be uploaded</p>","parent_name":"SDLFileManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRPCRequestFailed":{"name":"SDLManagerErrorRPCRequestFailed","abstract":"<p>An RPC request failed to send.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorNotConnected":{"name":"SDLManagerErrorNotConnected","abstract":"<p>Some action was attempted that requires a connection to the remote head unit.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorNotReady":{"name":"SDLManagerErrorNotReady","abstract":"<p>Some action was attempted before the ready state was reached.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorUnknownRemoteError":{"name":"SDLManagerErrorUnknownRemoteError","abstract":"<p>The remote system encountered an unknown error.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorManagersFailedToStart":{"name":"SDLManagerErrorManagersFailedToStart","abstract":"<p>One or more of the sub-managers failed to start.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRegistrationFailed":{"name":"SDLManagerErrorRegistrationFailed","abstract":"<p>Registering with the remote system failed.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRegistrationSuccessWithWarning":{"name":"SDLManagerErrorRegistrationSuccessWithWarning","abstract":"<p>Registering with the remote system was successful, but had a warning.</p>","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorCancelled":{"name":"SDLManagerErrorCancelled","abstract":"<p>Request operations were cancelled before they could be sent</p>","parent_name":"SDLManagerError"},"Enums/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorNotConnected":{"name":"SDLEncryptionLifecycleManagerErrorNotConnected","abstract":"<p>Some action was attempted that requires a connection to the remote head unit.</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorEncryptionOff":{"name":"SDLEncryptionLifecycleManagerErrorEncryptionOff","abstract":"<p>Received ACK with encryption bit set to false from the remote head unit</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorNAK":{"name":"SDLEncryptionLifecycleManagerErrorNAK","abstract":"<p>Received NAK from the remote head unit.</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorUnknown":{"name":"SDLEncryptionLifecycleManagerErrorUnknown","abstract":"<p>An unknown error occurred</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLChoiceSetLayout.html#/c:@E@SDLChoiceSetLayout@SDLChoiceSetLayoutList":{"name":"SDLChoiceSetLayoutList","abstract":"<p>Menu items will be displayed in a list</p>","parent_name":"SDLChoiceSetLayout"},"Enums/SDLChoiceSetLayout.html#/c:@E@SDLChoiceSetLayout@SDLChoiceSetLayoutTiles":{"name":"SDLChoiceSetLayoutTiles","abstract":"<p>Menu items will be displayed as a tiled list</p>","parent_name":"SDLChoiceSetLayout"},"Enums/SDLArtworkImageFormat.html#/c:@E@SDLArtworkImageFormat@SDLArtworkImageFormatPNG":{"name":"SDLArtworkImageFormatPNG","abstract":"<p>Image format: PNG</p>","parent_name":"SDLArtworkImageFormat"},"Enums/SDLArtworkImageFormat.html#/c:@E@SDLArtworkImageFormat@SDLArtworkImageFormatJPG":{"name":"SDLArtworkImageFormatJPG","abstract":"<p>Image format: JPG</p>","parent_name":"SDLArtworkImageFormat"},"Enums/SDLArtworkImageFormat.html":{"name":"SDLArtworkImageFormat","abstract":"<p>Image format of an artwork file</p>"},"Enums/SDLChoiceSetLayout.html":{"name":"SDLChoiceSetLayout","abstract":"<p>The layout to use when a choice set is displayed</p>"},"Enums/SDLEncryptionLifecycleManagerError.html":{"name":"SDLEncryptionLifecycleManagerError","abstract":"<p>Errors associated with the SDLManager class.</p>"},"Enums/SDLManagerError.html":{"name":"SDLManagerError","abstract":"<p>Errors associated with the SDLManager class.</p>"},"Enums/SDLFileManagerError.html":{"name":"SDLFileManagerError","abstract":"<p>Errors associated with the SDLFileManager class.</p>"},"Enums/SDLTextAndGraphicManagerError.html":{"name":"SDLTextAndGraphicManagerError","abstract":"<p>Errors associated with the ScreenManager class</p>"},"Enums/SDLSoftButtonManagerError.html":{"name":"SDLSoftButtonManagerError","abstract":"<p>Errors associated with the Soft Button Manager class</p>"},"Enums/SDLSubscribeButtonManagerError.html":{"name":"SDLSubscribeButtonManagerError","abstract":"<p>Errors associated with the Subscribe Button Manager class</p>"},"Enums/SDLMenuManagerError.html":{"name":"SDLMenuManagerError","abstract":"<p>Errors associated with the Menu Manager class</p>"},"Enums/SDLChoiceSetManagerError.html":{"name":"SDLChoiceSetManagerError","abstract":"<p>Errors associated with Choice Set Manager class</p>"},"Enums/SDLAlertManagerError.html":{"name":"SDLAlertManagerError","abstract":"<p>Errors associated with Alert Manager class</p>"},"Enums/SDLSystemCapabilityManagerError.html":{"name":"SDLSystemCapabilityManagerError","abstract":"<p>Errors associated with the system capability manager</p>"},"Enums/SDLTransportError.html":{"name":"SDLTransportError","abstract":"<p>Errors associated with transport.</p>"},"Enums/SDLRPCStoreError.html":{"name":"SDLRPCStoreError","abstract":"<p>Errors associated with store.</p>"},"Enums/SDLCacheFileManagerError.html":{"name":"SDLCacheFileManagerError","abstract":"<p>Errors related to the cache file manager</p>"},"Enums/SDLAudioStreamManagerError.html":{"name":"SDLAudioStreamManagerError","abstract":"<p>Errors related to the audio stream manager</p>"},"Enums/SDLSecondaryTransports.html":{"name":"SDLSecondaryTransports","abstract":"<p>List of secondary transports</p>"},"Enums/SDLLockScreenConfigurationDisplayMode.html":{"name":"SDLLockScreenConfigurationDisplayMode","abstract":"<p>Describes when the lock screen should be shown.</p>"},"Enums/SDLLogBytesDirection.html":{"name":"SDLLogBytesDirection","abstract":"<p>An enum describing log bytes direction</p>"},"Enums/SDLLogFlag.html":{"name":"SDLLogFlag","abstract":"<p>Flags used for SDLLogLevel to provide correct enum values. This is purely for internal use.</p>"},"Enums/SDLLogLevel.html":{"name":"SDLLogLevel","abstract":"<p>An enum describing a level of logging.</p>"},"Enums/SDLLogFormatType.html":{"name":"SDLLogFormatType","abstract":"<p>The output format of logs; how they will appear when printed out into a string.</p>"},"Enums/SDLDynamicMenuUpdatesMode.html":{"name":"SDLDynamicMenuUpdatesMode","abstract":"<p>Dynamic Menu Manager Mode</p>"},"Enums/MenuCellState.html":{"name":"MenuCellState","abstract":"<p>Menu cell state</p>"},"Enums/SDLPermissionGroupType.html":{"name":"SDLPermissionGroupType","abstract":"<p>A permission group type which will be used to tell the system what type of changes you want to be notified about for the group.</p>"},"Enums/SDLPermissionGroupStatus.html":{"name":"SDLPermissionGroupStatus","abstract":"<p>The status of the group of RPCs permissions.</p>"},"Enums/SDLPredefinedWindows.html":{"name":"SDLPredefinedWindows","abstract":"<p>Specifies which windows and IDs are predefined and pre-created on behalf of the app. The default window is always available and represents the app window on the main display. It&rsquo;s an equivalent to today&rsquo;s app window. For backward compatibility, this will ensure the app always has at least the default window on the main display. The app can choose to use this predefined enum element to specifically address app&rsquo;s main window or to duplicate window content. It is not possible to duplicate another window to the default window. The primary widget is a special widget, that can be associated with a service type, which is used by the HMI whenever a single widget needs to represent the whole app. The primary widget should be named as the app and can be pre-created by the HMI.</p>"},"Enums/SDLFrameType.html":{"name":"SDLFrameType","abstract":"<p>The data packet&rsquo;s header and payload combination.</p>"},"Enums/SDLServiceType.html":{"name":"SDLServiceType","abstract":"<p>The data packet&rsquo;s format and priority.</p>"},"Enums/SDLFrameInfo.html":{"name":"SDLFrameInfo","abstract":"<p>The data packet&rsquo;s available data.</p>"},"Enums/SDLRPCMessageType.html":{"name":"SDLRPCMessageType","abstract":"<p>The type of RPC message</p>"},"Enums/SDLCarWindowRenderingType.html":{"name":"SDLCarWindowRenderingType","abstract":"<p>The type of rendering that CarWindow will perform. Depending on your app, you may need to try different ones for best performance</p>"},"Enums/SDLStreamingEncryptionFlag.html":{"name":"SDLStreamingEncryptionFlag","abstract":"<p>A flag determining how video and audio streaming should be encrypted</p>"},"Enums/SDLTouchIdentifier.html":{"name":"SDLTouchIdentifier","abstract":"<p>Identifies finger touch</p>"},"Constants.html#/c:@SDLAmbientLightStatusNight":{"name":"SDLAmbientLightStatusNight","abstract":"<p>Represents a &ldquo;night&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight1":{"name":"SDLAmbientLightStatusTwilight1","abstract":"<p>Represents a &ldquo;twilight 1&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight2":{"name":"SDLAmbientLightStatusTwilight2","abstract":"<p>Represents a &ldquo;twilight 2&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight3":{"name":"SDLAmbientLightStatusTwilight3","abstract":"<p>Represents a &ldquo;twilight 3&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight4":{"name":"SDLAmbientLightStatusTwilight4","abstract":"<p>Represents a &ldquo;twilight 4&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusDay":{"name":"SDLAmbientLightStatusDay","abstract":"<p>Represents a &ldquo;day&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusUnknown":{"name":"SDLAmbientLightStatusUnknown","abstract":"<p>Represents an &ldquo;unknown&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusInvalid":{"name":"SDLAmbientLightStatusInvalid","abstract":"<p>Represents a &ldquo;invalid&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAppCapabilityTypeVideoStreaming":{"name":"SDLAppCapabilityTypeVideoStreaming","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLAppHMITypeDefault":{"name":"SDLAppHMITypeDefault","abstract":"<p>The App will have default rights.</p>"},"Constants.html#/c:@SDLAppHMITypeCommunication":{"name":"SDLAppHMITypeCommunication","abstract":"<p>Communication type of App</p>"},"Constants.html#/c:@SDLAppHMITypeMedia":{"name":"SDLAppHMITypeMedia","abstract":"<p>App dealing with Media</p>"},"Constants.html#/c:@SDLAppHMITypeMessaging":{"name":"SDLAppHMITypeMessaging","abstract":"<p>Messaging App</p>"},"Constants.html#/c:@SDLAppHMITypeNavigation":{"name":"SDLAppHMITypeNavigation","abstract":"<p>Navigation App</p>"},"Constants.html#/c:@SDLAppHMITypeInformation":{"name":"SDLAppHMITypeInformation","abstract":"<p>Information App</p>"},"Constants.html#/c:@SDLAppHMITypeSocial":{"name":"SDLAppHMITypeSocial","abstract":"<p>App dealing with social media</p>"},"Constants.html#/c:@SDLAppHMITypeProjection":{"name":"SDLAppHMITypeProjection","abstract":"<p>App dealing with Mobile Projection applications</p>"},"Constants.html#/c:@SDLAppHMITypeBackgroundProcess":{"name":"SDLAppHMITypeBackgroundProcess","abstract":"<p>App designed for use in the background</p>"},"Constants.html#/c:@SDLAppHMITypeTesting":{"name":"SDLAppHMITypeTesting","abstract":"<p>App only for Testing purposes</p>"},"Constants.html#/c:@SDLAppHMITypeSystem":{"name":"SDLAppHMITypeSystem","abstract":"<p>System App</p>"},"Constants.html#/c:@SDLAppHMITypeRemoteControl":{"name":"SDLAppHMITypeRemoteControl","abstract":"<p>Remote control</p>"},"Constants.html#/c:@SDLAppHMITypeWebView":{"name":"SDLAppHMITypeWebView","abstract":"<p>WebEngine Projection mode</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonIgnitionOff":{"name":"SDLAppInterfaceUnregisteredReasonIgnitionOff","abstract":"<p>Vehicle ignition turned off.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonBluetoothOff":{"name":"SDLAppInterfaceUnregisteredReasonBluetoothOff","abstract":"<p>Bluetooth was turned off, causing termination of a necessary Bluetooth connection.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUSBDisconnected":{"name":"SDLAppInterfaceUnregisteredReasonUSBDisconnected","abstract":"<p>USB was disconnected, causing termination of a necessary iAP connection.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel":{"name":"SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel","abstract":"<p>Application attempted SmartDeviceLink RPC request while HMILevel = NONE. App must have HMILevel other than NONE to issue RPC requests or get notifications or RPC responses.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonTooManyRequests":{"name":"SDLAppInterfaceUnregisteredReasonTooManyRequests","abstract":"<p>Either too many &ndash; or too many per unit of time &ndash; requests were made by the application.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonDriverDistractionViolation":{"name":"SDLAppInterfaceUnregisteredReasonDriverDistractionViolation","abstract":"<p>The application has issued requests which cause driver distraction rules to be violated.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonLanguageChange":{"name":"SDLAppInterfaceUnregisteredReasonLanguageChange","abstract":"<p>The user performed a language change on the SDL platform, causing the application to need to be reregistered for the new language.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonMasterReset":{"name":"SDLAppInterfaceUnregisteredReasonMasterReset","abstract":"<p>The user performed a MASTER RESET on the SDL platform, causing removal of a necessary Bluetooth pairing.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonFactoryDefaults":{"name":"SDLAppInterfaceUnregisteredReasonFactoryDefaults","abstract":"<p>The user restored settings to FACTORY DEFAULTS on the SDL platform.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonAppUnauthorized":{"name":"SDLAppInterfaceUnregisteredReasonAppUnauthorized","abstract":"<p>The app is not being authorized to be connected to SDL.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonProtocolViolation":{"name":"SDLAppInterfaceUnregisteredReasonProtocolViolation","abstract":"<p>The app could not register due to a protocol violation</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource":{"name":"SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource","abstract":"<p>The HMI resource is unsupported</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonResourceConstraint":{"name":"SDLAppInterfaceUnregisteredReasonResourceConstraint","abstract":"<p>The application is unregistered due to hardware resource constraints. The system will shortly close the application to free up hardware resources.</p>"},"Constants.html#/c:@SDLAppServiceTypeMedia":{"name":"SDLAppServiceTypeMedia","abstract":"<p>The app will have a service type of media.</p>"},"Constants.html#/c:@SDLAppServiceTypeWeather":{"name":"SDLAppServiceTypeWeather","abstract":"<p>The app will have a service type of weather.</p>"},"Constants.html#/c:@SDLAppServiceTypeNavigation":{"name":"SDLAppServiceTypeNavigation","abstract":"<p>The app will have a service type of navigation.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorPlayPause":{"name":"SDLAudioStreamingIndicatorPlayPause","abstract":"<p>Default playback indicator."},"Constants.html#/c:@SDLAudioStreamingIndicatorPlay":{"name":"SDLAudioStreamingIndicatorPlay","abstract":"<p>Indicates that a button press of the Play/Pause button starts the audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorPause":{"name":"SDLAudioStreamingIndicatorPause","abstract":"<p>Indicates that a button press of the Play/Pause button pauses the current audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorStop":{"name":"SDLAudioStreamingIndicatorStop","abstract":"<p>Indicates that a button press of the Play/Pause button stops the current audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingStateAudible":{"name":"SDLAudioStreamingStateAudible","abstract":"<p>Currently streaming audio, if any, is audible to user.</p>"},"Constants.html#/c:@SDLAudioStreamingStateAttenuated":{"name":"SDLAudioStreamingStateAttenuated","abstract":"<p>Some kind of audio mixing is taking place. Currently streaming audio, if any, is audible to the user at a lowered volume.</p>"},"Constants.html#/c:@SDLAudioStreamingStateNotAudible":{"name":"SDLAudioStreamingStateNotAudible","abstract":"<p>Currently streaming audio, if any, is not audible to user. made via VR session.</p>"},"Constants.html#/c:@SDLAudioTypePCM":{"name":"SDLAudioTypePCM","abstract":"<p>PCM raw audio</p>"},"Constants.html#/c:@SDLBitsPerSample8Bit":{"name":"SDLBitsPerSample8Bit","abstract":"<p>8 bits per sample</p>"},"Constants.html#/c:@SDLBitsPerSample16Bit":{"name":"SDLBitsPerSample16Bit","abstract":"<p>16 bits per sample</p>"},"Constants.html#/c:@SDLButtonEventModeButtonUp":{"name":"SDLButtonEventModeButtonUp","abstract":"<p>The button was released</p>"},"Constants.html#/c:@SDLButtonEventModeButtonDown":{"name":"SDLButtonEventModeButtonDown","abstract":"<p>The button was depressed</p>"},"Constants.html#/c:@SDLButtonNameOk":{"name":"SDLButtonNameOk","abstract":"<p>Represents the button usually labeled &ldquo;OK&rdquo;. A typical use of this button is for the user to press it to make a selection. Prior to SDL Core 5.0 (iOS Proxy v.6.1), Ok was used for both &ldquo;OK&rdquo; buttons <em>AND</em> PlayPause. In 5.0, PlayPause was introduced to reduce confusion, and you should use the one you intend for your use case (usually PlayPause). Until the next proxy breaking change, however, subscribing to this button name will continue to subscribe you to PlayPause so that your code does not break. That means that if you subscribe to both Ok and PlayPause, you will receive duplicate notifications.</p>"},"Constants.html#/c:@SDLButtonNamePlayPause":{"name":"SDLButtonNamePlayPause","abstract":"<p>Represents the play/pause button for media apps. Replaces &ldquo;OK&rdquo; on sub-5.0 head units, compliments it on 5.0 head units and later.</p>"},"Constants.html#/c:@SDLButtonNameSeekLeft":{"name":"SDLButtonNameSeekLeft","abstract":"<p>Represents the seek-left button. A typical use of this button is for the user to scroll to the left through menu choices one menu item per press.</p>"},"Constants.html#/c:@SDLButtonNameSeekRight":{"name":"SDLButtonNameSeekRight","abstract":"<p>Represents the seek-right button. A typical use of this button is for the user to scroll to the right through menu choices one menu item per press.</p>"},"Constants.html#/c:@SDLButtonNameTuneUp":{"name":"SDLButtonNameTuneUp","abstract":"<p>Represents a turn of the tuner knob in the clockwise direction one tick.</p>"},"Constants.html#/c:@SDLButtonNameTuneDown":{"name":"SDLButtonNameTuneDown","abstract":"<p>Represents a turn of the tuner knob in the counter-clockwise direction one tick.</p>"},"Constants.html#/c:@SDLButtonNamePreset0":{"name":"SDLButtonNamePreset0","abstract":"<p>Represents the preset 0 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset1":{"name":"SDLButtonNamePreset1","abstract":"<p>Represents the preset 1 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset2":{"name":"SDLButtonNamePreset2","abstract":"<p>Represents the preset 2 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset3":{"name":"SDLButtonNamePreset3","abstract":"<p>Represents the preset 3 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset4":{"name":"SDLButtonNamePreset4","abstract":"<p>Represents the preset 4 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset5":{"name":"SDLButtonNamePreset5","abstract":"<p>Represents the preset 5 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset6":{"name":"SDLButtonNamePreset6","abstract":"<p>Represents the preset 6 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset7":{"name":"SDLButtonNamePreset7","abstract":"<p>Represents the preset 7 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset8":{"name":"SDLButtonNamePreset8","abstract":"<p>Represents the preset 8 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset9":{"name":"SDLButtonNamePreset9","abstract":"<p>Represents the preset 9 button.</p>"},"Constants.html#/c:@SDLButtonNameCustomButton":{"name":"SDLButtonNameCustomButton","abstract":"<p>Represents the Custom button.</p>"},"Constants.html#/c:@SDLButtonNameSearch":{"name":"SDLButtonNameSearch","abstract":"<p>Represents the SEARCH button.</p>"},"Constants.html#/c:@SDLButtonNameACMax":{"name":"SDLButtonNameACMax","abstract":"<p>Represents AC max button *</p>"},"Constants.html#/c:@SDLButtonNameAC":{"name":"SDLButtonNameAC","abstract":"<p>Represents AC button *</p>"},"Constants.html#/c:@SDLButtonNameRecirculate":{"name":"SDLButtonNameRecirculate","abstract":"<p>Represents a Recirculate button</p>"},"Constants.html#/c:@SDLButtonNameFanUp":{"name":"SDLButtonNameFanUp","abstract":"<p>Represents a Fan up button</p>"},"Constants.html#/c:@SDLButtonNameFanDown":{"name":"SDLButtonNameFanDown","abstract":"<p>Represents a fan down button</p>"},"Constants.html#/c:@SDLButtonNameTempUp":{"name":"SDLButtonNameTempUp","abstract":"<p>Represents a temperature up button</p>"},"Constants.html#/c:@SDLButtonNameTempDown":{"name":"SDLButtonNameTempDown","abstract":"<p>Represents a temperature down button</p>"},"Constants.html#/c:@SDLButtonNameDefrostMax":{"name":"SDLButtonNameDefrostMax","abstract":"<p>Represents a Defrost max button.</p>"},"Constants.html#/c:@SDLButtonNameDefrost":{"name":"SDLButtonNameDefrost","abstract":"<p>Represents a Defrost button.</p>"},"Constants.html#/c:@SDLButtonNameDefrostRear":{"name":"SDLButtonNameDefrostRear","abstract":"<p>Represents a Defrost rear button.</p>"},"Constants.html#/c:@SDLButtonNameUpperVent":{"name":"SDLButtonNameUpperVent","abstract":"<p>Represents a Upper Vent button.</p>"},"Constants.html#/c:@SDLButtonNameLowerVent":{"name":"SDLButtonNameLowerVent","abstract":"<p>Represents a Lower vent button.</p>"},"Constants.html#/c:@SDLButtonNameVolumeUp":{"name":"SDLButtonNameVolumeUp","abstract":"<p>Represents a volume up button.</p>"},"Constants.html#/c:@SDLButtonNameVolumeDown":{"name":"SDLButtonNameVolumeDown","abstract":"<p>Represents a volume down button.</p>"},"Constants.html#/c:@SDLButtonNameEject":{"name":"SDLButtonNameEject","abstract":"<p>Represents a Eject Button.</p>"},"Constants.html#/c:@SDLButtonNameSource":{"name":"SDLButtonNameSource","abstract":"<p>Represents a Source button.</p>"},"Constants.html#/c:@SDLButtonNameShuffle":{"name":"SDLButtonNameShuffle","abstract":"<p>Represents a SHUFFLE button.</p>"},"Constants.html#/c:@SDLButtonNameRepeat":{"name":"SDLButtonNameRepeat","abstract":"<p>Represents a Repeat button.</p>"},"Constants.html#/c:@SDLButtonNameNavCenterLocation":{"name":"SDLButtonNameNavCenterLocation","abstract":"<p>Represents a Navigate to center button.</p>"},"Constants.html#/c:@SDLButtonNameNavZoomIn":{"name":"SDLButtonNameNavZoomIn","abstract":"<p>Represents a Zoom in button.</p>"},"Constants.html#/c:@SDLButtonNameNavZoomOut":{"name":"SDLButtonNameNavZoomOut","abstract":"<p>Represents a Zoom out button.</p>"},"Constants.html#/c:@SDLButtonNameNavPanUp":{"name":"SDLButtonNameNavPanUp","abstract":"<p>Represents a Pan up button</p>"},"Constants.html#/c:@SDLButtonNameNavPanUpRight":{"name":"SDLButtonNameNavPanUpRight","abstract":"<p>Represents a Pan up/right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanRight":{"name":"SDLButtonNameNavPanRight","abstract":"<p>Represents a Pan right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDownRight":{"name":"SDLButtonNameNavPanDownRight","abstract":"<p>Represents a Pan down/right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDown":{"name":"SDLButtonNameNavPanDown","abstract":"<p>Represents a Pan down button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDownLeft":{"name":"SDLButtonNameNavPanDownLeft","abstract":"<p>Represents a Pan down left button</p>"},"Constants.html#/c:@SDLButtonNameNavPanLeft":{"name":"SDLButtonNameNavPanLeft","abstract":"<p>Represents a Pan left button</p>"},"Constants.html#/c:@SDLButtonNameNavPanUpLeft":{"name":"SDLButtonNameNavPanUpLeft","abstract":"<p>Represents a Pan up left button</p>"},"Constants.html#/c:@SDLButtonNameNavTiltToggle":{"name":"SDLButtonNameNavTiltToggle","abstract":"<p>Represents a Tilt button. If supported, this toggles between a top-down view and an angled/3D view. If your app supports different, but substantially similar options, then you may implement those. If you don&rsquo;t implement these or similar options, do not subscribe to this button.</p>"},"Constants.html#/c:@SDLButtonNameNavRotateClockwise":{"name":"SDLButtonNameNavRotateClockwise","abstract":"<p>Represents a Rotate clockwise button</p>"},"Constants.html#/c:@SDLButtonNameNavRotateCounterClockwise":{"name":"SDLButtonNameNavRotateCounterClockwise","abstract":"<p>Represents a Rotate counterclockwise button</p>"},"Constants.html#/c:@SDLButtonNameNavHeadingToggle":{"name":"SDLButtonNameNavHeadingToggle","abstract":"<p>Represents a Heading toggle button. If supported, this toggles between locking the orientation to north or to the vehicle&rsquo;s heading. If your app supports different, but substantially similar options, then you may implement those. If you don&rsquo;t implement these or similar options, do not subscribe to this button.</p>"},"Constants.html#/c:@SDLButtonPressModeLong":{"name":"SDLButtonPressModeLong","abstract":"<p>A button was released, after it was pressed for a long time. Actual timing is defined by the head unit and may vary.</p>"},"Constants.html#/c:@SDLButtonPressModeShort":{"name":"SDLButtonPressModeShort","abstract":"<p>A button was released, after it was pressed for a short time. Actual timing is defined by the head unit and may vary.</p>"},"Constants.html#/c:@SDLCapacityUnitKilograms":{"name":"SDLCapacityUnitKilograms","abstract":"<p>A capacity in kilogram units</p>"},"Constants.html#/c:@SDLCapacityUnitKilowatthours":{"name":"SDLCapacityUnitKilowatthours","abstract":"<p>A capacity in Kilowatt Hour units</p>"},"Constants.html#/c:@SDLCapacityUnitLiters":{"name":"SDLCapacityUnitLiters","abstract":"<p>A capacity in Liter units</p>"},"Constants.html#/c:@SDLCarModeStatusNormal":{"name":"SDLCarModeStatusNormal","abstract":"<p>Provides carmode NORMAL to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusFactory":{"name":"SDLCarModeStatusFactory","abstract":"<p>Provides carmode FACTORY to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusTransport":{"name":"SDLCarModeStatusTransport","abstract":"<p>Provides carmode TRANSPORT to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusCrash":{"name":"SDLCarModeStatusCrash","abstract":"<p>Provides carmode CRASH to each module.</p>"},"Constants.html#/c:@SDLCharacterSetType2":{"name":"SDLCharacterSetType2","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetType5":{"name":"SDLCharacterSetType5","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetCID1":{"name":"SDLCharacterSetCID1","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetCID2":{"name":"SDLCharacterSetCID2","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetAscii":{"name":"SDLCharacterSetAscii","abstract":"<p>ASCII as defined in <a href=\"https://en.wikipedia.org/wiki/ASCII\">https://en.wikipedia.org/wiki/ASCII</a> as defined in codes 0-127. Non-printable characters such as tabs and back spaces are ignored.</p>"},"Constants.html#/c:@SDLCharacterSetIso88591":{"name":"SDLCharacterSetIso88591","abstract":"<p>Latin-1, as defined in <a href=\"https://en.wikipedia.org/wiki/ISO/IEC_8859-1\">https://en.wikipedia.org/wiki/ISO/IEC_8859-1</a></p>"},"Constants.html#/c:@SDLCharacterSetUtf8":{"name":"SDLCharacterSetUtf8","abstract":"<p>The UTF-8 character set that uses variable bytes per code point. See <a href=\"https://en.wikipedia.org/wiki/UTF-8\">https://en.wikipedia.org/wiki/UTF-8</a> for more details. This is the preferred character set.</p>"},"Constants.html#/c:@SDLCompassDirectionNorth":{"name":"SDLCompassDirectionNorth","abstract":"<p>Direction North</p>"},"Constants.html#/c:@SDLCompassDirectionNorthwest":{"name":"SDLCompassDirectionNorthwest","abstract":"<p>Direction Northwest</p>"},"Constants.html#/c:@SDLCompassDirectionWest":{"name":"SDLCompassDirectionWest","abstract":"<p>Direction West</p>"},"Constants.html#/c:@SDLCompassDirectionSouthwest":{"name":"SDLCompassDirectionSouthwest","abstract":"<p>Direction Southwest</p>"},"Constants.html#/c:@SDLCompassDirectionSouth":{"name":"SDLCompassDirectionSouth","abstract":"<p>Direction South</p>"},"Constants.html#/c:@SDLCompassDirectionSoutheast":{"name":"SDLCompassDirectionSoutheast","abstract":"<p>Direction Southeast</p>"},"Constants.html#/c:@SDLCompassDirectionEast":{"name":"SDLCompassDirectionEast","abstract":"<p>Direction East</p>"},"Constants.html#/c:@SDLCompassDirectionNortheast":{"name":"SDLCompassDirectionNortheast","abstract":"<p>Direction Northeast</p>"},"Constants.html#/c:@SDLComponentVolumeStatusUnknown":{"name":"SDLComponentVolumeStatusUnknown","abstract":"<p>Unknown SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusNormal":{"name":"SDLComponentVolumeStatusNormal","abstract":"<p>Normal SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusLow":{"name":"SDLComponentVolumeStatusLow","abstract":"<p>Low SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusFault":{"name":"SDLComponentVolumeStatusFault","abstract":"<p>Fault SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusAlert":{"name":"SDLComponentVolumeStatusAlert","abstract":"<p>Alert SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusNotSupported":{"name":"SDLComponentVolumeStatusNotSupported","abstract":"<p>Not supported SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLDefrostZoneFront":{"name":"SDLDefrostZoneFront","abstract":"<p>A SDLDefrostZone with the value of <em>FRONT</em></p>"},"Constants.html#/c:@SDLDefrostZoneRear":{"name":"SDLDefrostZoneRear","abstract":"<p>A SDLDefrostZone with the value of <em>REAR</em></p>"},"Constants.html#/c:@SDLDefrostZoneAll":{"name":"SDLDefrostZoneAll","abstract":"<p>A SDLDefrostZone with the value of <em>All</em></p>"},"Constants.html#/c:@SDLDefrostZoneNone":{"name":"SDLDefrostZoneNone","abstract":"<p>A SDLDefrostZone with the value of <em>None</em></p>"},"Constants.html#/c:@SDLDeliveryModePrompt":{"name":"SDLDeliveryModePrompt","abstract":"<p>User is prompted on HMI</p>"},"Constants.html#/c:@SDLDeliveryModeDestination":{"name":"SDLDeliveryModeDestination","abstract":"<p>Set the location as destination without prompting the user</p>"},"Constants.html#/c:@SDLDeliveryModeQueue":{"name":"SDLDeliveryModeQueue","abstract":"<p>Adds the current location to navigation queue</p>"},"Constants.html#/c:@SDLDeviceLevelStatusZeroBars":{"name":"SDLDeviceLevelStatusZeroBars","abstract":"<p>Device battery level is zero bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusOneBar":{"name":"SDLDeviceLevelStatusOneBar","abstract":"<p>Device battery level is one bar</p>"},"Constants.html#/c:@SDLDeviceLevelStatusTwoBars":{"name":"SDLDeviceLevelStatusTwoBars","abstract":"<p>Device battery level is two bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusThreeBars":{"name":"SDLDeviceLevelStatusThreeBars","abstract":"<p>Device battery level is three bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusFourBars":{"name":"SDLDeviceLevelStatusFourBars","abstract":"<p>Device battery level is four bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusNotProvided":{"name":"SDLDeviceLevelStatusNotProvided","abstract":"<p>Device battery level is unknown</p>"},"Constants.html#/c:@SDLDimensionNoFix":{"name":"SDLDimensionNoFix","abstract":"<p>No GPS at all</p>"},"Constants.html#/c:@SDLDimension2D":{"name":"SDLDimension2D","abstract":"<p>Longitude and latitude of the GPS</p>"},"Constants.html#/c:@SDLDimension3D":{"name":"SDLDimension3D","abstract":"<p>Longitude and latitude and altitude of the GPS</p>"},"Constants.html#/c:@SDLDirectionLeft":{"name":"SDLDirectionLeft","abstract":"<p>Direction left</p>"},"Constants.html#/c:@SDLDirectionRight":{"name":"SDLDirectionRight","abstract":"<p>Direction right</p>"},"Constants.html#/c:@SDLDisplayModeDay":{"name":"SDLDisplayModeDay","abstract":"<p>@abstract Display Mode : DAY</p>"},"Constants.html#/c:@SDLDisplayModeNight":{"name":"SDLDisplayModeNight","abstract":"<p>@abstract Display Mode : NIGHT.</p>"},"Constants.html#/c:@SDLDisplayModeAuto":{"name":"SDLDisplayModeAuto","abstract":"<p>@abstract Display Mode : AUTO.</p>"},"Constants.html#/c:@SDLDisplayTypeCID":{"name":"SDLDisplayTypeCID","abstract":"<p>This display type provides a 2-line x 20 character &ldquo;dot matrix&rdquo; display.</p>"},"Constants.html#/c:@SDLDisplayTypeType2":{"name":"SDLDisplayTypeType2","abstract":"<p>Display type 2</p>"},"Constants.html#/c:@SDLDisplayTypeType5":{"name":"SDLDisplayTypeType5","abstract":"<p>Display type 5</p>"},"Constants.html#/c:@SDLDisplayTypeNGN":{"name":"SDLDisplayTypeNGN","abstract":"<p>This display type provides an 8 inch touchscreen display.</p>"},"Constants.html#/c:@SDLDisplayTypeGen28DMA":{"name":"SDLDisplayTypeGen28DMA","abstract":"<p>Display type Gen 28 DMA</p>"},"Constants.html#/c:@SDLDisplayTypeGen26DMA":{"name":"SDLDisplayTypeGen26DMA","abstract":"<p>Display type Gen 26 DMA</p>"},"Constants.html#/c:@SDLDisplayTypeMFD3":{"name":"SDLDisplayTypeMFD3","abstract":"<p>Display type MFD3</p>"},"Constants.html#/c:@SDLDisplayTypeMFD4":{"name":"SDLDisplayTypeMFD4","abstract":"<p>Display type MFD4</p>"},"Constants.html#/c:@SDLDisplayTypeMFD5":{"name":"SDLDisplayTypeMFD5","abstract":"<p>Display type MFD5</p>"},"Constants.html#/c:@SDLDisplayTypeGen38Inch":{"name":"SDLDisplayTypeGen38Inch","abstract":"<p>Display type Gen 3 8-inch</p>"},"Constants.html#/c:@SDLDisplayTypeGeneric":{"name":"SDLDisplayTypeGeneric","abstract":"<p>Display type Generic</p>"},"Constants.html#/c:@SDLDistanceUnitMiles":{"name":"SDLDistanceUnitMiles","abstract":"<p>@abstract SDLDistanceUnit: <em>MILES</em></p>"},"Constants.html#/c:@SDLDistanceUnitKilometers":{"name":"SDLDistanceUnitKilometers","abstract":"<p>@abstract SDLDistanceUnit: <em>KILOMETERS</em></p>"},"Constants.html#/c:@SDLDoorStatusTypeClosed":{"name":"SDLDoorStatusTypeClosed","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLDoorStatusTypeLocked":{"name":"SDLDoorStatusTypeLocked","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLDoorStatusTypeAjar":{"name":"SDLDoorStatusTypeAjar","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLDoorStatusTypeRemoved":{"name":"SDLDoorStatusTypeRemoved","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLDriverDistractionStateOn":{"name":"SDLDriverDistractionStateOn","abstract":"<p>Driver distraction rules are in effect.</p>"},"Constants.html#/c:@SDLDriverDistractionStateOff":{"name":"SDLDriverDistractionStateOff","abstract":"<p>Driver distraction rules are NOT in effect.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusNormal":{"name":"SDLECallConfirmationStatusNormal","abstract":"<p>No E-Call signal triggered.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusInProgress":{"name":"SDLECallConfirmationStatusInProgress","abstract":"<p>An E-Call is being in progress.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusCancelled":{"name":"SDLECallConfirmationStatusCancelled","abstract":"<p>An E-Call was cancelled by the user.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusCompleted":{"name":"SDLECallConfirmationStatusCompleted","abstract":"<p>The E-Call sequence is completed.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusUnsuccessful":{"name":"SDLECallConfirmationStatusUnsuccessful","abstract":"<p>An E-Call could not be connected.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusConfiguredOff":{"name":"SDLECallConfirmationStatusConfiguredOff","abstract":"<p>E-Call is not configured on this vehicle.</p>"},"Constants.html#/c:@SDLECallConfirmationStatusCompleteDTMFTimeout":{"name":"SDLECallConfirmationStatusCompleteDTMFTimeout","abstract":"<p>E-Call is considered to be complete without Emergency Operator contact.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusClosed":{"name":"SDLElectronicParkBrakeStatusClosed","abstract":"<p>Parking brake actuators have been fully applied.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusTransition":{"name":"SDLElectronicParkBrakeStatusTransition","abstract":"<p>Parking brake actuators are transitioning to either Apply/Closed or Release/Open state.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusOpen":{"name":"SDLElectronicParkBrakeStatusOpen","abstract":"<p>Parking brake actuators are released.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusDriveActive":{"name":"SDLElectronicParkBrakeStatusDriveActive","abstract":"<p>When driver pulls the Electronic Parking Brake switch while driving &ldquo;at speed&rdquo;.</p>"},"Constants.html#/c:@SDLElectronicParkBrakeStatusFault":{"name":"SDLElectronicParkBrakeStatusFault","abstract":"<p>When system has a fault or is under maintenance.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeNoEvent":{"name":"SDLEmergencyEventTypeNoEvent","abstract":"<p>No emergency event has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeFrontal":{"name":"SDLEmergencyEventTypeFrontal","abstract":"<p>Frontal collision has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeSide":{"name":"SDLEmergencyEventTypeSide","abstract":"<p>Side collision has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeRear":{"name":"SDLEmergencyEventTypeRear","abstract":"<p>Rear collision has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeRollover":{"name":"SDLEmergencyEventTypeRollover","abstract":"<p>A rollover event has happened.</p>"},"Constants.html#/c:@SDLEmergencyEventTypeNotSupported":{"name":"SDLEmergencyEventTypeNotSupported","abstract":"<p>The signal is not supported</p>"},"Constants.html#/c:@SDLEmergencyEventTypeFault":{"name":"SDLEmergencyEventTypeFault","abstract":"<p>Emergency status cannot be determined</p>"},"Constants.html#/c:@SDLErrorDomainAudioStreamManager":{"name":"SDLErrorDomainAudioStreamManager","abstract":"<p>An error in the SDLAudioStreamManager</p>"},"Constants.html#/c:@SDLErrorDomainCacheFileManager":{"name":"SDLErrorDomainCacheFileManager","abstract":"<p>An error in the SDLCacheFileManager private class</p>"},"Constants.html#/c:@SDLErrorDomainChoiceSetManager":{"name":"SDLErrorDomainChoiceSetManager","abstract":"<p>An error in the SDLChoiceSetManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainAlertManager":{"name":"SDLErrorDomainAlertManager","abstract":"<p>An error in the SDLAlertManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainEncryptionLifecycleManager":{"name":"SDLErrorDomainEncryptionLifecycleManager","abstract":"<p>An error in the SDLEncryptionLifecycleManager private class</p>"},"Constants.html#/c:@SDLErrorDomainFileManager":{"name":"SDLErrorDomainFileManager","abstract":"<p>An error in the SDLFileManager</p>"},"Constants.html#/c:@SDLErrorDomainLifecycleManager":{"name":"SDLErrorDomainLifecycleManager","abstract":"<p>An error in the SDLLifecycleManager private class</p>"},"Constants.html#/c:@SDLErrorDomainMenuManager":{"name":"SDLErrorDomainMenuManager","abstract":"<p>An error in the SDLMenuManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainRPCStore":{"name":"SDLErrorDomainRPCStore","abstract":"<p>An error in an SDL RPC class</p>"},"Constants.html#/c:@SDLErrorDomainSoftButtonManager":{"name":"SDLErrorDomainSoftButtonManager","abstract":"<p>An error in the SDLSoftButtonManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainSubscribeButtonManager":{"name":"SDLErrorDomainSubscribeButtonManager","abstract":"<p>An error in the SDLSubscribeButtonManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainSystemCapabilityManager":{"name":"SDLErrorDomainSystemCapabilityManager","abstract":"<p>An error in the SDLSystemCapabilityManager</p>"},"Constants.html#/c:@SDLErrorDomainTextAndGraphicManager":{"name":"SDLErrorDomainTextAndGraphicManager","abstract":"<p>An error in the SDLTextAndGraphicManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainTransport":{"name":"SDLErrorDomainTransport","abstract":"<p>An error in a SDL transport private class</p>"},"Constants.html#/c:@SDLFileTypeBMP":{"name":"SDLFileTypeBMP","abstract":"<p>file type: Bitmap (BMP)</p>"},"Constants.html#/c:@SDLFileTypeJPEG":{"name":"SDLFileTypeJPEG","abstract":"<p>file type: JPEG</p>"},"Constants.html#/c:@SDLFileTypePNG":{"name":"SDLFileTypePNG","abstract":"<p>file type: PNG</p>"},"Constants.html#/c:@SDLFileTypeWAV":{"name":"SDLFileTypeWAV","abstract":"<p>file type: WAVE (WAV)</p>"},"Constants.html#/c:@SDLFileTypeMP3":{"name":"SDLFileTypeMP3","abstract":"<p>file type: MP3</p>"},"Constants.html#/c:@SDLFileTypeAAC":{"name":"SDLFileTypeAAC","abstract":"<p>file type: AAC</p>"},"Constants.html#/c:@SDLFileTypeBinary":{"name":"SDLFileTypeBinary","abstract":"<p>file type: BINARY</p>"},"Constants.html#/c:@SDLFileTypeJSON":{"name":"SDLFileTypeJSON","abstract":"<p>file type: JSON</p>"},"Constants.html#/c:@SDLFuelCutoffStatusTerminateFuel":{"name":"SDLFuelCutoffStatusTerminateFuel","abstract":"<p>Fuel is cut off</p>"},"Constants.html#/c:@SDLFuelCutoffStatusNormalOperation":{"name":"SDLFuelCutoffStatusNormalOperation","abstract":"<p>Fuel is not cut off</p>"},"Constants.html#/c:@SDLFuelCutoffStatusFault":{"name":"SDLFuelCutoffStatusFault","abstract":"<p>Status of the fuel pump cannot be determined</p>"},"Constants.html#/c:@SDLFuelTypeGasoline":{"name":"SDLFuelTypeGasoline","abstract":"<p>Fuel type: Gasoline</p>"},"Constants.html#/c:@SDLFuelTypeDiesel":{"name":"SDLFuelTypeDiesel","abstract":"<p>Fuel type: Diesel</p>"},"Constants.html#/c:@SDLFuelTypeCNG":{"name":"SDLFuelTypeCNG","abstract":"<p>Fuel type: CNG</p>"},"Constants.html#/c:@SDLFuelTypeLPG":{"name":"SDLFuelTypeLPG","abstract":"<p>Fuel type: LPG</p>"},"Constants.html#/c:@SDLFuelTypeHydrogen":{"name":"SDLFuelTypeHydrogen","abstract":"<p>Fuel type: Hydrogen</p>"},"Constants.html#/c:@SDLFuelTypeBattery":{"name":"SDLFuelTypeBattery","abstract":"<p>Fuel type: Battery</p>"},"Constants.html#/c:@SDLGlobalPropertyHelpPrompt":{"name":"SDLGlobalPropertyHelpPrompt","abstract":"<p>The help prompt to be spoken if the user needs assistance during a user-initiated interaction.</p>"},"Constants.html#/c:@SDLGlobalPropertyTimeoutPrompt":{"name":"SDLGlobalPropertyTimeoutPrompt","abstract":"<p>The prompt to be spoken if the user-initiated interaction times out waiting for the user&rsquo;s verbal input.</p>"},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpTitle":{"name":"SDLGlobalPropertyVoiceRecognitionHelpTitle","abstract":"<p>The title of the menu displayed when the user requests help via voice recognition.</p>"},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpItems":{"name":"SDLGlobalPropertyVoiceRecognitionHelpItems","abstract":"<p>Items of the menu displayed when the user requests help via voice recognition.</p>"},"Constants.html#/c:@SDLGlobalPropertyMenuName":{"name":"SDLGlobalPropertyMenuName","abstract":"<p>The name of the menu button displayed in templates</p>"},"Constants.html#/c:@SDLGlobalPropertyMenuIcon":{"name":"SDLGlobalPropertyMenuIcon","abstract":"<p>An icon on the menu button displayed in templates</p>"},"Constants.html#/c:@SDLGlobalPropertyKeyboard":{"name":"SDLGlobalPropertyKeyboard","abstract":"<p>Property related to the keyboard</p>"},"Constants.html#/c:@SDLGlobalPropertyUserLocation":{"name":"SDLGlobalPropertyUserLocation","abstract":"<p>Location of the user&rsquo;s seat of setGlobalProperties</p>"},"Constants.html#/c:@SDLHMILevelFull":{"name":"SDLHMILevelFull","abstract":"<p>The application has full use of the SDL HMI. The app may output via TTS, display, or streaming audio and may gather input via VR, Menu, and button presses</p>"},"Constants.html#/c:@SDLHMILevelLimited":{"name":"SDLHMILevelLimited","abstract":"<p>This HMI Level is only defined for a media application using an HMI with an 8 inch touchscreen (Nav) system. The application&rsquo;s Show text is displayed and it receives button presses from media-oriented buttons (SEEKRIGHT, SEEKLEFT, TUNEUP, TUNEDOWN, PRESET_0-9)</p>"},"Constants.html#/c:@SDLHMILevelBackground":{"name":"SDLHMILevelBackground","abstract":"<p>App cannot interact with user via TTS, VR, Display or Button Presses. App can perform the following operations:</p>"},"Constants.html#/c:@SDLHMILevelNone":{"name":"SDLHMILevelNone","abstract":"<p>Application has been discovered by SDL, but it cannot send any requests or receive any notifications</p>"},"Constants.html#/c:@SDLHMIZoneCapabilitiesFront":{"name":"SDLHMIZoneCapabilitiesFront","abstract":"<p>Indicates HMI available for front seat passengers.</p>"},"Constants.html#/c:@SDLHMIZoneCapabilitiesBack":{"name":"SDLHMIZoneCapabilitiesBack","abstract":"<p>Indicates HMI available for rear seat passengers.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceMobile":{"name":"SDLHybridAppPreferenceMobile","abstract":"<p>App preference of mobile.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceCloud":{"name":"SDLHybridAppPreferenceCloud","abstract":"<p>App preference of cloud.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceBoth":{"name":"SDLHybridAppPreferenceBoth","abstract":"<p>App preference of both. Allows both the mobile and the cloud versions of the app to attempt to connect at the same time, however the first app that is registered is the one that is allowed to stay registered.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusNotStable":{"name":"SDLIgnitionStableStatusNotStable","abstract":"<p>The current ignition switch status is considered not to be stable.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusStable":{"name":"SDLIgnitionStableStatusStable","abstract":"<p>The current ignition switch status is considered to be stable.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusMissingFromTransmitter":{"name":"SDLIgnitionStableStatusMissingFromTransmitter","abstract":"<p>The current ignition switch status is considered to be missing from the transmitter</p>"},"Constants.html#/c:@SDLIgnitionStatusUnknown":{"name":"SDLIgnitionStatusUnknown","abstract":"<p>Ignition status currently unknown</p>"},"Constants.html#/c:@SDLIgnitionStatusOff":{"name":"SDLIgnitionStatusOff","abstract":"<p>Ignition is off</p>"},"Constants.html#/c:@SDLIgnitionStatusAccessory":{"name":"SDLIgnitionStatusAccessory","abstract":"<p>Ignition is in mode accessory</p>"},"Constants.html#/c:@SDLIgnitionStatusRun":{"name":"SDLIgnitionStatusRun","abstract":"<p>Ignition is in mode run</p>"},"Constants.html#/c:@SDLIgnitionStatusStart":{"name":"SDLIgnitionStatusStart","abstract":"<p>Ignition is in mode start</p>"},"Constants.html#/c:@SDLIgnitionStatusInvalid":{"name":"SDLIgnitionStatusInvalid","abstract":"<p>Signal is invalid</p>"},"Constants.html#/c:@SDLImageFieldNameAlertIcon":{"name":"SDLImageFieldNameAlertIcon","abstract":"<p>The image field for Alert</p>"},"Constants.html#/c:@SDLImageFieldNameSoftButtonImage":{"name":"SDLImageFieldNameSoftButtonImage","abstract":"<p>The image field for SoftButton</p>"},"Constants.html#/c:@SDLImageFieldNameChoiceImage":{"name":"SDLImageFieldNameChoiceImage","abstract":"<p>The first image field for Choice.</p>"},"Constants.html#/c:@SDLImageFieldNameChoiceSecondaryImage":{"name":"SDLImageFieldNameChoiceSecondaryImage","abstract":"<p>The scondary image field for Choice.</p>"},"Constants.html#/c:@SDLImageFieldNameVoiceRecognitionHelpItem":{"name":"SDLImageFieldNameVoiceRecognitionHelpItem","abstract":"<p>The image field for vrHelpItem.</p>"},"Constants.html#/c:@SDLImageFieldNameTurnIcon":{"name":"SDLImageFieldNameTurnIcon","abstract":"<p>The image field for Turn.</p>"},"Constants.html#/c:@SDLImageFieldNameMenuIcon":{"name":"SDLImageFieldNameMenuIcon","abstract":"<p>The image field for the menu icon in SetGlobalProperties.</p>"},"Constants.html#/c:@SDLImageFieldNameCommandIcon":{"name":"SDLImageFieldNameCommandIcon","abstract":"<p>The image field for AddCommand."},"Constants.html#/c:@SDLImageFieldNameAppIcon":{"name":"SDLImageFieldNameAppIcon","abstract":"<p>The image field for the app icon (set by setAppIcon).</p>"},"Constants.html#/c:@SDLImageFieldNameGraphic":{"name":"SDLImageFieldNameGraphic","abstract":"<p>The primary image field for Show."},"Constants.html#/c:@SDLImageFieldNameSecondaryGraphic":{"name":"SDLImageFieldNameSecondaryGraphic","abstract":"<p>The secondary image field for Show."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTIcon":{"name":"SDLImageFieldNameShowConstantTBTIcon","abstract":"<p>The primary image field for ShowConstant TBT."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTNextTurnIcon":{"name":"SDLImageFieldNameShowConstantTBTNextTurnIcon","abstract":"<p>The secondary image field for ShowConstant TBT.</p>"},"Constants.html#/c:@SDLImageFieldNameLocationImage":{"name":"SDLImageFieldNameLocationImage","abstract":"<p>The optional image of a destination / location</p>"},"Constants.html#/c:@SDLImageFieldNameSubMenuIcon":{"name":"SDLImageFieldNameSubMenuIcon","abstract":"<p>The image field for AddSubMenu.menuIcon</p>"},"Constants.html#/c:@SDLImageFieldNameSubtleAlertIcon":{"name":"SDLImageFieldNameSubtleAlertIcon","abstract":"<p>The image of the subtle alert; applies to <code>SubtleAlert</code> <code>alertImage</code></p>"},"Constants.html#/c:@SDLImageFieldNameMenuCommandSecondaryImage":{"name":"SDLImageFieldNameMenuCommandSecondaryImage","abstract":"<p>The secondary image field for AddCommand</p>"},"Constants.html#/c:@SDLImageFieldNameMenuSubMenuSecondaryImage":{"name":"SDLImageFieldNameMenuSubMenuSecondaryImage","abstract":"<p>The secondary image field for AddSubMenu</p>"},"Constants.html#/c:@SDLImageTypeStatic":{"name":"SDLImageTypeStatic","abstract":"<p>Activate an icon that shipped with the IVI system by passing a hex value.</p>"},"Constants.html#/c:@SDLImageTypeDynamic":{"name":"SDLImageTypeDynamic","abstract":"<p>An icon referencing an image uploaded by the app (identifier to be sent by SDLPutFile)</p>"},"Constants.html#/c:@SDLInteractionModeManualOnly":{"name":"SDLInteractionModeManualOnly","abstract":"<p>Interaction Mode : Manual Only</p>"},"Constants.html#/c:@SDLInteractionModeVoiceRecognitionOnly":{"name":"SDLInteractionModeVoiceRecognitionOnly","abstract":"<p>Interaction Mode : VR Only</p>"},"Constants.html#/c:@SDLInteractionModeBoth":{"name":"SDLInteractionModeBoth","abstract":"<p>Interaction Mode : Manual &amp; VR</p>"},"Constants.html#/c:@SDLKeyboardEventKeypress":{"name":"SDLKeyboardEventKeypress","abstract":"<p>The use has pressed the keyboard key (applies to both SINGLE_KEYPRESS and RESEND_CURRENT_ENTRY modes).</p>"},"Constants.html#/c:@SDLKeyboardEventSubmitted":{"name":"SDLKeyboardEventSubmitted","abstract":"<p>The User has finished entering text from the keyboard and submitted the entry.</p>"},"Constants.html#/c:@SDLKeyboardEventCancelled":{"name":"SDLKeyboardEventCancelled","abstract":"<p>The User has pressed the HMI-defined &ldquo;Cancel&rdquo; button.</p>"},"Constants.html#/c:@SDLKeyboardEventAborted":{"name":"SDLKeyboardEventAborted","abstract":"<p>The User has not finished entering text and the keyboard is aborted with the event of higher priority.</p>"},"Constants.html#/c:@SDLKeyboardEventVoice":{"name":"SDLKeyboardEventVoice","abstract":"<p>The user used voice as input for the keyboard</p>"},"Constants.html#/c:@SDLKeyboardEventInputKeyMaskEnabled":{"name":"SDLKeyboardEventInputKeyMaskEnabled","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLKeyboardEventInputKeyMaskDisabled":{"name":"SDLKeyboardEventInputKeyMaskDisabled","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLKeyboardInputMaskEnableInputKeyMask":{"name":"SDLKeyboardInputMaskEnableInputKeyMask","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLKeyboardInputMaskDisableInputKeyMask":{"name":"SDLKeyboardInputMaskDisableInputKeyMask","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLKeyboardInputMaskUserChoiceInputKeyMask":{"name":"SDLKeyboardInputMaskUserChoiceInputKeyMask","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLKeyboardLayoutQWERTY":{"name":"SDLKeyboardLayoutQWERTY","abstract":"<p>QWERTY layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutQWERTZ":{"name":"SDLKeyboardLayoutQWERTZ","abstract":"<p>QWERTZ layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutAZERTY":{"name":"SDLKeyboardLayoutAZERTY","abstract":"<p>AZERTY layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutNumeric":{"name":"SDLKeyboardLayoutNumeric","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLKeypressModeSingleKeypress":{"name":"SDLKeypressModeSingleKeypress","abstract":"<p>SINGLE_KEYPRESS:<br>Each and every User`s keypress must be reported (new notification for every newly entered single symbol).</p>"},"Constants.html#/c:@SDLKeypressModeQueueKeypresses":{"name":"SDLKeypressModeQueueKeypresses","abstract":"<p>QUEUE_KEYPRESSES:<br>The whole entry is reported only after the User submits it (by ‘Search’ button click displayed on touchscreen keyboard)</p>"},"Constants.html#/c:@SDLKeypressModeResendCurrentEntry":{"name":"SDLKeypressModeResendCurrentEntry","abstract":"<p>RESEND_CURRENT_ENTRY:<br>The whole entry must be reported each and every time the User makes a new keypress<br> (new notification with all previously entered symbols and a newly entered one appended).</p>"},"Constants.html#/c:@SDLLanguageEnSa":{"name":"SDLLanguageEnSa","abstract":"<p>English_SA</p>"},"Constants.html#/c:@SDLLanguageHeIl":{"name":"SDLLanguageHeIl","abstract":"<p>Hebrew_IL</p>"},"Constants.html#/c:@SDLLanguageRoRo":{"name":"SDLLanguageRoRo","abstract":"<p>Romainian_RO</p>"},"Constants.html#/c:@SDLLanguageUkUa":{"name":"SDLLanguageUkUa","abstract":"<p>Ukrainian_UA</p>"},"Constants.html#/c:@SDLLanguageIdId":{"name":"SDLLanguageIdId","abstract":"<p>Indonesian_ID</p>"},"Constants.html#/c:@SDLLanguageViVn":{"name":"SDLLanguageViVn","abstract":"<p>Vietnamese_VN</p>"},"Constants.html#/c:@SDLLanguageMsMy":{"name":"SDLLanguageMsMy","abstract":"<p>Malay_MY</p>"},"Constants.html#/c:@SDLLanguageHiIn":{"name":"SDLLanguageHiIn","abstract":"<p>Hindi_IN</p>"},"Constants.html#/c:@SDLLanguageNlBe":{"name":"SDLLanguageNlBe","abstract":"<p>Dutch(Flemish)_BE</p>"},"Constants.html#/c:@SDLLanguageElGr":{"name":"SDLLanguageElGr","abstract":"<p>Greek_GR</p>"},"Constants.html#/c:@SDLLanguageHuHu":{"name":"SDLLanguageHuHu","abstract":"<p>Hungarian_HU</p>"},"Constants.html#/c:@SDLLanguageFiFi":{"name":"SDLLanguageFiFi","abstract":"<p>Finnish_FI</p>"},"Constants.html#/c:@SDLLanguageSkSk":{"name":"SDLLanguageSkSk","abstract":"<p>Slovak_SK</p>"},"Constants.html#/c:@SDLLanguageEnUs":{"name":"SDLLanguageEnUs","abstract":"<p>English_US</p>"},"Constants.html#/c:@SDLLanguageEnIn":{"name":"SDLLanguageEnIn","abstract":"<p>English - India</p>"},"Constants.html#/c:@SDLLanguageThTh":{"name":"SDLLanguageThTh","abstract":"<p>Thai - Thailand</p>"},"Constants.html#/c:@SDLLanguageEsMx":{"name":"SDLLanguageEsMx","abstract":"<p>Spanish - Mexico</p>"},"Constants.html#/c:@SDLLanguageFrCa":{"name":"SDLLanguageFrCa","abstract":"<p>French - Canada</p>"},"Constants.html#/c:@SDLLanguageDeDe":{"name":"SDLLanguageDeDe","abstract":"<p>German - Germany</p>"},"Constants.html#/c:@SDLLanguageEsEs":{"name":"SDLLanguageEsEs","abstract":"<p>Spanish - Spain</p>"},"Constants.html#/c:@SDLLanguageEnGb":{"name":"SDLLanguageEnGb","abstract":"<p>English - Great Britain</p>"},"Constants.html#/c:@SDLLanguageRuRu":{"name":"SDLLanguageRuRu","abstract":"<p>Russian - Russia</p>"},"Constants.html#/c:@SDLLanguageTrTr":{"name":"SDLLanguageTrTr","abstract":"<p>Turkish - Turkey</p>"},"Constants.html#/c:@SDLLanguagePlPl":{"name":"SDLLanguagePlPl","abstract":"<p>Polish - Poland</p>"},"Constants.html#/c:@SDLLanguageFrFr":{"name":"SDLLanguageFrFr","abstract":"<p>French - France</p>"},"Constants.html#/c:@SDLLanguageItIt":{"name":"SDLLanguageItIt","abstract":"<p>Italian - Italy</p>"},"Constants.html#/c:@SDLLanguageSvSe":{"name":"SDLLanguageSvSe","abstract":"<p>Swedish - Sweden</p>"},"Constants.html#/c:@SDLLanguagePtPt":{"name":"SDLLanguagePtPt","abstract":"<p>Portuguese - Portugal</p>"},"Constants.html#/c:@SDLLanguageNlNl":{"name":"SDLLanguageNlNl","abstract":"<p>Dutch (Standard) - Netherlands</p>"},"Constants.html#/c:@SDLLanguageEnAu":{"name":"SDLLanguageEnAu","abstract":"<p>English - Australia</p>"},"Constants.html#/c:@SDLLanguageZhCn":{"name":"SDLLanguageZhCn","abstract":"<p>Mandarin - China</p>"},"Constants.html#/c:@SDLLanguageZhTw":{"name":"SDLLanguageZhTw","abstract":"<p>Mandarin - Taiwan</p>"},"Constants.html#/c:@SDLLanguageJaJp":{"name":"SDLLanguageJaJp","abstract":"<p>Japanese - Japan</p>"},"Constants.html#/c:@SDLLanguageArSa":{"name":"SDLLanguageArSa","abstract":"<p>Arabic - Saudi Arabia</p>"},"Constants.html#/c:@SDLLanguageKoKr":{"name":"SDLLanguageKoKr","abstract":"<p>Korean - South Korea</p>"},"Constants.html#/c:@SDLLanguagePtBr":{"name":"SDLLanguagePtBr","abstract":"<p>Portuguese - Brazil</p>"},"Constants.html#/c:@SDLLanguageCsCz":{"name":"SDLLanguageCsCz","abstract":"<p>Czech - Czech Republic</p>"},"Constants.html#/c:@SDLLanguageDaDk":{"name":"SDLLanguageDaDk","abstract":"<p>Danish - Denmark</p>"},"Constants.html#/c:@SDLLanguageNoNo":{"name":"SDLLanguageNoNo","abstract":"<p>Norwegian - Norway</p>"},"Constants.html#/c:@SDLLayoutModeIconOnly":{"name":"SDLLayoutModeIconOnly","abstract":"<p>This mode causes the interaction to display the previous set of choices as icons.</p>"},"Constants.html#/c:@SDLLayoutModeIconWithSearch":{"name":"SDLLayoutModeIconWithSearch","abstract":"<p>This mode causes the interaction to display the previous set of choices as icons along with a search field in the HMI.</p>"},"Constants.html#/c:@SDLLayoutModeListOnly":{"name":"SDLLayoutModeListOnly","abstract":"<p>This mode causes the interaction to display the previous set of choices as a list.</p>"},"Constants.html#/c:@SDLLayoutModeListWithSearch":{"name":"SDLLayoutModeListWithSearch","abstract":"<p>This mode causes the interaction to display the previous set of choices as a list along with a search field in the HMI.</p>"},"Constants.html#/c:@SDLLayoutModeKeyboard":{"name":"SDLLayoutModeKeyboard","abstract":"<p>This mode causes the interaction to immediately display a keyboard entry through the HMI.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftHighBeam":{"name":"SDLLightNameFrontLeftHighBeam","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_HIGH_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontRightHighBeam":{"name":"SDLLightNameFrontRightHighBeam","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_HIGH_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftLowBeam":{"name":"SDLLightNameFrontLeftLowBeam","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_LOW_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontRightLowBeam":{"name":"SDLLightNameFrontRightLowBeam","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_LOW_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftParkingLight":{"name":"SDLLightNameFrontLeftParkingLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_PARKING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightParkingLight":{"name":"SDLLightNameFrontRightParkingLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_PARKING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftFogLight":{"name":"SDLLightNameFrontLeftFogLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightFogLight":{"name":"SDLLightNameFrontRightFogLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftDaytimeRunningLight":{"name":"SDLLightNameFrontLeftDaytimeRunningLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_DAYTIME_RUNNING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightDaytimeRunningLight":{"name":"SDLLightNameFrontRightDaytimeRunningLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_DAYTIME_RUNNING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftTurnLight":{"name":"SDLLightNameFrontLeftTurnLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightTurnLight":{"name":"SDLLightNameFrontRightTurnLight","abstract":"<p>@abstract Represents the Light with name FRONT_Right_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftFogLight":{"name":"SDLLightNameRearLeftFogLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_FOG_LIGHT.</p>"},"Constants.html#/c:@SDLLightNameRearRightFogLight":{"name":"SDLLightNameRearRightFogLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftTailLight":{"name":"SDLLightNameRearLeftTailLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_TAIL_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightTailLight":{"name":"SDLLightNameRearRightTailLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_TAIL_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftBrakeLight":{"name":"SDLLightNameRearLeftBrakeLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_BRAKE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightBrakeLight":{"name":"SDLLightNameRearRightBrakeLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_BRAKE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftTurnLight":{"name":"SDLLightNameRearLeftTurnLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightTurnLight":{"name":"SDLLightNameRearRightTurnLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRegistrationPlateLight":{"name":"SDLLightNameRearRegistrationPlateLight","abstract":"<p>@abstract Represents the Light with name REAR_REGISTRATION_PLATE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameHighBeams":{"name":"SDLLightNameHighBeams","abstract":"<p>@abstract Include all high beam lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameLowBeams":{"name":"SDLLightNameLowBeams","abstract":"<p>@abstract Include all low beam lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameFogLights":{"name":"SDLLightNameFogLights","abstract":"<p>@abstract Include all fog lights: front_left, front_right, rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameRunningLights":{"name":"SDLLightNameRunningLights","abstract":"<p>@abstract Include all daytime running lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameParkingLights":{"name":"SDLLightNameParkingLights","abstract":"<p>@abstract Include all parking lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameBrakeLights":{"name":"SDLLightNameBrakeLights","abstract":"<p>@abstract Include all brake lights: rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameRearReversingLights":{"name":"SDLLightNameRearReversingLights","abstract":"<p>@abstract Represents the Light with name REAR_REVERSING_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameSideMarkerLights":{"name":"SDLLightNameSideMarkerLights","abstract":"<p>@abstract Represents the Light with name SIDE_MARKER_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameLeftTurnLights":{"name":"SDLLightNameLeftTurnLights","abstract":"<p>@abstract Include all left turn signal lights: front_left, rear_left, left_side and mirror_mounted.</p>"},"Constants.html#/c:@SDLLightNameRightTurnLights":{"name":"SDLLightNameRightTurnLights","abstract":"<p>@abstract Include all right turn signal lights: front_right, rear_right, right_side and mirror_mounted.</p>"},"Constants.html#/c:@SDLLightNameHazardLights":{"name":"SDLLightNameHazardLights","abstract":"<p>@abstract Include all hazard lights: front_left, front_right, rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameAmbientLights":{"name":"SDLLightNameAmbientLights","abstract":"<p>@abstract Represents the Light with name AMBIENT_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameOverHeadLights":{"name":"SDLLightNameOverHeadLights","abstract":"<p>@abstract Represents the Light with name OVERHEAD_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameReadingLights":{"name":"SDLLightNameReadingLights","abstract":"<p>@abstract Represents the Light with name READING_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameTrunkLights":{"name":"SDLLightNameTrunkLights","abstract":"<p>@abstract Represents the Light with name TRUNK_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameExteriorFrontLights":{"name":"SDLLightNameExteriorFrontLights","abstract":"<p>@abstract Include exterior lights located in front of the vehicle. For example, fog lights and low beams.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearLights":{"name":"SDLLightNameExteriorRearLights","abstract":"<p>@abstract Include exterior lights located at the back of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorLeftLights":{"name":"SDLLightNameExteriorLeftLights","abstract":"<p>@abstract Include exterior lights located at the left side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRightLights":{"name":"SDLLightNameExteriorRightLights","abstract":"<p>@abstract Include exterior lights located at the right side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRearCargoLights":{"name":"SDLLightNameExteriorRearCargoLights","abstract":"<p>@abstract Cargo lamps illuminate the cargo area.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearTruckBedLights":{"name":"SDLLightNameExteriorRearTruckBedLights","abstract":"<p>@abstract Truck bed lamps light up the bed of the truck.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearTrailerLights":{"name":"SDLLightNameExteriorRearTrailerLights","abstract":"<p>@abstract Trailer lights are lamps mounted on a trailer hitch.</p>"},"Constants.html#/c:@SDLLightNameExteriorLeftSpotLights":{"name":"SDLLightNameExteriorLeftSpotLights","abstract":"<p>@abstract It is the spotlights mounted on the left side of a vehicle.</p>"},"Constants.html#/c:@SDLLightNameExteriorRightSpotLights":{"name":"SDLLightNameExteriorRightSpotLights","abstract":"<p>@abstract It is the spotlights mounted on the right side of a vehicle.</p>"},"Constants.html#/c:@SDLLightNameExteriorLeftPuddleLights":{"name":"SDLLightNameExteriorLeftPuddleLights","abstract":"<p>@abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</p>"},"Constants.html#/c:@SDLLightNameExteriorRightPuddleLights":{"name":"SDLLightNameExteriorRightPuddleLights","abstract":"<p>@abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</p>"},"Constants.html#/c:@SDLLightNameExteriorAllLights":{"name":"SDLLightNameExteriorAllLights","abstract":"<p>@abstract Include all exterior lights around the vehicle.</p>"},"Constants.html#/c:@SDLLightStatusOn":{"name":"SDLLightStatusOn","abstract":"<p>@abstract Light status currently on.</p>"},"Constants.html#/c:@SDLLightStatusOFF":{"name":"SDLLightStatusOFF","abstract":"<p>@abstract Light status currently Off.</p>"},"Constants.html#/c:@SDLLightStatusRampUp":{"name":"SDLLightStatusRampUp","abstract":"<p>@abstract Light status currently RAMP_UP.</p>"},"Constants.html#/c:@SDLLightStatusRampDown":{"name":"SDLLightStatusRampDown","abstract":"<p>@abstract Light status currently RAMP_DOWN.</p>"},"Constants.html#/c:@SDLLightStatusUnknown":{"name":"SDLLightStatusUnknown","abstract":"<p>@abstract Light status currently UNKNOWN.</p>"},"Constants.html#/c:@SDLLightStatusInvalid":{"name":"SDLLightStatusInvalid","abstract":"<p>@abstract Light status currently INVALID.</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusNormal":{"name":"SDLMaintenanceModeStatusNormal","abstract":"<p>Maintenance Mode Status : Normal</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusNear":{"name":"SDLMaintenanceModeStatusNear","abstract":"<p>Maintenance Mode Status : Near</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusActive":{"name":"SDLMaintenanceModeStatusActive","abstract":"<p>Maintenance Mode Status : Active</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusFeatureNotPresent":{"name":"SDLMaintenanceModeStatusFeatureNotPresent","abstract":"<p>Maintenance Mode Status : Feature not present</p>"},"Constants.html#/c:@SDLMassageCushionTopLumbar":{"name":"SDLMassageCushionTopLumbar","abstract":"<p>@abstract TOP LUMBAR cushions of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionMiddleLumbar":{"name":"SDLMassageCushionMiddleLumbar","abstract":"<p>@abstract MIDDLE LUMBAR cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionBottomLumbar":{"name":"SDLMassageCushionBottomLumbar","abstract":"<p>@abstract BOTTOM LUMBAR cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionBackBolsters":{"name":"SDLMassageCushionBackBolsters","abstract":"<p>@abstract BACK BOLSTERS cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionSeatBolsters":{"name":"SDLMassageCushionSeatBolsters","abstract":"<p>@abstract SEAT BOLSTERS cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageModeOff":{"name":"SDLMassageModeOff","abstract":"<p>@abstract Massage Mode Status : OFF</p>"},"Constants.html#/c:@SDLMassageModeLow":{"name":"SDLMassageModeLow","abstract":"<p>@abstract Massage Mode Status : LOW</p>"},"Constants.html#/c:@SDLMassageModeHigh":{"name":"SDLMassageModeHigh","abstract":"<p>@abstract Massage Mode Status : HIGH</p>"},"Constants.html#/c:@SDLMassageZoneLumbar":{"name":"SDLMassageZoneLumbar","abstract":"<p>@abstract The back of a multi-contour massage seat. or SEAT_BACK</p>"},"Constants.html#/c:@SDLMassageZoneSeatCushion":{"name":"SDLMassageZoneSeatCushion","abstract":"<p>@abstract The bottom a multi-contour massage seat. or SEAT_BOTTOM</p>"},"Constants.html#/c:@SDLMediaClockFormatClock1":{"name":"SDLMediaClockFormatClock1","abstract":"<p>Media clock format: Clock1</p>"},"Constants.html#/c:@SDLMediaClockFormatClock2":{"name":"SDLMediaClockFormatClock2","abstract":"<p>Media clock format: Clock2</p>"},"Constants.html#/c:@SDLMediaClockFormatClock3":{"name":"SDLMediaClockFormatClock3","abstract":"<p>Media clock format: Clock3</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText1":{"name":"SDLMediaClockFormatClockText1","abstract":"<p>Media clock format: ClockText1</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText2":{"name":"SDLMediaClockFormatClockText2","abstract":"<p>Media clock format: ClockText2</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText3":{"name":"SDLMediaClockFormatClockText3","abstract":"<p>Media clock format: ClockText3</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText4":{"name":"SDLMediaClockFormatClockText4","abstract":"<p>Media clock format: ClockText4</p>"},"Constants.html#/c:@SDLMediaTypeMusic":{"name":"SDLMediaTypeMusic","abstract":"<p>The app will have a media type of music.</p>"},"Constants.html#/c:@SDLMediaTypePodcast":{"name":"SDLMediaTypePodcast","abstract":"<p>The app will have a media type of podcast.</p>"},"Constants.html#/c:@SDLMediaTypeAudiobook":{"name":"SDLMediaTypeAudiobook","abstract":"<p>The app will have a media type of audiobook.</p>"},"Constants.html#/c:@SDLMediaTypeOther":{"name":"SDLMediaTypeOther","abstract":"<p>The app will have a media type of other.</p>"},"Constants.html#/c:@SDLMenuLayoutList":{"name":"SDLMenuLayoutList","abstract":"<p>The menu should be laid out in a scrollable list format with one menu cell below the previous, each is stretched across the view</p>"},"Constants.html#/c:@SDLMenuLayoutTiles":{"name":"SDLMenuLayoutTiles","abstract":"<p>The menu should be laid out in a scrollable tiles format with each menu cell laid out in a square-ish format next to each other horizontally</p>"},"Constants.html#/c:@SDLMetadataTypeMediaTitle":{"name":"SDLMetadataTypeMediaTitle","abstract":"<p>The song / media title name</p>"},"Constants.html#/c:@SDLMetadataTypeMediaArtist":{"name":"SDLMetadataTypeMediaArtist","abstract":"<p>The &ldquo;artist&rdquo; of the media</p>"},"Constants.html#/c:@SDLMetadataTypeMediaAlbum":{"name":"SDLMetadataTypeMediaAlbum","abstract":"<p>The &ldquo;album&rdquo; of the media&quot;</p>"},"Constants.html#/c:@SDLMetadataTypeMediaYear":{"name":"SDLMetadataTypeMediaYear","abstract":"<p>The &ldquo;year&rdquo; that the media was created</p>"},"Constants.html#/c:@SDLMetadataTypeMediaGenre":{"name":"SDLMetadataTypeMediaGenre","abstract":"<p>The &ldquo;genre&rdquo; of the media</p>"},"Constants.html#/c:@SDLMetadataTypeMediaStation":{"name":"SDLMetadataTypeMediaStation","abstract":"<p>The &ldquo;station&rdquo; that the media is playing on</p>"},"Constants.html#/c:@SDLMetadataTypeRating":{"name":"SDLMetadataTypeRating","abstract":"<p>The &ldquo;rating&rdquo; given to the media</p>"},"Constants.html#/c:@SDLMetadataTypeCurrentTemperature":{"name":"SDLMetadataTypeCurrentTemperature","abstract":"<p>The current temperature of the weather information</p>"},"Constants.html#/c:@SDLMetadataTypeMaximumTemperature":{"name":"SDLMetadataTypeMaximumTemperature","abstract":"<p>The high / maximum temperature of the weather information for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeMinimumTemperature":{"name":"SDLMetadataTypeMinimumTemperature","abstract":"<p>The low / minimum temperature of the weather information for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeWeatherTerm":{"name":"SDLMetadataTypeWeatherTerm","abstract":"<p>A description of the weather for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeHumidity":{"name":"SDLMetadataTypeHumidity","abstract":"<p>The humidity of the weather information for the current period</p>"},"Constants.html#/c:@SDLModuleTypeClimate":{"name":"SDLModuleTypeClimate","abstract":"<p>A SDLModuleType with the value of <em>CLIMATE</em></p>"},"Constants.html#/c:@SDLModuleTypeRadio":{"name":"SDLModuleTypeRadio","abstract":"<p>A SDLModuleType with the value of <em>RADIO</em></p>"},"Constants.html#/c:@SDLModuleTypeSeat":{"name":"SDLModuleTypeSeat","abstract":"<p>A SDLModuleType with the value of <em>SEAT</em></p>"},"Constants.html#/c:@SDLModuleTypeAudio":{"name":"SDLModuleTypeAudio","abstract":"<p>A SDLModuleType with the value of <em>AUDIO</em></p>"},"Constants.html#/c:@SDLModuleTypeLight":{"name":"SDLModuleTypeLight","abstract":"<p>A SDLModuleType with the value of <em>LIGHT</em></p>"},"Constants.html#/c:@SDLModuleTypeHMISettings":{"name":"SDLModuleTypeHMISettings","abstract":"<p>A SDLModuleType with the value of <em>HMI_SETTINGS</em></p>"},"Constants.html#/c:@SDLNavigationActionTurn":{"name":"SDLNavigationActionTurn","abstract":"<p>Using this action plus a supplied direction can give the type of turn.</p>"},"Constants.html#/c:@SDLNavigationActionExit":{"name":"SDLNavigationActionExit","abstract":"<p>A navigation action of exit.</p>"},"Constants.html#/c:@SDLNavigationActionStay":{"name":"SDLNavigationActionStay","abstract":"<p>A navigation action of stay.</p>"},"Constants.html#/c:@SDLNavigationActionMerge":{"name":"SDLNavigationActionMerge","abstract":"<p>A navigation action of merge.</p>"},"Constants.html#/c:@SDLNavigationActionFerry":{"name":"SDLNavigationActionFerry","abstract":"<p>A navigation action of ferry.</p>"},"Constants.html#/c:@SDLNavigationActionCarShuttleTrain":{"name":"SDLNavigationActionCarShuttleTrain","abstract":"<p>A navigation action of car shuttle train.</p>"},"Constants.html#/c:@SDLNavigationActionWaypoint":{"name":"SDLNavigationActionWaypoint","abstract":"<p>A navigation action of waypoint.</p>"},"Constants.html#/c:@SDLNavigationJunctionRegular":{"name":"SDLNavigationJunctionRegular","abstract":"<p>A junction that represents a standard intersection with a single road crossing another.</p>"},"Constants.html#/c:@SDLNavigationJunctionBifurcation":{"name":"SDLNavigationJunctionBifurcation","abstract":"<p>A junction where the road splits off into two paths; a fork in the road.</p>"},"Constants.html#/c:@SDLNavigationJunctionMultiCarriageway":{"name":"SDLNavigationJunctionMultiCarriageway","abstract":"<p>A junction that has multiple intersections and paths.</p>"},"Constants.html#/c:@SDLNavigationJunctionRoundabout":{"name":"SDLNavigationJunctionRoundabout","abstract":"<p>A junction where traffic moves in a single direction around a central, non-traversable point to reach one of the connecting roads.</p>"},"Constants.html#/c:@SDLNavigationJunctionTraversableRoundabout":{"name":"SDLNavigationJunctionTraversableRoundabout","abstract":"<p>Similar to a roundabout, however the center of the roundabout is fully traversable. Also known as a mini-roundabout.</p>"},"Constants.html#/c:@SDLNavigationJunctionJughandle":{"name":"SDLNavigationJunctionJughandle","abstract":"<p>A junction where lefts diverge to the right, then curve to the left, converting a left turn to a crossing maneuver.</p>"},"Constants.html#/c:@SDLNavigationJunctionAllWayYield":{"name":"SDLNavigationJunctionAllWayYield","abstract":"<p>Multiple way intersection that allows traffic to flow based on priority; most commonly right of way and first in, first out.</p>"},"Constants.html#/c:@SDLNavigationJunctionTurnAround":{"name":"SDLNavigationJunctionTurnAround","abstract":"<p>A junction designated for traffic turn arounds.</p>"},"Constants.html#/c:@SDLNotificationUserInfoObject":{"name":"SDLNotificationUserInfoObject","abstract":"<p>The key used in all SDL NSNotifications to extract the response or notification from the userinfo dictionary.</p>"},"Constants.html#/c:@SDLTransportDidDisconnect":{"name":"SDLTransportDidDisconnect","abstract":"<p>Name for a disconnection notification</p>"},"Constants.html#/c:@SDLTransportDidConnect":{"name":"SDLTransportDidConnect","abstract":"<p>Name for a connection notification</p>"},"Constants.html#/c:@SDLTransportConnectError":{"name":"SDLTransportConnectError","abstract":"<p>Name for a error during connection notification</p>"},"Constants.html#/c:@SDLRPCServiceDidDisconnect":{"name":"SDLRPCServiceDidDisconnect","abstract":"<p>Name for a disconnection notification</p>"},"Constants.html#/c:@SDLRPCServiceDidConnect":{"name":"SDLRPCServiceDidConnect","abstract":"<p>Name for a connection notification</p>"},"Constants.html#/c:@SDLRPCServiceConnectionDidError":{"name":"SDLRPCServiceConnectionDidError","abstract":"<p>Name for a error during connection notification</p>"},"Constants.html#/c:@SDLDidReceiveError":{"name":"SDLDidReceiveError","abstract":"<p>Name for a general error notification</p>"},"Constants.html#/c:@SDLDidReceiveLockScreenIcon":{"name":"SDLDidReceiveLockScreenIcon","abstract":"<p>Name for an incoming lock screen icon notification</p>"},"Constants.html#/c:@SDLDidBecomeReady":{"name":"SDLDidBecomeReady","abstract":"<p>Name for an SDL became ready notification</p>"},"Constants.html#/c:@SDLDidUpdateProjectionView":{"name":"SDLDidUpdateProjectionView","abstract":"<p>Name for a notification sent by the user when their CarWindow view has been updated</p>"},"Constants.html#/c:@SDLDidReceiveAddCommandResponse":{"name":"SDLDidReceiveAddCommandResponse","abstract":"<p>Name for an AddCommand response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddSubMenuResponse":{"name":"SDLDidReceiveAddSubMenuResponse","abstract":"<p>Name for an AddSubMenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertResponse":{"name":"SDLDidReceiveAlertResponse","abstract":"<p>Name for an Alert response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertManeuverResponse":{"name":"SDLDidReceiveAlertManeuverResponse","abstract":"<p>Name for an AlertManeuver response RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressResponse":{"name":"SDLDidReceiveButtonPressResponse","abstract":"<p>Name for an ButtonPress response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCancelInteractionResponse":{"name":"SDLDidReceiveCancelInteractionResponse","abstract":"<p>Name for aa CancelInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceiveChangeRegistrationResponse":{"name":"SDLDidReceiveChangeRegistrationResponse","abstract":"<p>Name for a ChangeRegistration response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCloseApplicationResponse":{"name":"SDLDidReceiveCloseApplicationResponse","abstract":"<p>Name for a CloseApplication response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetResponse":{"name":"SDLDidReceiveCreateInteractionChoiceSetResponse","abstract":"<p>Name for a CreateInteractionChoiceSet response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateWindowResponse":{"name":"SDLDidReceiveCreateWindowResponse","abstract":"<p>Name for a CreateWindow response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteCommandResponse":{"name":"SDLDidReceiveDeleteCommandResponse","abstract":"<p>Name for a DeleteCommand response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteFileResponse":{"name":"SDLDidReceiveDeleteFileResponse","abstract":"<p>Name for a DeleteFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetResponse":{"name":"SDLDidReceiveDeleteInteractionChoiceSetResponse","abstract":"<p>Name for a DeleteInteractionChoiceSet response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteSubmenuResponse":{"name":"SDLDidReceiveDeleteSubmenuResponse","abstract":"<p>Name for a DeleteSubmenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteWindowResponse":{"name":"SDLDidReceiveDeleteWindowResponse","abstract":"<p>Name for a DeleteWindow response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageResponse":{"name":"SDLDidReceiveDiagnosticMessageResponse","abstract":"<p>Name for a DiagnosticMessage response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDialNumberResponse":{"name":"SDLDidReceiveDialNumberResponse","abstract":"<p>Name for a DialNumber response RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataResponse":{"name":"SDLDidReceiveEncodedSyncPDataResponse","abstract":"<p>Name for an EncodedSyncPData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruResponse":{"name":"SDLDidReceiveEndAudioPassThruResponse","abstract":"<p>Name for an EndAudioPassThru response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGenericResponse":{"name":"SDLDidReceiveGenericResponse","abstract":"<p>Name for a Generic response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesResponse":{"name":"SDLDidReceiveGetCloudAppPropertiesResponse","abstract":"<p>Name for a GetCloudAppProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataResponse":{"name":"SDLDidReceiveGetAppServiceDataResponse","abstract":"<p>Name for a GetAppServiceData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetDTCsResponse":{"name":"SDLDidReceiveGetDTCsResponse","abstract":"<p>Name for a GetDTCs response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetFileResponse":{"name":"SDLDidReceiveGetFileResponse","abstract":"<p>Name for a GetFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataResponse":{"name":"SDLDidReceiveGetInteriorVehicleDataResponse","abstract":"<p>Name for a GetInteriorVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataConsentResponse":{"name":"SDLDidReceiveGetInteriorVehicleDataConsentResponse","abstract":"<p>Name for a GetInteriorVehicleDataConsent response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilitiesResponse":{"name":"SDLDidReceiveGetSystemCapabilitiesResponse","abstract":"<p>Name for a GetSystemCapabilities response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetVehicleDataResponse":{"name":"SDLDidReceiveGetVehicleDataResponse","abstract":"<p>Name for a GetVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetWaypointsResponse":{"name":"SDLDidReceiveGetWaypointsResponse","abstract":"<p>Name for a GetWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveListFilesResponse":{"name":"SDLDidReceiveListFilesResponse","abstract":"<p>Name for a ListFiles response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionResponse":{"name":"SDLDidReceivePerformAppServiceInteractionResponse","abstract":"<p>Name for a PerformAppServiceInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruResponse":{"name":"SDLDidReceivePerformAudioPassThruResponse","abstract":"<p>Name for a PerformAudioPassThru response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformInteractionResponse":{"name":"SDLDidReceivePerformInteractionResponse","abstract":"<p>Name for a PerformInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceivePublishAppServiceResponse":{"name":"SDLDidReceivePublishAppServiceResponse","abstract":"<p>Name for a PublishAppService response RPC</p>"},"Constants.html#/c:@SDLDidReceivePutFileResponse":{"name":"SDLDidReceivePutFileResponse","abstract":"<p>Name for a ReceivePutFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveReadDIDResponse":{"name":"SDLDidReceiveReadDIDResponse","abstract":"<p>Name for a ReceiveReadDID response RPC</p>"},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceResponse":{"name":"SDLDidReceiveRegisterAppInterfaceResponse","abstract":"<p>Name for a RegisterAppInterface response RPC</p>"},"Constants.html#/c:@SDLDidReceiveReleaseInteriorVehicleDataModuleResponse":{"name":"SDLDidReceiveReleaseInteriorVehicleDataModuleResponse","abstract":"<p>Name for a ReleaseInteriorVehicleDataModule response RPC</p>"},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesResponse":{"name":"SDLDidReceiveResetGlobalPropertiesResponse","abstract":"<p>Name for a ResetGlobalProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveScrollableMessageResponse":{"name":"SDLDidReceiveScrollableMessageResponse","abstract":"<p>Name for a ScrollableMessage response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendHapticDataResponse":{"name":"SDLDidReceiveSendHapticDataResponse","abstract":"<p>Name for a SendHapticData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendLocationResponse":{"name":"SDLDidReceiveSendLocationResponse","abstract":"<p>Name for a SendLocation response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetAppIconResponse":{"name":"SDLDidReceiveSetAppIconResponse","abstract":"<p>Name for a SetAppIcon response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesResponse":{"name":"SDLDidReceiveSetCloudAppPropertiesResponse","abstract":"<p>Name for a SetCloudAppProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutResponse":{"name":"SDLDidReceiveSetDisplayLayoutResponse","abstract":"<p>Name for a SetDisplayLayout response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesResponse":{"name":"SDLDidReceiveSetGlobalPropertiesResponse","abstract":"<p>Name for a SetGlobalProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataResponse":{"name":"SDLDidReceiveSetInteriorVehicleDataResponse","abstract":"<p>Name for a SetInteriorVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerResponse":{"name":"SDLDidReceiveSetMediaClockTimerResponse","abstract":"<p>Name for a SetMediaClockTimer response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowConstantTBTResponse":{"name":"SDLDidReceiveShowConstantTBTResponse","abstract":"<p>Name for a ShowConstantTBT response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowResponse":{"name":"SDLDidReceiveShowResponse","abstract":"<p>Name for a Show response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowAppMenuResponse":{"name":"SDLDidReceiveShowAppMenuResponse","abstract":"<p>Name for a ShowAppMenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSliderResponse":{"name":"SDLDidReceiveSliderResponse","abstract":"<p>Name for a Slider response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSpeakResponse":{"name":"SDLDidReceiveSpeakResponse","abstract":"<p>Name for a Speak response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeButtonResponse":{"name":"SDLDidReceiveSubscribeButtonResponse","abstract":"<p>Name for a SubscribeButton response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataResponse":{"name":"SDLDidReceiveSubscribeVehicleDataResponse","abstract":"<p>Name for a SubscribeVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeWaypointsResponse":{"name":"SDLDidReceiveSubscribeWaypointsResponse","abstract":"<p>Name for a SubscribeWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertResponse":{"name":"SDLDidReceiveSubtleAlertResponse","abstract":"<p>Name for a SubtleAlert response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataResponse":{"name":"SDLDidReceiveSyncPDataResponse","abstract":"<p>Name for a SyncPData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestResponse":{"name":"SDLDidReceiveSystemRequestResponse","abstract":"<p>Name for a SystemRequest response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateTurnListResponse":{"name":"SDLDidReceiveUpdateTurnListResponse","abstract":"<p>Name for an UpdateTurnList response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnpublishAppServiceResponse":{"name":"SDLDidReceiveUnpublishAppServiceResponse","abstract":"<p>Name for an UnpublishAppService response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceResponse":{"name":"SDLDidReceiveUnregisterAppInterfaceResponse","abstract":"<p>Name for an UnregisterAppInterface response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonResponse":{"name":"SDLDidReceiveUnsubscribeButtonResponse","abstract":"<p>Name for an UnsubscribeButton response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataResponse":{"name":"SDLDidReceiveUnsubscribeVehicleDataResponse","abstract":"<p>Name for an UnsubscribeVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeWaypointsResponse":{"name":"SDLDidReceiveUnsubscribeWaypointsResponse","abstract":"<p>Name for an UnsubscribeWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddCommandRequest":{"name":"SDLDidReceiveAddCommandRequest","abstract":"<p>Name for an AddCommand request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddSubMenuRequest":{"name":"SDLDidReceiveAddSubMenuRequest","abstract":"<p>Name for an AddSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertRequest":{"name":"SDLDidReceiveAlertRequest","abstract":"<p>Name for an Alert request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertManeuverRequest":{"name":"SDLDidReceiveAlertManeuverRequest","abstract":"<p>Name for an AlertManeuver request RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressRequest":{"name":"SDLDidReceiveButtonPressRequest","abstract":"<p>Name for a ButtonPress request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCancelInteractionRequest":{"name":"SDLDidReceiveCancelInteractionRequest","abstract":"<p>Name for a CancelInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceiveChangeRegistrationRequest":{"name":"SDLDidReceiveChangeRegistrationRequest","abstract":"<p>Name for a ChangeRegistration request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCloseApplicationRequest":{"name":"SDLDidReceiveCloseApplicationRequest","abstract":"<p>Name for a CloseApplication request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetRequest":{"name":"SDLDidReceiveCreateInteractionChoiceSetRequest","abstract":"<p>Name for a CreateInteractionChoiceSet request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateWindowRequest":{"name":"SDLDidReceiveCreateWindowRequest","abstract":"<p>Name for a CreateWindow request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteCommandRequest":{"name":"SDLDidReceiveDeleteCommandRequest","abstract":"<p>Name for a DeleteCommand request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteFileRequest":{"name":"SDLDidReceiveDeleteFileRequest","abstract":"<p>Name for a DeleteFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetRequest":{"name":"SDLDidReceiveDeleteInteractionChoiceSetRequest","abstract":"<p>Name for a DeleteInteractionChoiceSet request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteSubMenuRequest":{"name":"SDLDidReceiveDeleteSubMenuRequest","abstract":"<p>Name for a DeleteSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteWindowRequest":{"name":"SDLDidReceiveDeleteWindowRequest","abstract":"<p>Name for a DeleteSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageRequest":{"name":"SDLDidReceiveDiagnosticMessageRequest","abstract":"<p>Name for a DiagnosticMessage request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDialNumberRequest":{"name":"SDLDidReceiveDialNumberRequest","abstract":"<p>Name for a DialNumberR request RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataRequest":{"name":"SDLDidReceiveEncodedSyncPDataRequest","abstract":"<p>Name for an EncodedSyncPData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruRequest":{"name":"SDLDidReceiveEndAudioPassThruRequest","abstract":"<p>Name for a EndAudioPass request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataRequest":{"name":"SDLDidReceiveGetAppServiceDataRequest","abstract":"<p>Name for a GetAppServiceData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesRequest":{"name":"SDLDidReceiveGetCloudAppPropertiesRequest","abstract":"<p>Name for a GetCloudAppProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetDTCsRequest":{"name":"SDLDidReceiveGetDTCsRequest","abstract":"<p>Name for a ReceiveGetDTCs request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetFileRequest":{"name":"SDLDidReceiveGetFileRequest","abstract":"<p>Name for a GetFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataRequest":{"name":"SDLDidReceiveGetInteriorVehicleDataRequest","abstract":"<p>Name for a GetInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataConsentRequest":{"name":"SDLDidReceiveGetInteriorVehicleDataConsentRequest","abstract":"<p>Name for a GetInteriorVehicleDataConsent request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilityRequest":{"name":"SDLDidReceiveGetSystemCapabilityRequest","abstract":"<p>Name for a GetSystemCapability request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetVehicleDataRequest":{"name":"SDLDidReceiveGetVehicleDataRequest","abstract":"<p>Name for a GetVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetWayPointsRequest":{"name":"SDLDidReceiveGetWayPointsRequest","abstract":"<p>Name for a GetWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveListFilesRequest":{"name":"SDLDidReceiveListFilesRequest","abstract":"<p>Name for a ListFiles request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionRequest":{"name":"SDLDidReceivePerformAppServiceInteractionRequest","abstract":"<p>Name for a PerformAppServiceInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruRequest":{"name":"SDLDidReceivePerformAudioPassThruRequest","abstract":"<p>Name for a PerformAudioPassThru request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformInteractionRequest":{"name":"SDLDidReceivePerformInteractionRequest","abstract":"<p>Name for a PerformInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceivePublishAppServiceRequest":{"name":"SDLDidReceivePublishAppServiceRequest","abstract":"<p>Name for a PublishAppService request RPC</p>"},"Constants.html#/c:@SDLDidReceivePutFileRequest":{"name":"SDLDidReceivePutFileRequest","abstract":"<p>Name for a PutFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveReadDIDRequest":{"name":"SDLDidReceiveReadDIDRequest","abstract":"<p>Name for a ReadDID request RPC</p>"},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceRequest":{"name":"SDLDidReceiveRegisterAppInterfaceRequest","abstract":"<p>Name for a RegisterAppInterfacr request RPC</p>"},"Constants.html#/c:@SDLDidReceiveReleaseInteriorVehicleDataModuleRequest":{"name":"SDLDidReceiveReleaseInteriorVehicleDataModuleRequest","abstract":"<p>Name for a ReleaseInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesRequest":{"name":"SDLDidReceiveResetGlobalPropertiesRequest","abstract":"<p>Name for a ResetGlobalProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveScrollableMessageRequest":{"name":"SDLDidReceiveScrollableMessageRequest","abstract":"<p>Name for a ScrollableMessage request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendHapticDataRequest":{"name":"SDLDidReceiveSendHapticDataRequest","abstract":"<p>Name for a SendHapticData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendLocationRequest":{"name":"SDLDidReceiveSendLocationRequest","abstract":"<p>Name for a SendLocation request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetAppIconRequest":{"name":"SDLDidReceiveSetAppIconRequest","abstract":"<p>Name for a SetAppIcon request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesRequest":{"name":"SDLDidReceiveSetCloudAppPropertiesRequest","abstract":"<p>Name for a SetCloudProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutRequest":{"name":"SDLDidReceiveSetDisplayLayoutRequest","abstract":"<p>Name for a SetDisplayLayout request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesRequest":{"name":"SDLDidReceiveSetGlobalPropertiesRequest","abstract":"<p>Name for a SetGlobalProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataRequest":{"name":"SDLDidReceiveSetInteriorVehicleDataRequest","abstract":"<p>Name for a SetInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerRequest":{"name":"SDLDidReceiveSetMediaClockTimerRequest","abstract":"<p>Name for a SetMediaClockTimer request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowRequest":{"name":"SDLDidReceiveShowRequest","abstract":"<p>Name for a Show request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowAppMenuRequest":{"name":"SDLDidReceiveShowAppMenuRequest","abstract":"<p>Name for a ShowAppMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowConstantTBTRequest":{"name":"SDLDidReceiveShowConstantTBTRequest","abstract":"<p>Name for a ShowConstantTBT request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSliderRequest":{"name":"SDLDidReceiveSliderRequest","abstract":"<p>Name for a Slider request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSpeakRequest":{"name":"SDLDidReceiveSpeakRequest","abstract":"<p>Name for a Speak request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeButtonRequest":{"name":"SDLDidReceiveSubscribeButtonRequest","abstract":"<p>Name for a SubscribeButton request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataRequest":{"name":"SDLDidReceiveSubscribeVehicleDataRequest","abstract":"<p>Name for a SubscribeVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeWayPointsRequest":{"name":"SDLDidReceiveSubscribeWayPointsRequest","abstract":"<p>Name for a SubscribeWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertRequest":{"name":"SDLDidReceiveSubtleAlertRequest","abstract":"<p>Name for a SubtleAlert request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataRequest":{"name":"SDLDidReceiveSyncPDataRequest","abstract":"<p>Name for a SyncPData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestRequest":{"name":"SDLDidReceiveSystemRequestRequest","abstract":"<p>Name for a SystemRequest request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnpublishAppServiceRequest":{"name":"SDLDidReceiveUnpublishAppServiceRequest","abstract":"<p>Name for an UnpublishAppService request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceRequest":{"name":"SDLDidReceiveUnregisterAppInterfaceRequest","abstract":"<p>Name for an UnregisterAppInterface request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonRequest":{"name":"SDLDidReceiveUnsubscribeButtonRequest","abstract":"<p>Name for an UnsubscribeButton request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataRequest":{"name":"SDLDidReceiveUnsubscribeVehicleDataRequest","abstract":"<p>Name for an UnsubscribeVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeWayPointsRequest":{"name":"SDLDidReceiveUnsubscribeWayPointsRequest","abstract":"<p>Name for an UnsubscribeWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateTurnListRequest":{"name":"SDLDidReceiveUpdateTurnListRequest","abstract":"<p>Name for an UpdateTurnList request RPC</p>"},"Constants.html#/c:@SDLDidChangeDriverDistractionStateNotification":{"name":"SDLDidChangeDriverDistractionStateNotification","abstract":"<p>Name for a DriverDistractionState notification RPC</p>"},"Constants.html#/c:@SDLDidChangeHMIStatusNotification":{"name":"SDLDidChangeHMIStatusNotification","abstract":"<p>Name for a HMIStatus notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAppServiceDataNotification":{"name":"SDLDidReceiveAppServiceDataNotification","abstract":"<p>Name for an AppServiceData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAppUnregisteredNotification":{"name":"SDLDidReceiveAppUnregisteredNotification","abstract":"<p>Name for an AppUnregistered notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAudioPassThruNotification":{"name":"SDLDidReceiveAudioPassThruNotification","abstract":"<p>Name for an AudioPassThru notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonEventNotification":{"name":"SDLDidReceiveButtonEventNotification","abstract":"<p>Name for a ButtonEvent notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressNotification":{"name":"SDLDidReceiveButtonPressNotification","abstract":"<p>Name for a ButtonPress notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveCommandNotification":{"name":"SDLDidReceiveCommandNotification","abstract":"<p>Name for a Command notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedDataNotification":{"name":"SDLDidReceiveEncodedDataNotification","abstract":"<p>Name for a EncodedSyncPData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveInteriorVehicleDataNotification":{"name":"SDLDidReceiveInteriorVehicleDataNotification","abstract":"<p>Name for a InteriorVehicleData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveKeyboardInputNotification":{"name":"SDLDidReceiveKeyboardInputNotification","abstract":"<p>Name for a KeyboardInput notification RPC</p>"},"Constants.html#/c:@SDLDidChangeLanguageNotification":{"name":"SDLDidChangeLanguageNotification","abstract":"<p>Name for a Language notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveNewHashNotification":{"name":"SDLDidReceiveNewHashNotification","abstract":"<p>Name for a NewHash notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveVehicleIconNotification":{"name":"SDLDidReceiveVehicleIconNotification","abstract":"<p>Name for a VehicleIcon notification RPC</p>"},"Constants.html#/c:@SDLDidChangePermissionsNotification":{"name":"SDLDidChangePermissionsNotification","abstract":"<p>Name for a ChangePermissions notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertPressedNotification":{"name":"SDLDidReceiveSubtleAlertPressedNotification","abstract":"<p>Name for a SubtleAlertPressed notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveRemoteControlStatusNotification":{"name":"SDLDidReceiveRemoteControlStatusNotification","abstract":"<p>Name for a RemoteControlStatus notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataNotification":{"name":"SDLDidReceiveSyncPDataNotification","abstract":"<p>Name for an OnSyncPData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemCapabilityUpdatedNotification":{"name":"SDLDidReceiveSystemCapabilityUpdatedNotification","abstract":"<p>Name for a SystemCapability notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestNotification":{"name":"SDLDidReceiveSystemRequestNotification","abstract":"<p>Name for a SystemRequest notification RPC</p>"},"Constants.html#/c:@SDLDidChangeTurnByTurnStateNotification":{"name":"SDLDidChangeTurnByTurnStateNotification","abstract":"<p>Name for a TurnByTurnStat notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveTouchEventNotification":{"name":"SDLDidReceiveTouchEventNotification","abstract":"<p>Name for a TouchEvent notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateFileNotification":{"name":"SDLDidReceiveUpdateFileNotification","abstract":"<p>Name for an OnUpdateFile notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateSubMenuNotification":{"name":"SDLDidReceiveUpdateSubMenuNotification","abstract":"<p>Name for an OnUpdateSubMenu notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveVehicleDataNotification":{"name":"SDLDidReceiveVehicleDataNotification","abstract":"<p>Name for a VehicleData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveWaypointNotification":{"name":"SDLDidReceiveWaypointNotification","abstract":"<p>Name for a Waypoint notification RPC</p>"},"Constants.html#/c:@SDLPRNDLPark":{"name":"SDLPRNDLPark","abstract":"<p>Park</p>"},"Constants.html#/c:@SDLPRNDLReverse":{"name":"SDLPRNDLReverse","abstract":"<p>Reverse gear</p>"},"Constants.html#/c:@SDLPRNDLNeutral":{"name":"SDLPRNDLNeutral","abstract":"<p>No gear</p>"},"Constants.html#/c:@SDLPRNDLDrive":{"name":"SDLPRNDLDrive","abstract":"<p>@abstract: Drive gear</p>"},"Constants.html#/c:@SDLPRNDLSport":{"name":"SDLPRNDLSport","abstract":"<p>Drive Sport mode</p>"},"Constants.html#/c:@SDLPRNDLLowGear":{"name":"SDLPRNDLLowGear","abstract":"<p>1st gear hold</p>"},"Constants.html#/c:@SDLPRNDLFirst":{"name":"SDLPRNDLFirst","abstract":"<p>First gear</p>"},"Constants.html#/c:@SDLPRNDLNinth":{"name":"SDLPRNDLNinth","abstract":"<p>Ninth gear"},"Constants.html#/c:@SDLPRNDLSecond":{"name":"SDLPRNDLSecond","abstract":"<p>Second gear</p>"},"Constants.html#/c:@SDLPRNDLTenth":{"name":"SDLPRNDLTenth","abstract":"<p>Tenth gear"},"Constants.html#/c:@SDLPRNDLThird":{"name":"SDLPRNDLThird","abstract":"<p>Third gear</p>"},"Constants.html#/c:@SDLPRNDLFourth":{"name":"SDLPRNDLFourth","abstract":"<p>Fourth gear</p>"},"Constants.html#/c:@SDLPRNDLFifth":{"name":"SDLPRNDLFifth","abstract":"<p>Fifth gear</p>"},"Constants.html#/c:@SDLPRNDLSixth":{"name":"SDLPRNDLSixth","abstract":"<p>Sixth gear</p>"},"Constants.html#/c:@SDLPRNDLSeventh":{"name":"SDLPRNDLSeventh","abstract":"<p>Seventh gear</p>"},"Constants.html#/c:@SDLPRNDLEighth":{"name":"SDLPRNDLEighth","abstract":"<p>Eighth gear</p>"},"Constants.html#/c:@SDLPRNDLUnknown":{"name":"SDLPRNDLUnknown","abstract":"<p>Unknown</p>"},"Constants.html#/c:@SDLPRNDLFault":{"name":"SDLPRNDLFault","abstract":"<p>Fault</p>"},"Constants.html#/c:@SDLPermissionStatusAllowed":{"name":"SDLPermissionStatusAllowed","abstract":"<p>permission: allowed</p>"},"Constants.html#/c:@SDLPermissionStatusDisallowed":{"name":"SDLPermissionStatusDisallowed","abstract":"<p>permission: disallowed</p>"},"Constants.html#/c:@SDLPermissionStatusUserDisallowed":{"name":"SDLPermissionStatusUserDisallowed","abstract":"<p>permission: user disallowed</p>"},"Constants.html#/c:@SDLPermissionStatusUserConsentPending":{"name":"SDLPermissionStatusUserConsentPending","abstract":"<p>permission: user consent pending</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusUndefined":{"name":"SDLPowerModeQualificationStatusUndefined","abstract":"<p>An undefined status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusEvaluationInProgress":{"name":"SDLPowerModeQualificationStatusEvaluationInProgress","abstract":"<p>An &ldquo;evaluation in progress&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusNotDefined":{"name":"SDLPowerModeQualificationStatusNotDefined","abstract":"<p>A &ldquo;not defined&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusOk":{"name":"SDLPowerModeQualificationStatusOk","abstract":"<p>An &ldquo;ok&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyOut":{"name":"SDLPowerModeStatusKeyOut","abstract":"<p>The key is not in the ignition, and the power is off</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyRecentlyOut":{"name":"SDLPowerModeStatusKeyRecentlyOut","abstract":"<p>The key is not in the ignition and it was just recently removed</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyApproved":{"name":"SDLPowerModeStatusKeyApproved","abstract":"<p>The key is not in the ignition, but an approved key is available</p>"},"Constants.html#/c:@SDLPowerModeStatusPostAccessory":{"name":"SDLPowerModeStatusPostAccessory","abstract":"<p>We are in a post-accessory power situation</p>"},"Constants.html#/c:@SDLPowerModeStatusAccessory":{"name":"SDLPowerModeStatusAccessory","abstract":"<p>The car is in accessory power mode</p>"},"Constants.html#/c:@SDLPowerModeStatusPostIgnition":{"name":"SDLPowerModeStatusPostIgnition","abstract":"<p>We are in a post-ignition power situation</p>"},"Constants.html#/c:@SDLPowerModeStatusIgnitionOn":{"name":"SDLPowerModeStatusIgnitionOn","abstract":"<p>The ignition is on but the car is not yet running</p>"},"Constants.html#/c:@SDLPowerModeStatusRunning":{"name":"SDLPowerModeStatusRunning","abstract":"<p>The ignition is on and the car is running</p>"},"Constants.html#/c:@SDLPowerModeStatusCrank":{"name":"SDLPowerModeStatusCrank","abstract":"<p>We are in a crank power situation</p>"},"Constants.html#/c:@SDLPredefinedLayoutDefault":{"name":"SDLPredefinedLayoutDefault","abstract":"<p>A default layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutMedia":{"name":"SDLPredefinedLayoutMedia","abstract":"<p>The default media layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutNonMedia":{"name":"SDLPredefinedLayoutNonMedia","abstract":"<p>The default non-media layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutOnscreenPresets":{"name":"SDLPredefinedLayoutOnscreenPresets","abstract":"<p>A media layout containing preset buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationFullscreenMap":{"name":"SDLPredefinedLayoutNavigationFullscreenMap","abstract":"<p>The default navigation layout with a fullscreen map</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationList":{"name":"SDLPredefinedLayoutNavigationList","abstract":"<p>A list layout used for navigation apps</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationKeyboard":{"name":"SDLPredefinedLayoutNavigationKeyboard","abstract":"<p>A keyboard layout used for navigation apps</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithText":{"name":"SDLPredefinedLayoutGraphicWithText","abstract":"<p>A layout with a single graphic on the left and text on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextWithGraphic":{"name":"SDLPredefinedLayoutTextWithGraphic","abstract":"<p>A layout with text on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTilesOnly":{"name":"SDLPredefinedLayoutTilesOnly","abstract":"<p>A layout with only softbuttons placed in a tile layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsOnly":{"name":"SDLPredefinedLayoutTextButtonsOnly","abstract":"<p>A layout with only soft buttons that only accept text</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTiles":{"name":"SDLPredefinedLayoutGraphicWithTiles","abstract":"<p>A layout with a single graphic on the left and soft buttons in a tile layout on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTilesWithGraphic":{"name":"SDLPredefinedLayoutTilesWithGraphic","abstract":"<p>A layout with soft buttons in a tile layout on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextAndSoftButtons":{"name":"SDLPredefinedLayoutGraphicWithTextAndSoftButtons","abstract":"<p>A layout with a single graphic on the left and both text and soft buttons on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextAndSoftButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextAndSoftButtonsWithGraphic","abstract":"<p>A layout with both text and soft buttons on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextButtons":{"name":"SDLPredefinedLayoutGraphicWithTextButtons","abstract":"<p>A layout with a single graphic on the left and text-only soft buttons on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextButtonsWithGraphic","abstract":"<p>A layout with text-only soft buttons on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutLargeGraphicWithSoftButtons","abstract":"<p>A layout with a single large graphic and soft buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutDoubleGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutDoubleGraphicWithSoftButtons","abstract":"<p>A layout with two graphics and soft buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicOnly":{"name":"SDLPredefinedLayoutLargeGraphicOnly","abstract":"<p>A layout with only a single large graphic</p>"},"Constants.html#/c:@SDLPredefinedLayoutWebView":{"name":"SDLPredefinedLayoutWebView","abstract":"<p>Custom root template allowing in-vehicle WebEngine applications with"},"Constants.html#/c:@SDLPrerecordedSpeechHelp":{"name":"SDLPrerecordedSpeechHelp","abstract":"<p>A prerecorded help prompt</p>"},"Constants.html#/c:@SDLPrerecordedSpeechInitial":{"name":"SDLPrerecordedSpeechInitial","abstract":"<p>A prerecorded initial prompt</p>"},"Constants.html#/c:@SDLPrerecordedSpeechListen":{"name":"SDLPrerecordedSpeechListen","abstract":"<p>A prerecorded listen prompt is available</p>"},"Constants.html#/c:@SDLPrerecordedSpeechPositive":{"name":"SDLPrerecordedSpeechPositive","abstract":"<p>A prerecorded positive indicator noise is available</p>"},"Constants.html#/c:@SDLPrerecordedSpeechNegative":{"name":"SDLPrerecordedSpeechNegative","abstract":"<p>A prerecorded negative indicator noise is available</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceNoSourceSelected":{"name":"SDLPrimaryAudioSourceNoSourceSelected","abstract":"<p>Currently no source selected</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceUSB":{"name":"SDLPrimaryAudioSourceUSB","abstract":"<p>USB is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceUSB2":{"name":"SDLPrimaryAudioSourceUSB2","abstract":"<p>USB2 is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceBluetoothStereo":{"name":"SDLPrimaryAudioSourceBluetoothStereo","abstract":"<p>Bluetooth Stereo is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceLineIn":{"name":"SDLPrimaryAudioSourceLineIn","abstract":"<p>Line in is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceIpod":{"name":"SDLPrimaryAudioSourceIpod","abstract":"<p>iPod is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceMobileApp":{"name":"SDLPrimaryAudioSourceMobileApp","abstract":"<p>Mobile app is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceCD":{"name":"SDLPrimaryAudioSourceCD","abstract":"<p>@abstract CD is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceAM":{"name":"SDLPrimaryAudioSourceAM","abstract":"<p>@abstract Radio frequency AM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceFM":{"name":"SDLPrimaryAudioSourceFM","abstract":"<p>@abstract Radio frequency FM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceXM":{"name":"SDLPrimaryAudioSourceXM","abstract":"<p>@abstract Radio frequency XM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceDAB":{"name":"SDLPrimaryAudioSourceDAB","abstract":"<p>@abstract Radio frequency DAB is current source</p>"},"Constants.html#/c:@SDLRPCFunctionNameAddCommand":{"name":"SDLRPCFunctionNameAddCommand","abstract":"<p>Function name for an AddCommand RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAddSubMenu":{"name":"SDLRPCFunctionNameAddSubMenu","abstract":"<p>Function name for an AddSubMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAlert":{"name":"SDLRPCFunctionNameAlert","abstract":"<p>Function name for an Alert RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAlertManeuver":{"name":"SDLRPCFunctionNameAlertManeuver","abstract":"<p>Function name for an AlertManeuver RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameButtonPress":{"name":"SDLRPCFunctionNameButtonPress","abstract":"<p>Function name for a ButtonPress RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCancelInteraction":{"name":"SDLRPCFunctionNameCancelInteraction","abstract":"<p>Function name for a CancelInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameChangeRegistration":{"name":"SDLRPCFunctionNameChangeRegistration","abstract":"<p>Function name for a ChangeRegistration RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCloseApplication":{"name":"SDLRPCFunctionNameCloseApplication","abstract":"<p>Function name for a CloseApplication RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCreateInteractionChoiceSet":{"name":"SDLRPCFunctionNameCreateInteractionChoiceSet","abstract":"<p>Function name for a CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteCommand":{"name":"SDLRPCFunctionNameDeleteCommand","abstract":"<p>Function name for a DeleteCommand RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteFile":{"name":"SDLRPCFunctionNameDeleteFile","abstract":"<p>Function name for a DeleteFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteInteractionChoiceSet":{"name":"SDLRPCFunctionNameDeleteInteractionChoiceSet","abstract":"<p>Function name for a DeleteInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteSubMenu":{"name":"SDLRPCFunctionNameDeleteSubMenu","abstract":"<p>Function name for a DeleteSubMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDiagnosticMessage":{"name":"SDLRPCFunctionNameDiagnosticMessage","abstract":"<p>Function name for a DiagnosticMessage RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDialNumber":{"name":"SDLRPCFunctionNameDialNumber","abstract":"<p>Function name for a DialNumber RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameEncodedSyncPData":{"name":"SDLRPCFunctionNameEncodedSyncPData","abstract":"<p>Function name for an CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameEndAudioPassThru":{"name":"SDLRPCFunctionNameEndAudioPassThru","abstract":"<p>Function name for an EndAudioPassThru RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGenericResponse":{"name":"SDLRPCFunctionNameGenericResponse","abstract":"<p>Function name for an GenricResponse Response RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetAppServiceData":{"name":"SDLRPCFunctionNameGetAppServiceData","abstract":"<p>Function name for an CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetDTCs":{"name":"SDLRPCFunctionNameGetDTCs","abstract":"<p>Function name for a GetDTCs RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetFile":{"name":"SDLRPCFunctionNameGetFile","abstract":"<p>Function name for a GetFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetCloudAppProperties":{"name":"SDLRPCFunctionNameGetCloudAppProperties","abstract":"<p>Function name for a GetCloudAppProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetInteriorVehicleData":{"name":"SDLRPCFunctionNameGetInteriorVehicleData","abstract":"<p>Function name for a GetInteriorVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetInteriorVehicleDataConsent":{"name":"SDLRPCFunctionNameGetInteriorVehicleDataConsent","abstract":"<p>Function name for a GetInteriorVehicleDataConsent RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetSystemCapability":{"name":"SDLRPCFunctionNameGetSystemCapability","abstract":"<p>Function name for a GetSystemCapability RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetVehicleData":{"name":"SDLRPCFunctionNameGetVehicleData","abstract":"<p>Function name for a GetVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetWayPoints":{"name":"SDLRPCFunctionNameGetWayPoints","abstract":"<p>Function name for a GetWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameListFiles":{"name":"SDLRPCFunctionNameListFiles","abstract":"<p>Function name for a ListFiles RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppCapabilityUpdated":{"name":"SDLRPCFunctionNameOnAppCapabilityUpdated","abstract":"<p>Function name for an OnAppCapabilityUpdated notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppInterfaceUnregistered":{"name":"SDLRPCFunctionNameOnAppInterfaceUnregistered","abstract":"<p>Function name for an OnAppInterfaceUnregistered notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppServiceData":{"name":"SDLRPCFunctionNameOnAppServiceData","abstract":"<p>Function name for an OnAppServiceData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAudioPassThru":{"name":"SDLRPCFunctionNameOnAudioPassThru","abstract":"<p>Function name for an OnAudioPassThru notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnButtonEvent":{"name":"SDLRPCFunctionNameOnButtonEvent","abstract":"<p>Function name for an OnButtonEvent notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnButtonPress":{"name":"SDLRPCFunctionNameOnButtonPress","abstract":"<p>Function name for an OnButtonPress notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnCommand":{"name":"SDLRPCFunctionNameOnCommand","abstract":"<p>Function name for an OnCommand notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnDriverDistraction":{"name":"SDLRPCFunctionNameOnDriverDistraction","abstract":"<p>Function name for an OnDriverDistraction notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnEncodedSyncPData":{"name":"SDLRPCFunctionNameOnEncodedSyncPData","abstract":"<p>Function name for an OnEncodedSyncPData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnHashChange":{"name":"SDLRPCFunctionNameOnHashChange","abstract":"<p>Function name for an OnHashChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnHMIStatus":{"name":"SDLRPCFunctionNameOnHMIStatus","abstract":"<p>Function name for an OnHMIStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnInteriorVehicleData":{"name":"SDLRPCFunctionNameOnInteriorVehicleData","abstract":"<p>Function name for an OnInteriorVehicleData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnKeyboardInput":{"name":"SDLRPCFunctionNameOnKeyboardInput","abstract":"<p>Function name for an OnKeyboardInput notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnLanguageChange":{"name":"SDLRPCFunctionNameOnLanguageChange","abstract":"<p>Function name for an OnLanguageChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnLockScreenStatus":{"name":"SDLRPCFunctionNameOnLockScreenStatus","abstract":"<p>Function name for an OnLockScreenStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnPermissionsChange":{"name":"SDLRPCFunctionNameOnPermissionsChange","abstract":"<p>Function name for an OnPermissionsChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnRCStatus":{"name":"SDLRPCFunctionNameOnRCStatus","abstract":"<p>Function name for an OnRCStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSubtleAlertPressed":{"name":"SDLRPCFunctionNameOnSubtleAlertPressed","abstract":"<p>Function name for an SubtleAlertPressed notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSyncPData":{"name":"SDLRPCFunctionNameOnSyncPData","abstract":"<p>Function name for an OnSyncPData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSystemCapabilityUpdated":{"name":"SDLRPCFunctionNameOnSystemCapabilityUpdated","abstract":"<p>Function name for an OnSystemCapabilityUpdated notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSystemRequest":{"name":"SDLRPCFunctionNameOnSystemRequest","abstract":"<p>Function name for an OnSystemRequest notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnTBTClientState":{"name":"SDLRPCFunctionNameOnTBTClientState","abstract":"<p>Function name for an OnTBTClientState notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnTouchEvent":{"name":"SDLRPCFunctionNameOnTouchEvent","abstract":"<p>Function name for an OnTouchEvent notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnUpdateFile":{"name":"SDLRPCFunctionNameOnUpdateFile","abstract":"<p>Function name for an OnUpdateFile notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnUpdateSubMenu":{"name":"SDLRPCFunctionNameOnUpdateSubMenu","abstract":"<p>Function name for an OnUpdateSubMenu notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnVehicleData":{"name":"SDLRPCFunctionNameOnVehicleData","abstract":"<p>Function name for an OnVehicleData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnWayPointChange":{"name":"SDLRPCFunctionNameOnWayPointChange","abstract":"<p>Function name for an OnWayPointChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformAppServiceInteraction":{"name":"SDLRPCFunctionNamePerformAppServiceInteraction","abstract":"<p>Function name for a PerformAppServiceInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformAudioPassThru":{"name":"SDLRPCFunctionNamePerformAudioPassThru","abstract":"<p>Function name for a PerformAppServiceInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformInteraction":{"name":"SDLRPCFunctionNamePerformInteraction","abstract":"<p>Function name for a PerformInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePublishAppService":{"name":"SDLRPCFunctionNamePublishAppService","abstract":"<p>Function name for a PublishAppService RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePutFile":{"name":"SDLRPCFunctionNamePutFile","abstract":"<p>Function name for a PutFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReadDID":{"name":"SDLRPCFunctionNameReadDID","abstract":"<p>Function name for a ReadDID RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReleaseInteriorVehicleDataModule":{"name":"SDLRPCFunctionNameReleaseInteriorVehicleDataModule","abstract":"<p>Function name for a ReleaseInteriorVehicleDataModule RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameRegisterAppInterface":{"name":"SDLRPCFunctionNameRegisterAppInterface","abstract":"<p>Function name for a RegisterAppInterface RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReserved":{"name":"SDLRPCFunctionNameReserved","abstract":"<p>Function name for a Reserved RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameResetGlobalProperties":{"name":"SDLRPCFunctionNameResetGlobalProperties","abstract":"<p>Function name for a ResetGlobalProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameScrollableMessage":{"name":"SDLRPCFunctionNameScrollableMessage","abstract":"<p>Function name for a ScrollableMessage RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSendHapticData":{"name":"SDLRPCFunctionNameSendHapticData","abstract":"<p>Function name for a SendHapticData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSendLocation":{"name":"SDLRPCFunctionNameSendLocation","abstract":"<p>Function name for a SendLocation RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetAppIcon":{"name":"SDLRPCFunctionNameSetAppIcon","abstract":"<p>Function name for a SetAppIcon RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetCloudAppProperties":{"name":"SDLRPCFunctionNameSetCloudAppProperties","abstract":"<p>Function name for a SetCloudProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetDisplayLayout":{"name":"SDLRPCFunctionNameSetDisplayLayout","abstract":"<p>Function name for a SetDisplayLayout RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetGlobalProperties":{"name":"SDLRPCFunctionNameSetGlobalProperties","abstract":"<p>Function name for a SetGlobalProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetInteriorVehicleData":{"name":"SDLRPCFunctionNameSetInteriorVehicleData","abstract":"<p>Function name for a SetInteriorVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetMediaClockTimer":{"name":"SDLRPCFunctionNameSetMediaClockTimer","abstract":"<p>Function name for a SetMediaClockTimer RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShow":{"name":"SDLRPCFunctionNameShow","abstract":"<p>Function name for a Show RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShowAppMenu":{"name":"SDLRPCFunctionNameShowAppMenu","abstract":"<p>Function name for a ShowAppMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShowConstantTBT":{"name":"SDLRPCFunctionNameShowConstantTBT","abstract":"<p>Function name for a ShowConstantTBT RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSlider":{"name":"SDLRPCFunctionNameSlider","abstract":"<p>Function name for a Slider RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSpeak":{"name":"SDLRPCFunctionNameSpeak","abstract":"<p>Function name for a Speak RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeButton":{"name":"SDLRPCFunctionNameSubscribeButton","abstract":"<p>Function name for a SubscribeButton RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeVehicleData":{"name":"SDLRPCFunctionNameSubscribeVehicleData","abstract":"<p>Function name for a SubscribeVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeWayPoints":{"name":"SDLRPCFunctionNameSubscribeWayPoints","abstract":"<p>Function name for a SubscribeWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubtleAlert":{"name":"SDLRPCFunctionNameSubtleAlert","abstract":"<p>Function name for a SubtleAlert RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSyncPData":{"name":"SDLRPCFunctionNameSyncPData","abstract":"<p>Function name for a SyncPData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSystemRequest":{"name":"SDLRPCFunctionNameSystemRequest","abstract":"<p>Function name for a SystemRequest RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnpublishAppService":{"name":"SDLRPCFunctionNameUnpublishAppService","abstract":"<p>Function name for an UnpublishAppService RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnregisterAppInterface":{"name":"SDLRPCFunctionNameUnregisterAppInterface","abstract":"<p>Function name for an UnregisterAppInterface RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeButton":{"name":"SDLRPCFunctionNameUnsubscribeButton","abstract":"<p>Function name for an UnsubscribeButton RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeVehicleData":{"name":"SDLRPCFunctionNameUnsubscribeVehicleData","abstract":"<p>Function name for an UnsubscribeVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeWayPoints":{"name":"SDLRPCFunctionNameUnsubscribeWayPoints","abstract":"<p>Function name for an UnsubscribeWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUpdateTurnList":{"name":"SDLRPCFunctionNameUpdateTurnList","abstract":"<p>Function name for an UpdateTurnList RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCreateWindow":{"name":"SDLRPCFunctionNameCreateWindow","abstract":"<p>Function name for a CreateWindow RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteWindow":{"name":"SDLRPCFunctionNameDeleteWindow","abstract":"<p>Function name for a DeleteWindow RPC</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameRequest":{"name":"SDLRPCMessageTypeNameRequest","abstract":"<p>A request that will require a response</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameResponse":{"name":"SDLRPCMessageTypeNameResponse","abstract":"<p>A response to a request</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameNotification":{"name":"SDLRPCMessageTypeNameNotification","abstract":"<p>A message that does not have a response</p>"},"Constants.html#/c:@SDLRadioBandAM":{"name":"SDLRadioBandAM","abstract":"<p>Represents AM radio band</p>"},"Constants.html#/c:@SDLRadioBandFM":{"name":"SDLRadioBandFM","abstract":"<p>Represents FM radio band</p>"},"Constants.html#/c:@SDLRadioBandXM":{"name":"SDLRadioBandXM","abstract":"<p>Represents XM radio band</p>"},"Constants.html#/c:@SDLRadioStateAcquiring":{"name":"SDLRadioStateAcquiring","abstract":"<p>Represents Radio state as ACQUIRING</p>"},"Constants.html#/c:@SDLRadioStateAcquired":{"name":"SDLRadioStateAcquired","abstract":"<p>Represents Radio state as ACQUIRED</p>"},"Constants.html#/c:@SDLRadioStateMulticast":{"name":"SDLRadioStateMulticast","abstract":"<p>Represents Radio state as MULTICAST</p>"},"Constants.html#/c:@SDLRadioStateNotFound":{"name":"SDLRadioStateNotFound","abstract":"<p>Represents Radio state as NOT_FOUND</p>"},"Constants.html#/c:@SDLRequestTypeHTTP":{"name":"SDLRequestTypeHTTP","abstract":"<p>An HTTP request</p>"},"Constants.html#/c:@SDLRequestTypeFileResume":{"name":"SDLRequestTypeFileResume","abstract":"<p>A file resumption request</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationRequest":{"name":"SDLRequestTypeAuthenticationRequest","abstract":"<p>An authentication request</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationChallenge":{"name":"SDLRequestTypeAuthenticationChallenge","abstract":"<p>An authentication challenge</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationAck":{"name":"SDLRequestTypeAuthenticationAck","abstract":"<p>An authentication acknowledgment</p>"},"Constants.html#/c:@SDLRequestTypeProprietary":{"name":"SDLRequestTypeProprietary","abstract":"<p>An proprietary formatted request</p>"},"Constants.html#/c:@SDLRequestTypeQueryApps":{"name":"SDLRequestTypeQueryApps","abstract":"<p>An Query Apps request</p>"},"Constants.html#/c:@SDLRequestTypeLaunchApp":{"name":"SDLRequestTypeLaunchApp","abstract":"<p>A Launch Apps request</p>"},"Constants.html#/c:@SDLRequestTypeLockScreenIconURL":{"name":"SDLRequestTypeLockScreenIconURL","abstract":"<p>The URL for a lock screen icon</p>"},"Constants.html#/c:@SDLRequestTypeTrafficMessageChannel":{"name":"SDLRequestTypeTrafficMessageChannel","abstract":"<p>A traffic message channel request</p>"},"Constants.html#/c:@SDLRequestTypeDriverProfile":{"name":"SDLRequestTypeDriverProfile","abstract":"<p>A driver profile request</p>"},"Constants.html#/c:@SDLRequestTypeVoiceSearch":{"name":"SDLRequestTypeVoiceSearch","abstract":"<p>A voice search request</p>"},"Constants.html#/c:@SDLRequestTypeNavigation":{"name":"SDLRequestTypeNavigation","abstract":"<p>A navigation request</p>"},"Constants.html#/c:@SDLRequestTypePhone":{"name":"SDLRequestTypePhone","abstract":"<p>A phone request</p>"},"Constants.html#/c:@SDLRequestTypeClimate":{"name":"SDLRequestTypeClimate","abstract":"<p>A climate request</p>"},"Constants.html#/c:@SDLRequestTypeSettings":{"name":"SDLRequestTypeSettings","abstract":"<p>A settings request</p>"},"Constants.html#/c:@SDLRequestTypeVehicleDiagnostics":{"name":"SDLRequestTypeVehicleDiagnostics","abstract":"<p>A vehicle diagnostics request</p>"},"Constants.html#/c:@SDLRequestTypeEmergency":{"name":"SDLRequestTypeEmergency","abstract":"<p>An emergency request</p>"},"Constants.html#/c:@SDLRequestTypeMedia":{"name":"SDLRequestTypeMedia","abstract":"<p>A media request</p>"},"Constants.html#/c:@SDLRequestTypeFOTA":{"name":"SDLRequestTypeFOTA","abstract":"<p>A firmware over-the-air request</p>"},"Constants.html#/c:@SDLRequestTypeOEMSpecific":{"name":"SDLRequestTypeOEMSpecific","abstract":"<p>A request that is OEM specific using the <code>RequestSubType</code> in SystemRequest</p>"},"Constants.html#/c:@SDLRequestTypeIconURL":{"name":"SDLRequestTypeIconURL","abstract":"<p>A request for an icon url</p>"},"Constants.html#/c:@SDLResultSuccess":{"name":"SDLResultSuccess","abstract":"<p>The request succeeded</p>"},"Constants.html#/c:@SDLResultInvalidData":{"name":"SDLResultInvalidData","abstract":"<p>The request contained invalid data</p>"},"Constants.html#/c:@SDLResultCharacterLimitExceeded":{"name":"SDLResultCharacterLimitExceeded","abstract":"<p>The request had a string containing too many characters</p>"},"Constants.html#/c:@SDLResultUnsupportedRequest":{"name":"SDLResultUnsupportedRequest","abstract":"<p>The request is not supported by the IVI unit implementing SDL</p>"},"Constants.html#/c:@SDLResultOutOfMemory":{"name":"SDLResultOutOfMemory","abstract":"<p>The system could not process the request because the necessary memory couldn&rsquo;t be allocated</p>"},"Constants.html#/c:@SDLResultTooManyPendingRequests":{"name":"SDLResultTooManyPendingRequests","abstract":"<p>There are too many requests pending (means that the response has not been delivered yet).</p>"},"Constants.html#/c:@SDLResultInvalidId":{"name":"SDLResultInvalidId","abstract":"<p>One of the provided IDs is not valid.</p>"},"Constants.html#/c:@SDLResultDuplicateName":{"name":"SDLResultDuplicateName","abstract":"<p>The provided name or synonym is a duplicate of some already-defined name or synonym.</p>"},"Constants.html#/c:@SDLResultTooManyApplications":{"name":"SDLResultTooManyApplications","abstract":"<p>There are already too many registered applications.</p>"},"Constants.html#/c:@SDLResultApplicationRegisteredAlready":{"name":"SDLResultApplicationRegisteredAlready","abstract":"<p>RegisterAppInterface has been called, but this app is already registered</p>"},"Constants.html#/c:@SDLResultUnsupportedVersion":{"name":"SDLResultUnsupportedVersion","abstract":"<p>The Head Unit doesn&rsquo;t support the SDL version that is requested by the mobile application.</p>"},"Constants.html#/c:@SDLResultWrongLanguage":{"name":"SDLResultWrongLanguage","abstract":"<p>The requested language is currently not supported. This might be because of a mismatch of the currently active language on the head unit and the requested language.</p>"},"Constants.html#/c:@SDLResultApplicationNotRegistered":{"name":"SDLResultApplicationNotRegistered","abstract":"<p>A command can not be executed because no application has been registered with RegisterApplication.</p>"},"Constants.html#/c:@SDLResultInUse":{"name":"SDLResultInUse","abstract":"<p>The data may not be changed, because it is currently in use. For example when trying to delete a choice set that is currently involved in an interaction.</p>"},"Constants.html#/c:@SDLResultVehicleDataNotAllowed":{"name":"SDLResultVehicleDataNotAllowed","abstract":"<p>The user has turned off access to vehicle data, and it is globally unavailable to mobile applications.</p>"},"Constants.html#/c:@SDLResultVehicleDataNotAvailable":{"name":"SDLResultVehicleDataNotAvailable","abstract":"<p>The requested vehicle data is not available on this vehicle or is not published.</p>"},"Constants.html#/c:@SDLResultRejected":{"name":"SDLResultRejected","abstract":"<p>The requested command was rejected, e.g. because the mobile app is in background and cannot perform any HMI commands, or an HMI command (e.g. Speak) is rejected because a higher priority HMI command (e.g. Alert) is playing.</p>"},"Constants.html#/c:@SDLResultAborted":{"name":"SDLResultAborted","abstract":"<p>A command was aborted, e.g. due to user interaction (user pressed button), or an HMI command (e.g. Speak) is aborted because a higher priority HMI command (e.g. Alert) was requested.</p>"},"Constants.html#/c:@SDLResultIgnored":{"name":"SDLResultIgnored","abstract":"<p>A command was ignored, because the intended result is already in effect. For example, SetMediaClockTimer was used to pause the media clock although the clock is paused already.</p>"},"Constants.html#/c:@SDLResultUnsupportedResource":{"name":"SDLResultUnsupportedResource","abstract":"<p>A button that was requested for subscription is not supported under the current system.</p>"},"Constants.html#/c:@SDLResultFileNotFound":{"name":"SDLResultFileNotFound","abstract":"<p>A specified file could not be found on the head unit.</p>"},"Constants.html#/c:@SDLResultGenericError":{"name":"SDLResultGenericError","abstract":"<p>Provided data is valid but something went wrong in the lower layers.</p>"},"Constants.html#/c:@SDLResultDisallowed":{"name":"SDLResultDisallowed","abstract":"<p>RPC is not authorized in local policy table.</p>"},"Constants.html#/c:@SDLResultUserDisallowed":{"name":"SDLResultUserDisallowed","abstract":"<p>RPC is included in a functional group explicitly blocked by the user.</p>"},"Constants.html#/c:@SDLResultTimedOut":{"name":"SDLResultTimedOut","abstract":"<p>Overlay reached the maximum timeout and closed.</p>"},"Constants.html#/c:@SDLResultCancelRoute":{"name":"SDLResultCancelRoute","abstract":"<p>User selected to Cancel Route.</p>"},"Constants.html#/c:@SDLResultCorruptedData":{"name":"SDLResultCorruptedData","abstract":"<p>The data sent failed to pass CRC check in receiver end.</p>"},"Constants.html#/c:@SDLResultTruncatedData":{"name":"SDLResultTruncatedData","abstract":"<p>The RPC (e.g. ReadDID) executed successfully but the data exceeded the platform maximum threshold and thus, only part of the data is available.</p>"},"Constants.html#/c:@SDLResultRetry":{"name":"SDLResultRetry","abstract":"<p>The user interrupted the RPC (e.g. PerformAudioPassThru) and indicated to start over. Note, the app must issue the new RPC.</p>"},"Constants.html#/c:@SDLResultWarnings":{"name":"SDLResultWarnings","abstract":"<p>The RPC (e.g. SubscribeVehicleData) executed successfully but one or more items have a warning or failure.</p>"},"Constants.html#/c:@SDLResultSaved":{"name":"SDLResultSaved","abstract":"<p>The RPC (e.g. Slider) executed successfully and the user elected to save the current position / value.</p>"},"Constants.html#/c:@SDLResultInvalidCertificate":{"name":"SDLResultInvalidCertificate","abstract":"<p>The certificate provided during authentication is invalid.</p>"},"Constants.html#/c:@SDLResultExpiredCertificate":{"name":"SDLResultExpiredCertificate","abstract":"<p>The certificate provided during authentication is expired.</p>"},"Constants.html#/c:@SDLResultResumeFailed":{"name":"SDLResultResumeFailed","abstract":"<p>The provided hash ID does not match the hash of the current set of registered data or the core could not resume the previous data.</p>"},"Constants.html#/c:@SDLResultDataNotAvailable":{"name":"SDLResultDataNotAvailable","abstract":"<p>The requested data is not available on this vehicle or is not published for the connected app.</p>"},"Constants.html#/c:@SDLResultReadOnly":{"name":"SDLResultReadOnly","abstract":"<p>The requested data is read only thus cannot be change via remote control .</p>"},"Constants.html#/c:@SDLResultEncryptionNeeded":{"name":"SDLResultEncryptionNeeded","abstract":"<p>The RPC request needs to be encrypted.</p>"},"Constants.html#/c:@SDLSamplingRate8KHZ":{"name":"SDLSamplingRate8KHZ","abstract":"<p>Sampling rate of 8 kHz</p>"},"Constants.html#/c:@SDLSamplingRate16KHZ":{"name":"SDLSamplingRate16KHZ","abstract":"<p>Sampling rate of 16 kHz</p>"},"Constants.html#/c:@SDLSamplingRate22KHZ":{"name":"SDLSamplingRate22KHZ","abstract":"<p>Sampling rate of 22 kHz</p>"},"Constants.html#/c:@SDLSamplingRate44KHZ":{"name":"SDLSamplingRate44KHZ","abstract":"<p>Sampling rate of 44 kHz</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeSave":{"name":"SDLSeatMemoryActionTypeSave","abstract":"<p>@abstract Save current seat positions and settings to seat memory.</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeRestore":{"name":"SDLSeatMemoryActionTypeRestore","abstract":"<p>@abstract Restore / apply the seat memory settings to the current seat.</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeNone":{"name":"SDLSeatMemoryActionTypeNone","abstract":"<p>@abstract No action to be performed.</p>"},"Constants.html#/c:@SDLSeekIndicatorTypeTrack":{"name":"SDLSeekIndicatorTypeTrack","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLSeekIndicatorTypeTime":{"name":"SDLSeekIndicatorTypeTime","abstract":"<p>Undocumented</p>"},"Constants.html#/c:@SDLServiceUpdateReasonPublished":{"name":"SDLServiceUpdateReasonPublished","abstract":"<p>The service has just been published with the module and once activated to the primary service of its type, it will be ready for possible consumption.</p>"},"Constants.html#/c:@SDLServiceUpdatePublished":{"name":"SDLServiceUpdatePublished","abstract":"<p>The service has just been published with the module and once activated to the primary service of its type, it will be ready for possible consumption.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonRemoved":{"name":"SDLServiceUpdateReasonRemoved","abstract":"<p>The service has just been unpublished with the module and is no longer accessible.</p>"},"Constants.html#/c:@SDLServiceUpdateRemoved":{"name":"SDLServiceUpdateRemoved","abstract":"<p>The service has just been unpublished with the module and is no longer accessible.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonActivated":{"name":"SDLServiceUpdateReasonActivated","abstract":"<p>The service is activated as the primary service of this type. All requests dealing with this service type will be handled by this service.</p>"},"Constants.html#/c:@SDLServiceUpdateActivated":{"name":"SDLServiceUpdateActivated","abstract":"<p>The service is activated as the primary service of this type. All requests dealing with this service type will be handled by this service.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonDeactivated":{"name":"SDLServiceUpdateReasonDeactivated","abstract":"<p>The service has been deactivated as the primary service of its type.</p>"},"Constants.html#/c:@SDLServiceUpdateDeactivated":{"name":"SDLServiceUpdateDeactivated","abstract":"<p>The service has been deactivated as the primary service of its type.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonManifestUpdate":{"name":"SDLServiceUpdateReasonManifestUpdate","abstract":"<p>The service has updated its manifest. This could imply updated capabilities.</p>"},"Constants.html#/c:@SDLServiceUpdateManifestUpdate":{"name":"SDLServiceUpdateManifestUpdate","abstract":"<p>The service has updated its manifest. This could imply updated capabilities.</p>"},"Constants.html#/c:@SDLSoftButtonTypeText":{"name":"SDLSoftButtonTypeText","abstract":"<p>Text kind Softbutton</p>"},"Constants.html#/c:@SDLSoftButtonTypeImage":{"name":"SDLSoftButtonTypeImage","abstract":"<p>Image kind Softbutton</p>"},"Constants.html#/c:@SDLSoftButtonTypeBoth":{"name":"SDLSoftButtonTypeBoth","abstract":"<p>Both (Text &amp; Image) kind Softbutton</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesText":{"name":"SDLSpeechCapabilitiesText","abstract":"<p>The SDL platform can speak text phrases.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesSAPIPhonemes":{"name":"SDLSpeechCapabilitiesSAPIPhonemes","abstract":"<p>The SDL platform can speak SAPI Phonemes.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesLHPlusPhonemes":{"name":"SDLSpeechCapabilitiesLHPlusPhonemes","abstract":"<p>The SDL platform can speak LHPlus Phonemes.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesPrerecorded":{"name":"SDLSpeechCapabilitiesPrerecorded","abstract":"<p>The SDL platform can speak Prerecorded indicators and prompts.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesSilence":{"name":"SDLSpeechCapabilitiesSilence","abstract":"<p>The SDL platform can speak Silence.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesFile":{"name":"SDLSpeechCapabilitiesFile","abstract":"<p>The SDL platform can play a file</p>"},"Constants.html#/c:@SDLStaticIconNameAcceptCall":{"name":"SDLStaticIconNameAcceptCall","abstract":"<p>Static icon accept call / active phone call in progress / initiate a phone call</p>"},"Constants.html#/c:@SDLStaticIconNameAddWaypoint":{"name":"SDLStaticIconNameAddWaypoint","abstract":"<p>Static icon add waypoint</p>"},"Constants.html#/c:@SDLStaticIconNameAlbum":{"name":"SDLStaticIconNameAlbum","abstract":"<p>Static icon album</p>"},"Constants.html#/c:@SDLStaticIconNameAmbientLighting":{"name":"SDLStaticIconNameAmbientLighting","abstract":"<p>Static icon ambient lighting</p>"},"Constants.html#/c:@SDLStaticIconNameArrowNorth":{"name":"SDLStaticIconNameArrowNorth","abstract":"<p>Static icon arrow - north</p>"},"Constants.html#/c:@SDLStaticIconNameAudioMute":{"name":"SDLStaticIconNameAudioMute","abstract":"<p>Static icon audio mute</p>"},"Constants.html#/c:@SDLStaticIconNameAudiobookEpisode":{"name":"SDLStaticIconNameAudiobookEpisode","abstract":"<p>Static icon audiobook episode</p>"},"Constants.html#/c:@SDLStaticIconNameAudiobookNarrator":{"name":"SDLStaticIconNameAudiobookNarrator","abstract":"<p>Static icon audiobook narrator</p>"},"Constants.html#/c:@SDLStaticIconNameAuxillaryAudio":{"name":"SDLStaticIconNameAuxillaryAudio","abstract":"<p>Static icon auxiliary audio</p>"},"Constants.html#/c:@SDLStaticIconNameAuxiliaryAudio":{"name":"SDLStaticIconNameAuxiliaryAudio","abstract":"<p>Static icon auxiliary audio</p>"},"Constants.html#/c:@SDLStaticIconNameBack":{"name":"SDLStaticIconNameBack","abstract":"<p>Static icon back / return</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity0Of5":{"name":"SDLStaticIconNameBatteryCapacity0Of5","abstract":"<p>Static icon battery capacity 0 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity1Of5":{"name":"SDLStaticIconNameBatteryCapacity1Of5","abstract":"<p>Static icon battery capacity 1 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity2Of5":{"name":"SDLStaticIconNameBatteryCapacity2Of5","abstract":"<p>Static icon battery capacity 2 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity3Of5":{"name":"SDLStaticIconNameBatteryCapacity3Of5","abstract":"<p>Static icon battery capacity 3 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity4Of5":{"name":"SDLStaticIconNameBatteryCapacity4Of5","abstract":"<p>Static icon battery capacity 4 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity5Of5":{"name":"SDLStaticIconNameBatteryCapacity5Of5","abstract":"<p>Static icon battery capacity 5 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBluetoothAudioSource":{"name":"SDLStaticIconNameBluetoothAudioSource","abstract":"<p>Static icon bluetooth audio source</p>"},"Constants.html#/c:@SDLStaticIconNameBluetooth1":{"name":"SDLStaticIconNameBluetooth1","abstract":"<p>Static icon bluetooth1</p>"},"Constants.html#/c:@SDLStaticIconNameBluetooth2":{"name":"SDLStaticIconNameBluetooth2","abstract":"<p>Static icon bluetooth2</p>"},"Constants.html#/c:@SDLStaticIconNameBrowse":{"name":"SDLStaticIconNameBrowse","abstract":"<p>Static icon browse</p>"},"Constants.html#/c:@SDLStaticIconNameCellPhoneInRoamingMode":{"name":"SDLStaticIconNameCellPhoneInRoamingMode","abstract":"<p>Static icon cell phone in roaming mode</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength0Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength0Of5Bars","abstract":"<p>Static icon cell service signal strength 0 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength1Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength1Of5Bars","abstract":"<p>Static icon cell service signal strength 1 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength2Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength2Of5Bars","abstract":"<p>Static icon cell service signal strength 2 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength3Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength3Of5Bars","abstract":"<p>Static icon cell service signal strength 3 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength4Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength4Of5Bars","abstract":"<p>Static icon cell service signal strength 4 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength5Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength5Of5Bars","abstract":"<p>Static icon cell service signal strength 5 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameChangeLaneLeft":{"name":"SDLStaticIconNameChangeLaneLeft","abstract":"<p>Static icon change lane left</p>"},"Constants.html#/c:@SDLStaticIconNameChangeLaneRight":{"name":"SDLStaticIconNameChangeLaneRight","abstract":"<p>Static icon change lane right</p>"},"Constants.html#/c:@SDLStaticIconNameCheckBoxChecked":{"name":"SDLStaticIconNameCheckBoxChecked","abstract":"<p>Static icon check box checked</p>"},"Constants.html#/c:@SDLStaticIconNameCheckBoxUnchecked":{"name":"SDLStaticIconNameCheckBoxUnchecked","abstract":"<p>Static icon check box unchecked</p>"},"Constants.html#/c:@SDLStaticIconNameClimate":{"name":"SDLStaticIconNameClimate","abstract":"<p>Static icon climate</p>"},"Constants.html#/c:@SDLStaticIconNameClock":{"name":"SDLStaticIconNameClock","abstract":"<p>Static icon clock</p>"},"Constants.html#/c:@SDLStaticIconNameCompose":{"name":"SDLStaticIconNameCompose","abstract":"<p>Static icon compose (e.g. message)</p>"},"Constants.html#/c:@SDLStaticIconNameContact":{"name":"SDLStaticIconNameContact","abstract":"<p>Static icon contact / person</p>"},"Constants.html#/c:@SDLStaticIconNameContinue":{"name":"SDLStaticIconNameContinue","abstract":"<p>Static icon continue</p>"},"Constants.html#/c:@SDLStaticIconNameDash":{"name":"SDLStaticIconNameDash","abstract":"<p>Static icon dash / bullet point</p>"},"Constants.html#/c:@SDLStaticIconNameDate":{"name":"SDLStaticIconNameDate","abstract":"<p>Static icon date / calendar</p>"},"Constants.html#/c:@SDLStaticIconNameDelete":{"name":"SDLStaticIconNameDelete","abstract":"<p>Static icon delete/remove - trash</p>"},"Constants.html#/c:@SDLStaticIconNameDestination":{"name":"SDLStaticIconNameDestination","abstract":"<p>Static icon destination</p>"},"Constants.html#/c:@SDLStaticIconNameDestinationFerryAhead":{"name":"SDLStaticIconNameDestinationFerryAhead","abstract":"<p>Static icon destination ferry ahead</p>"},"Constants.html#/c:@SDLStaticIconNameEbookmark":{"name":"SDLStaticIconNameEbookmark","abstract":"<p>Static icon ebookmark (e.g. message, feed)</p>"},"Constants.html#/c:@SDLStaticIconNameEmpty":{"name":"SDLStaticIconNameEmpty","abstract":"<p>Static icon empty (i.e. no image)</p>"},"Constants.html#/c:@SDLStaticIconNameEndCall":{"name":"SDLStaticIconNameEndCall","abstract":"<p>Static icon end call / reject call</p>"},"Constants.html#/c:@SDLStaticIconNameFail":{"name":"SDLStaticIconNameFail","abstract":"<p>Static icon fail / X</p>"},"Constants.html#/c:@SDLStaticIconNameFastForward30Secs":{"name":"SDLStaticIconNameFastForward30Secs","abstract":"<p>Static icon fast forward 30 secs</p>"},"Constants.html#/c:@SDLStaticIconNameFavoriteHeart":{"name":"SDLStaticIconNameFavoriteHeart","abstract":"<p>Static icon favorite / heart</p>"},"Constants.html#/c:@SDLStaticIconNameFavoriteStar":{"name":"SDLStaticIconNameFavoriteStar","abstract":"<p>Static icon favorite / star</p>"},"Constants.html#/c:@SDLStaticIconNameFaxNumber":{"name":"SDLStaticIconNameFaxNumber","abstract":"<p>Static icon fax number</p>"},"Constants.html#/c:@SDLStaticIconNameFilename":{"name":"SDLStaticIconNameFilename","abstract":"<p>Static icon filename</p>"},"Constants.html#/c:@SDLStaticIconNameFilter":{"name":"SDLStaticIconNameFilter","abstract":"<p>Static icon filter / search</p>"},"Constants.html#/c:@SDLStaticIconNameFolder":{"name":"SDLStaticIconNameFolder","abstract":"<p>Static icon folder</p>"},"Constants.html#/c:@SDLStaticIconNameFuelPrices":{"name":"SDLStaticIconNameFuelPrices","abstract":"<p>Static icon fuel prices</p>"},"Constants.html#/c:@SDLStaticIconNameFullMap":{"name":"SDLStaticIconNameFullMap","abstract":"<p>Static icon full map</p>"},"Constants.html#/c:@SDLStaticIconNameGenericPhoneNumber":{"name":"SDLStaticIconNameGenericPhoneNumber","abstract":"<p>Static icon generic phone number</p>"},"Constants.html#/c:@SDLStaticIconNameGenre":{"name":"SDLStaticIconNameGenre","abstract":"<p>Static icon genre</p>"},"Constants.html#/c:@SDLStaticIconNameGlobalKeyboard":{"name":"SDLStaticIconNameGlobalKeyboard","abstract":"<p>Static icon global keyboard</p>"},"Constants.html#/c:@SDLStaticIconNameHighwayExitInformation":{"name":"SDLStaticIconNameHighwayExitInformation","abstract":"<p>Static icon highway exit information</p>"},"Constants.html#/c:@SDLStaticIconNameHomePhoneNumber":{"name":"SDLStaticIconNameHomePhoneNumber","abstract":"<p>Static icon home phone number</p>"},"Constants.html#/c:@SDLStaticIconNameHyperlink":{"name":"SDLStaticIconNameHyperlink","abstract":"<p>Static icon hyperlink</p>"},"Constants.html#/c:@SDLStaticIconNameID3TagUnknown":{"name":"SDLStaticIconNameID3TagUnknown","abstract":"<p>Static icon ID3 tag unknown</p>"},"Constants.html#/c:@SDLStaticIconNameIncomingCalls":{"name":"SDLStaticIconNameIncomingCalls","abstract":"<p>Static icon incoming calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNameInformation":{"name":"SDLStaticIconNameInformation","abstract":"<p>Static icon information</p>"},"Constants.html#/c:@SDLStaticIconNameIPodMediaSource":{"name":"SDLStaticIconNameIPodMediaSource","abstract":"<p>Static icon IPOD media source</p>"},"Constants.html#/c:@SDLStaticIconNameJoinCalls":{"name":"SDLStaticIconNameJoinCalls","abstract":"<p>Static icon join calls</p>"},"Constants.html#/c:@SDLStaticIconNameKeepLeft":{"name":"SDLStaticIconNameKeepLeft","abstract":"<p>Static icon keep left</p>"},"Constants.html#/c:@SDLStaticIconNameKeepRight":{"name":"SDLStaticIconNameKeepRight","abstract":"<p>Static icon keep right</p>"},"Constants.html#/c:@SDLStaticIconNameKey":{"name":"SDLStaticIconNameKey","abstract":"<p>Static icon key / keycode</p>"},"Constants.html#/c:@SDLStaticIconNameLeft":{"name":"SDLStaticIconNameLeft","abstract":"<p>Static icon left</p>"},"Constants.html#/c:@SDLStaticIconNameLeftArrow":{"name":"SDLStaticIconNameLeftArrow","abstract":"<p>Static icon left arrow / back</p>"},"Constants.html#/c:@SDLStaticIconNameLeftExit":{"name":"SDLStaticIconNameLeftExit","abstract":"<p>Static icon left exit</p>"},"Constants.html#/c:@SDLStaticIconNameLineInAudioSource":{"name":"SDLStaticIconNameLineInAudioSource","abstract":"<p>Static icon LINE IN audio source</p>"},"Constants.html#/c:@SDLStaticIconNameLocked":{"name":"SDLStaticIconNameLocked","abstract":"<p>Static icon locked</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlLeftArrow":{"name":"SDLStaticIconNameMediaControlLeftArrow","abstract":"<p>Static icon media control - left arrow</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlRecording":{"name":"SDLStaticIconNameMediaControlRecording","abstract":"<p>Static icon media control - recording</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlRightArrow":{"name":"SDLStaticIconNameMediaControlRightArrow","abstract":"<p>Static icon media control - right arrow</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlStop":{"name":"SDLStaticIconNameMediaControlStop","abstract":"<p>Static icon media control - stop (e.g. streaming)</p>"},"Constants.html#/c:@SDLStaticIconNameMicrophone":{"name":"SDLStaticIconNameMicrophone","abstract":"<p>Static icon microphone</p>"},"Constants.html#/c:@SDLStaticIconNameMissedCalls":{"name":"SDLStaticIconNameMissedCalls","abstract":"<p>Static icon missed calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNameMobilePhoneNumber":{"name":"SDLStaticIconNameMobilePhoneNumber","abstract":"<p>Static icon mobile phone number</p>"},"Constants.html#/c:@SDLStaticIconNameMoveDown":{"name":"SDLStaticIconNameMoveDown","abstract":"<p>Static icon move down / download</p>"},"Constants.html#/c:@SDLStaticIconNameMoveUp":{"name":"SDLStaticIconNameMoveUp","abstract":"<p>Static icon move up</p>"},"Constants.html#/c:@SDLStaticIconNameMP3TagArtist":{"name":"SDLStaticIconNameMP3TagArtist","abstract":"<p>Static icon MP3 tag artist</p>"},"Constants.html#/c:@SDLStaticIconNameNavigation":{"name":"SDLStaticIconNameNavigation","abstract":"<p>Static icon navigation / navigation settings</p>"},"Constants.html#/c:@SDLStaticIconNameNavigationCurrentDirection":{"name":"SDLStaticIconNameNavigationCurrentDirection","abstract":"<p>Static icon navigation current direction</p>"},"Constants.html#/c:@SDLStaticIconNameNegativeRatingThumbsDown":{"name":"SDLStaticIconNameNegativeRatingThumbsDown","abstract":"<p>Static icon negative rating - thumbs down</p>"},"Constants.html#/c:@SDLStaticIconNameNew":{"name":"SDLStaticIconNameNew","abstract":"<p>Static icon new/unread text message/email</p>"},"Constants.html#/c:@SDLStaticIconNameOfficePhoneNumber":{"name":"SDLStaticIconNameOfficePhoneNumber","abstract":"<p>Static icon office phone number / work phone number</p>"},"Constants.html#/c:@SDLStaticIconNameOpened":{"name":"SDLStaticIconNameOpened","abstract":"<p>Static icon opened/read text message/email</p>"},"Constants.html#/c:@SDLStaticIconNameOrigin":{"name":"SDLStaticIconNameOrigin","abstract":"<p>Static icon origin / nearby locale / current position</p>"},"Constants.html#/c:@SDLStaticIconNameOutgoingCalls":{"name":"SDLStaticIconNameOutgoingCalls","abstract":"<p>Static icon outgoing calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNamePause":{"name":"SDLStaticIconNamePause","abstract":"<p>Static icon play / pause - pause active</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneCall1":{"name":"SDLStaticIconNamePhoneCall1","abstract":"<p>Static icon phone call 1</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneCall2":{"name":"SDLStaticIconNamePhoneCall2","abstract":"<p>Static icon phone call 2</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneDevice":{"name":"SDLStaticIconNamePhoneDevice","abstract":"<p>Static icon phone device</p>"},"Constants.html#/c:@SDLStaticIconNamePhonebook":{"name":"SDLStaticIconNamePhonebook","abstract":"<p>Static icon phonebook</p>"},"Constants.html#/c:@SDLStaticIconNamePhoto":{"name":"SDLStaticIconNamePhoto","abstract":"<p>Static icon photo / picture</p>"},"Constants.html#/c:@SDLStaticIconNamePlay":{"name":"SDLStaticIconNamePlay","abstract":"<p>Static icon play / pause - play active</p>"},"Constants.html#/c:@SDLStaticIconNamePlaylist":{"name":"SDLStaticIconNamePlaylist","abstract":"<p>Static icon playlist</p>"},"Constants.html#/c:@SDLStaticIconNamePopUp":{"name":"SDLStaticIconNamePopUp","abstract":"<p>Static icon pop-up</p>"},"Constants.html#/c:@SDLStaticIconNamePositiveRatingThumbsUp":{"name":"SDLStaticIconNamePositiveRatingThumbsUp","abstract":"<p>Static icon positive rating - thumbs up</p>"},"Constants.html#/c:@SDLStaticIconNamePower":{"name":"SDLStaticIconNamePower","abstract":"<p>Static icon power</p>"},"Constants.html#/c:@SDLStaticIconNamePrimaryPhone":{"name":"SDLStaticIconNamePrimaryPhone","abstract":"<p>Static icon primary phone (favorite)</p>"},"Constants.html#/c:@SDLStaticIconNameRadioButtonChecked":{"name":"SDLStaticIconNameRadioButtonChecked","abstract":"<p>Static icon radio button checked</p>"},"Constants.html#/c:@SDLStaticIconNameRadioButtonUnchecked":{"name":"SDLStaticIconNameRadioButtonUnchecked","abstract":"<p>Static icon radio button unchecked</p>"},"Constants.html#/c:@SDLStaticIconNameRecentCalls":{"name":"SDLStaticIconNameRecentCalls","abstract":"<p>Static icon recent calls / history</p>"},"Constants.html#/c:@SDLStaticIconNameRecentDestinations":{"name":"SDLStaticIconNameRecentDestinations","abstract":"<p>Static icon recent destinations</p>"},"Constants.html#/c:@SDLStaticIconNameRedo":{"name":"SDLStaticIconNameRedo","abstract":"<p>Static icon redo</p>"},"Constants.html#/c:@SDLStaticIconNameRefresh":{"name":"SDLStaticIconNameRefresh","abstract":"<p>Static icon refresh</p>"},"Constants.html#/c:@SDLStaticIconNameRemoteDiagnosticsCheckEngine":{"name":"SDLStaticIconNameRemoteDiagnosticsCheckEngine","abstract":"<p>Static icon remote diagnostics - check engine</p>"},"Constants.html#/c:@SDLStaticIconNameRendered911Assist":{"name":"SDLStaticIconNameRendered911Assist","abstract":"<p>Static icon rendered 911 assist / emergency assistance</p>"},"Constants.html#/c:@SDLStaticIconNameRepeat":{"name":"SDLStaticIconNameRepeat","abstract":"<p>Static icon repeat</p>"},"Constants.html#/c:@SDLStaticIconNameRepeatPlay":{"name":"SDLStaticIconNameRepeatPlay","abstract":"<p>Static icon repeat play</p>"},"Constants.html#/c:@SDLStaticIconNameReply":{"name":"SDLStaticIconNameReply","abstract":"<p>Static icon reply</p>"},"Constants.html#/c:@SDLStaticIconNameRewind30Secs":{"name":"SDLStaticIconNameRewind30Secs","abstract":"<p>Static icon rewind 30 secs</p>"},"Constants.html#/c:@SDLStaticIconNameRight":{"name":"SDLStaticIconNameRight","abstract":"<p>Static icon right</p>"},"Constants.html#/c:@SDLStaticIconNameRightExit":{"name":"SDLStaticIconNameRightExit","abstract":"<p>Static icon right exit</p>"},"Constants.html#/c:@SDLStaticIconNameRingtones":{"name":"SDLStaticIconNameRingtones","abstract":"<p>Static icon ringtones</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand1":{"name":"SDLStaticIconNameRoundaboutLeftHand1","abstract":"<p>Static icon roundabout left hand 1</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand2":{"name":"SDLStaticIconNameRoundaboutLeftHand2","abstract":"<p>Static icon roundabout left hand 2</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand3":{"name":"SDLStaticIconNameRoundaboutLeftHand3","abstract":"<p>Static icon roundabout left hand 3</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand4":{"name":"SDLStaticIconNameRoundaboutLeftHand4","abstract":"<p>Static icon roundabout left hand 4</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand5":{"name":"SDLStaticIconNameRoundaboutLeftHand5","abstract":"<p>Static icon roundabout left hand 5</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand6":{"name":"SDLStaticIconNameRoundaboutLeftHand6","abstract":"<p>Static icon roundabout left hand 6</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand7":{"name":"SDLStaticIconNameRoundaboutLeftHand7","abstract":"<p>Static icon roundabout left hand 7</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand1":{"name":"SDLStaticIconNameRoundaboutRightHand1","abstract":"<p>Static icon roundabout right hand 1</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand2":{"name":"SDLStaticIconNameRoundaboutRightHand2","abstract":"<p>Static icon roundabout right hand 2</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand3":{"name":"SDLStaticIconNameRoundaboutRightHand3","abstract":"<p>Static icon roundabout right hand 3</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand4":{"name":"SDLStaticIconNameRoundaboutRightHand4","abstract":"<p>Static icon roundabout right hand 4</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand5":{"name":"SDLStaticIconNameRoundaboutRightHand5","abstract":"<p>Static icon roundabout right hand 5</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand6":{"name":"SDLStaticIconNameRoundaboutRightHand6","abstract":"<p>Static icon roundabout right hand 6</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand7":{"name":"SDLStaticIconNameRoundaboutRightHand7","abstract":"<p>Static icon roundabout right hand 7</p>"},"Constants.html#/c:@SDLStaticIconNameRSS":{"name":"SDLStaticIconNameRSS","abstract":"<p>Static icon RSS</p>"},"Constants.html#/c:@SDLStaticIconNameSettings":{"name":"SDLStaticIconNameSettings","abstract":"<p>Static icon settings / menu</p>"},"Constants.html#/c:@SDLStaticIconNameSharpLeft":{"name":"SDLStaticIconNameSharpLeft","abstract":"<p>Static icon sharp left</p>"},"Constants.html#/c:@SDLStaticIconNameSharpRight":{"name":"SDLStaticIconNameSharpRight","abstract":"<p>Static icon sharp right</p>"},"Constants.html#/c:@SDLStaticIconNameShow":{"name":"SDLStaticIconNameShow","abstract":"<p>Static icon show</p>"},"Constants.html#/c:@SDLStaticIconNameShufflePlay":{"name":"SDLStaticIconNameShufflePlay","abstract":"<p>Static icon shuffle play</p>"},"Constants.html#/c:@SDLStaticIconNameSkiPlaces":{"name":"SDLStaticIconNameSkiPlaces","abstract":"<p>Static icon ski places / elevation / altitude</p>"},"Constants.html#/c:@SDLStaticIconNameSlightLeft":{"name":"SDLStaticIconNameSlightLeft","abstract":"<p>Static icon slight left</p>"},"Constants.html#/c:@SDLStaticIconNameSlightRight":{"name":"SDLStaticIconNameSlightRight","abstract":"<p>Static icon slight right</p>"},"Constants.html#/c:@SDLStaticIconNameSmartphone":{"name":"SDLStaticIconNameSmartphone","abstract":"<p>Static icon smartphone</p>"},"Constants.html#/c:@SDLStaticIconNameSortList":{"name":"SDLStaticIconNameSortList","abstract":"<p>Static icon sort list</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber0":{"name":"SDLStaticIconNameSpeedDialNumbersNumber0","abstract":"<p>Static icon speed dial numbers - number 0</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber1":{"name":"SDLStaticIconNameSpeedDialNumbersNumber1","abstract":"<p>Static icon speed dial numbers - number 1</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber2":{"name":"SDLStaticIconNameSpeedDialNumbersNumber2","abstract":"<p>Static icon speed dial numbers - number 2</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber3":{"name":"SDLStaticIconNameSpeedDialNumbersNumber3","abstract":"<p>Static icon speed dial numbers - number 3</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber4":{"name":"SDLStaticIconNameSpeedDialNumbersNumber4","abstract":"<p>Static icon speed dial numbers - number 4</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber5":{"name":"SDLStaticIconNameSpeedDialNumbersNumber5","abstract":"<p>Static icon speed dial numbers - number 5</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber6":{"name":"SDLStaticIconNameSpeedDialNumbersNumber6","abstract":"<p>Static icon speed dial numbers - number 6</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber7":{"name":"SDLStaticIconNameSpeedDialNumbersNumber7","abstract":"<p>Static icon speed dial numbers - number 7</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber8":{"name":"SDLStaticIconNameSpeedDialNumbersNumber8","abstract":"<p>Static icon speed dial numbers - number 8</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber9":{"name":"SDLStaticIconNameSpeedDialNumbersNumber9","abstract":"<p>Static icon speed dial numbers - number 9</p>"},"Constants.html#/c:@SDLStaticIconNameSuccess":{"name":"SDLStaticIconNameSuccess","abstract":"<p>Static icon success / check</p>"},"Constants.html#/c:@SDLStaticIconNameTrackTitle":{"name":"SDLStaticIconNameTrackTitle","abstract":"<p>Static icon track title / song title</p>"},"Constants.html#/c:@SDLStaticIconNameTrafficReport":{"name":"SDLStaticIconNameTrafficReport","abstract":"<p>Static icon traffic report</p>"},"Constants.html#/c:@SDLStaticIconNameTurnList":{"name":"SDLStaticIconNameTurnList","abstract":"<p>Static icon turn list</p>"},"Constants.html#/c:@SDLStaticIconNameUTurnLeftTraffic":{"name":"SDLStaticIconNameUTurnLeftTraffic","abstract":"<p>Static icon u-turn left traffic</p>"},"Constants.html#/c:@SDLStaticIconNameUTurnRightTraffic":{"name":"SDLStaticIconNameUTurnRightTraffic","abstract":"<p>Static icon u-turn right traffic</p>"},"Constants.html#/c:@SDLStaticIconNameUndo":{"name":"SDLStaticIconNameUndo","abstract":"<p>Static icon undo</p>"},"Constants.html#/c:@SDLStaticIconNameUnlocked":{"name":"SDLStaticIconNameUnlocked","abstract":"<p>Static icon unlocked</p>"},"Constants.html#/c:@SDLStaticIconNameUSBMediaAudioSource":{"name":"SDLStaticIconNameUSBMediaAudioSource","abstract":"<p>Static icon USB media audio source</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo1":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo1","abstract":"<p>Static icon voice control scrollbar - list item no. 1</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo2":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo2","abstract":"<p>Static icon voice control scrollbar - list item no. 2</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo3":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo3","abstract":"<p>Static icon voice control scrollbar - list item no. 3</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo4":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo4","abstract":"<p>Static icon voice control scrollbar - list item no. 4</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionFailed":{"name":"SDLStaticIconNameVoiceRecognitionFailed","abstract":"<p>Static icon voice recognition - failed</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionPause":{"name":"SDLStaticIconNameVoiceRecognitionPause","abstract":"<p>Static icon voice recognition - pause</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSuccessful":{"name":"SDLStaticIconNameVoiceRecognitionSuccessful","abstract":"<p>Static icon voice recognition - successful</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemActive":{"name":"SDLStaticIconNameVoiceRecognitionSystemActive","abstract":"<p>Static icon voice recognition - system active</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemListening":{"name":"SDLStaticIconNameVoiceRecognitionSystemListening","abstract":"<p>Static icon voice recognition - system listening</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionTryAgain":{"name":"SDLStaticIconNameVoiceRecognitionTryAgain","abstract":"<p>Static icon voice recognition - try again</p>"},"Constants.html#/c:@SDLStaticIconNameWarning":{"name":"SDLStaticIconNameWarning","abstract":"<p>Static icon warning / safety alert</p>"},"Constants.html#/c:@SDLStaticIconNameWeather":{"name":"SDLStaticIconNameWeather","abstract":"<p>Static icon weather</p>"},"Constants.html#/c:@SDLStaticIconNameWifiFull":{"name":"SDLStaticIconNameWifiFull","abstract":"<p>Static icon wifi full</p>"},"Constants.html#/c:@SDLStaticIconNameZoomIn":{"name":"SDLStaticIconNameZoomIn","abstract":"<p>Static icon zoom in</p>"},"Constants.html#/c:@SDLStaticIconNameZoomOut":{"name":"SDLStaticIconNameZoomOut","abstract":"<p>Static icon zoom out</p>"},"Constants.html#/c:@SDLVideoStreamDidStartNotification":{"name":"SDLVideoStreamDidStartNotification","abstract":"<p>Name of video stream start notification</p>"},"Constants.html#/c:@SDLVideoStreamDidStopNotification":{"name":"SDLVideoStreamDidStopNotification","abstract":"<p>Name of video stream stop notification</p>"},"Constants.html#/c:@SDLVideoStreamSuspendedNotification":{"name":"SDLVideoStreamSuspendedNotification","abstract":"<p>Name of video stream suspended notification</p>"},"Constants.html#/c:@SDLAudioStreamDidStartNotification":{"name":"SDLAudioStreamDidStartNotification","abstract":"<p>Name of audio stream start notification</p>"},"Constants.html#/c:@SDLAudioStreamDidStopNotification":{"name":"SDLAudioStreamDidStopNotification","abstract":"<p>Name of audio stream stop notification</p>"},"Constants.html#/c:@SDLLockScreenManagerWillPresentLockScreenViewController":{"name":"SDLLockScreenManagerWillPresentLockScreenViewController","abstract":"<p>Lockscreen will present notification</p>"},"Constants.html#/c:@SDLLockScreenManagerDidPresentLockScreenViewController":{"name":"SDLLockScreenManagerDidPresentLockScreenViewController","abstract":"<p>Lockscreen did present notification</p>"},"Constants.html#/c:@SDLLockScreenManagerWillDismissLockScreenViewController":{"name":"SDLLockScreenManagerWillDismissLockScreenViewController","abstract":"<p>Lockscreen will dismiss notification</p>"},"Constants.html#/c:@SDLLockScreenManagerDidDismissLockScreenViewController":{"name":"SDLLockScreenManagerDidDismissLockScreenViewController","abstract":"<p>Lockscreen did dismiss notification</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateStopped":{"name":"SDLVideoStreamManagerStateStopped","abstract":"<p>Streaming state stopped</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateStarting":{"name":"SDLVideoStreamManagerStateStarting","abstract":"<p>Streaming state starting</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateReady":{"name":"SDLVideoStreamManagerStateReady","abstract":"<p>Streaming state ready</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateSuspended":{"name":"SDLVideoStreamManagerStateSuspended","abstract":"<p>Streaming state suspended</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateShuttingDown":{"name":"SDLVideoStreamManagerStateShuttingDown","abstract":"<p>Streaming state shutting down</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateStopped":{"name":"SDLAudioStreamManagerStateStopped","abstract":"<p>Audio state stopped</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateStarting":{"name":"SDLAudioStreamManagerStateStarting","abstract":"<p>Audio state starting</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateReady":{"name":"SDLAudioStreamManagerStateReady","abstract":"<p>Audio state ready</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateShuttingDown":{"name":"SDLAudioStreamManagerStateShuttingDown","abstract":"<p>Audio state shutting down</p>"},"Constants.html#/c:@SDLAppStateInactive":{"name":"SDLAppStateInactive","abstract":"<p>App state inactive</p>"},"Constants.html#/c:@SDLAppStateActive":{"name":"SDLAppStateActive","abstract":"<p>App state active</p>"},"Constants.html#/c:@SDLSupportedSeatDriver":{"name":"SDLSupportedSeatDriver","abstract":"<p>Save current seat positions and settings to seat memory.</p>"},"Constants.html#/c:@SDLSupportedSeatFrontPassenger":{"name":"SDLSupportedSeatFrontPassenger","abstract":"<p>Restore / apply the seat memory settings to the current seat.</p>"},"Constants.html#/c:@SDLSystemActionDefaultAction":{"name":"SDLSystemActionDefaultAction","abstract":"<p>A default soft button action</p>"},"Constants.html#/c:@SDLSystemActionStealFocus":{"name":"SDLSystemActionStealFocus","abstract":"<p>An action causing your app to steal HMI focus</p>"},"Constants.html#/c:@SDLSystemActionKeepContext":{"name":"SDLSystemActionKeepContext","abstract":"<p>An action causing you to keep context</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeAppServices":{"name":"SDLSystemCapabilityTypeAppServices","abstract":"<p>The app services capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeNavigation":{"name":"SDLSystemCapabilityTypeNavigation","abstract":"<p>The navigation capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypePhoneCall":{"name":"SDLSystemCapabilityTypePhoneCall","abstract":"<p>The phone call capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeVideoStreaming":{"name":"SDLSystemCapabilityTypeVideoStreaming","abstract":"<p>The video streaming capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeRemoteControl":{"name":"SDLSystemCapabilityTypeRemoteControl","abstract":"<p>The remote control capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeSeatLocation":{"name":"SDLSystemCapabilityTypeSeatLocation","abstract":"<p>Contains information about the locations of each seat</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeDisplays":{"name":"SDLSystemCapabilityTypeDisplays","abstract":"<p>The Display type capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeDriverDistraction":{"name":"SDLSystemCapabilityTypeDriverDistraction","abstract":"<p>@since SDL 7.0.0</p>"},"Constants.html#/c:@SDLSystemContextMain":{"name":"SDLSystemContextMain","abstract":"<p>No user interaction (user-initiated or app-initiated) is in progress.</p>"},"Constants.html#/c:@SDLSystemContextVoiceRecognitionSession":{"name":"SDLSystemContextVoiceRecognitionSession","abstract":"<p>VR-oriented, user-initiated or app-initiated interaction is in-progress.</p>"},"Constants.html#/c:@SDLSystemContextMenu":{"name":"SDLSystemContextMenu","abstract":"<p>Menu-oriented, user-initiated or app-initiated interaction is in-progress.</p>"},"Constants.html#/c:@SDLSystemContextHMIObscured":{"name":"SDLSystemContextHMIObscured","abstract":"<p>The app&rsquo;s display HMI is currently being obscured by either a system or other app&rsquo;s overlay.</p>"},"Constants.html#/c:@SDLSystemContextAlert":{"name":"SDLSystemContextAlert","abstract":"<p>Broadcast only to whichever app has an alert currently being displayed.</p>"},"Constants.html#/c:@SDLTBTStateRouteUpdateRequest":{"name":"SDLTBTStateRouteUpdateRequest","abstract":"<p>The route should be updated</p>"},"Constants.html#/c:@SDLTBTStateRouteAccepted":{"name":"SDLTBTStateRouteAccepted","abstract":"<p>The route is accepted</p>"},"Constants.html#/c:@SDLTBTStateRouteRefused":{"name":"SDLTBTStateRouteRefused","abstract":"<p>The route is refused</p>"},"Constants.html#/c:@SDLTBTStateRouteCancelled":{"name":"SDLTBTStateRouteCancelled","abstract":"<p>The route is cancelled</p>"},"Constants.html#/c:@SDLTBTStateETARequest":{"name":"SDLTBTStateETARequest","abstract":"<p>The route should update its Estimated Time of Arrival</p>"},"Constants.html#/c:@SDLTBTStateNextTurnRequest":{"name":"SDLTBTStateNextTurnRequest","abstract":"<p>The route should update its next turn</p>"},"Constants.html#/c:@SDLTBTStateRouteStatusRequest":{"name":"SDLTBTStateRouteStatusRequest","abstract":"<p>The route should update its status</p>"},"Constants.html#/c:@SDLTBTStateRouteSummaryRequest":{"name":"SDLTBTStateRouteSummaryRequest","abstract":"<p>The route update its summary</p>"},"Constants.html#/c:@SDLTBTStateTripStatusRequest":{"name":"SDLTBTStateTripStatusRequest","abstract":"<p>The route should update the trip&rsquo;s status</p>"},"Constants.html#/c:@SDLTBTStateRouteUpdateRequestTimeout":{"name":"SDLTBTStateRouteUpdateRequestTimeout","abstract":"<p>The route update timed out</p>"},"Constants.html#/c:@SDLTPMSUnknown":{"name":"SDLTPMSUnknown","abstract":"<p>If set the status of the tire is not known.</p>"},"Constants.html#/c:@SDLTPMSSystemFault":{"name":"SDLTPMSSystemFault","abstract":"<p>TPMS does not function.</p>"},"Constants.html#/c:@SDLTPMSSensorFault":{"name":"SDLTPMSSensorFault","abstract":"<p>The sensor of the tire does not function.</p>"},"Constants.html#/c:@SDLTPMSLow":{"name":"SDLTPMSLow","abstract":"<p>TPMS is reporting a low tire pressure for the tire.</p>"},"Constants.html#/c:@SDLTPMSSystemActive":{"name":"SDLTPMSSystemActive","abstract":"<p>TPMS is active and the tire pressure is monitored.</p>"},"Constants.html#/c:@SDLTPMSTrain":{"name":"SDLTPMSTrain","abstract":"<p>TPMS is reporting that the tire must be trained.</p>"},"Constants.html#/c:@SDLTPMSTrainingComplete":{"name":"SDLTPMSTrainingComplete","abstract":"<p>TPMS reports the training for the tire is completed.</p>"},"Constants.html#/c:@SDLTPMSNotTrained":{"name":"SDLTPMSNotTrained","abstract":"<p>TPMS reports the tire is not trained.</p>"},"Constants.html#/c:@SDLTemperatureUnitCelsius":{"name":"SDLTemperatureUnitCelsius","abstract":"<p>Reflects the current HMI setting for temperature unit in Celsius</p>"},"Constants.html#/c:@SDLTemperatureUnitFahrenheit":{"name":"SDLTemperatureUnitFahrenheit","abstract":"<p>Reflects the current HMI setting for temperature unit in Fahrenheit</p>"},"Constants.html#/c:@SDLTextAlignmentLeft":{"name":"SDLTextAlignmentLeft","abstract":"<p>Text aligned left.</p>"},"Constants.html#/c:@SDLTextAlignmentRight":{"name":"SDLTextAlignmentRight","abstract":"<p>Text aligned right.</p>"},"Constants.html#/c:@SDLTextAlignmentCenter":{"name":"SDLTextAlignmentCenter","abstract":"<p>Text aligned centered.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField1":{"name":"SDLTextFieldNameMainField1","abstract":"<p>The first line of the first set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField2":{"name":"SDLTextFieldNameMainField2","abstract":"<p>The second line of the first set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField3":{"name":"SDLTextFieldNameMainField3","abstract":"<p>The first line of the second set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField4":{"name":"SDLTextFieldNameMainField4"},"Constants.html#/c:@SDLTextFieldNameTemplateTitle":{"name":"SDLTextFieldNameTemplateTitle","abstract":"<p>The title line of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameStatusBar":{"name":"SDLTextFieldNameStatusBar","abstract":"<p>The status bar on the NGN display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMediaClock":{"name":"SDLTextFieldNameMediaClock","abstract":"<p>Text value for MediaClock field. Must be properly formatted according to MediaClockFormat. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMediaTrack":{"name":"SDLTextFieldNameMediaTrack","abstract":"<p>The track field of NGN type ACMs. This field is only available for media applications on a NGN display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText1":{"name":"SDLTextFieldNameAlertText1","abstract":"<p>The first line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText2":{"name":"SDLTextFieldNameAlertText2","abstract":"<p>The second line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText3":{"name":"SDLTextFieldNameAlertText3","abstract":"<p>The third line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameScrollableMessageBody":{"name":"SDLTextFieldNameScrollableMessageBody","abstract":"<p>Long form body of text that can include newlines and tabs. Applies to SDLScrollableMessage.</p>"},"Constants.html#/c:@SDLTextFieldNameInitialInteractionText":{"name":"SDLTextFieldNameInitialInteractionText","abstract":"<p>First line suggestion for a user response (in the case of VR enabled interaction).</p>"},"Constants.html#/c:@SDLTextFieldNameNavigationText1":{"name":"SDLTextFieldNameNavigationText1","abstract":"<p>First line of navigation text.</p>"},"Constants.html#/c:@SDLTextFieldNameNavigationText2":{"name":"SDLTextFieldNameNavigationText2","abstract":"<p>Second line of navigation text.</p>"},"Constants.html#/c:@SDLTextFieldNameETA":{"name":"SDLTextFieldNameETA","abstract":"<p>Estimated Time of Arrival time for navigation.</p>"},"Constants.html#/c:@SDLTextFieldNameTotalDistance":{"name":"SDLTextFieldNameTotalDistance","abstract":"<p>Total distance to destination for navigation.</p>"},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText1":{"name":"SDLTextFieldNameAudioPassThruDisplayText1","abstract":"<p>First line of text for audio pass thru.</p>"},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText2":{"name":"SDLTextFieldNameAudioPassThruDisplayText2","abstract":"<p>Second line of text for audio pass thru.</p>"},"Constants.html#/c:@SDLTextFieldNameSliderHeader":{"name":"SDLTextFieldNameSliderHeader","abstract":"<p>Header text for slider.</p>"},"Constants.html#/c:@SDLTextFieldNameSliderFooter":{"name":"SDLTextFieldNameSliderFooter","abstract":"<p>Footer text for slider</p>"},"Constants.html#/c:@SDLTextFieldNameMenuName":{"name":"SDLTextFieldNameMenuName","abstract":"<p>Primary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameSecondaryText":{"name":"SDLTextFieldNameSecondaryText","abstract":"<p>Secondary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameTertiaryText":{"name":"SDLTextFieldNameTertiaryText","abstract":"<p>Tertiary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameMenuTitle":{"name":"SDLTextFieldNameMenuTitle","abstract":"<p>Optional text to label an app menu button (for certain touchscreen platforms)</p>"},"Constants.html#/c:@SDLTextFieldNameLocationName":{"name":"SDLTextFieldNameLocationName","abstract":"<p>Optional name / title of intended location for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameLocationDescription":{"name":"SDLTextFieldNameLocationDescription","abstract":"<p>Optional description of intended location / establishment (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameAddressLines":{"name":"SDLTextFieldNameAddressLines","abstract":"<p>Optional location address (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNamePhoneNumber":{"name":"SDLTextFieldNamePhoneNumber","abstract":"<p>Optional hone number of intended location / establishment (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameTimeToDestination":{"name":"SDLTextFieldNameTimeToDestination","abstract":"<p>Optional time to destination field for ShowConstantTBT</p>"},"Constants.html#/c:@SDLTextFieldNameTurnText":{"name":"SDLTextFieldNameTurnText","abstract":"<p>Turn text for turnList parameter of UpdateTurnList</p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertText1":{"name":"SDLTextFieldNameSubtleAlertText1","abstract":"<p>The first line of the subtle alert text field; applies to <code>SubtleAlert</code> <code>alertText1</code></p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertText2":{"name":"SDLTextFieldNameSubtleAlertText2","abstract":"<p>The second line of the subtle alert text field; applies to <code>SubtleAlert</code> <code>alertText2</code></p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertSoftButtonText":{"name":"SDLTextFieldNameSubtleAlertSoftButtonText","abstract":"<p>A text field in the soft button of a subtle alert; applies to <code>SubtleAlert</code> <code>softButtons</code></p>"},"Constants.html#/c:@SDLTextFieldNameMenuCommandSecondaryText":{"name":"SDLTextFieldNameMenuCommandSecondaryText","abstract":"<p>Secondary text for AddCommand</p>"},"Constants.html#/c:@SDLTextFieldNameMenuCommandTertiaryText":{"name":"SDLTextFieldNameMenuCommandTertiaryText","abstract":"<p>Tertiary text for AddCommand</p>"},"Constants.html#/c:@SDLTextFieldNameMenuSubMenuSecondaryText":{"name":"SDLTextFieldNameMenuSubMenuSecondaryText","abstract":"<p>Secondary text for AddSubMenu</p>"},"Constants.html#/c:@SDLTextFieldNameMenuSubMenuTertiaryText":{"name":"SDLTextFieldNameMenuSubMenuTertiaryText","abstract":"<p>Tertiary text for AddSubMenu</p>"},"Constants.html#/c:@SDLTimerModeUp":{"name":"SDLTimerModeUp","abstract":"<p>The timer should count up.</p>"},"Constants.html#/c:@SDLTimerModeDown":{"name":"SDLTimerModeDown","abstract":"<p>The timer should count down.</p>"},"Constants.html#/c:@SDLTimerModeNone":{"name":"SDLTimerModeNone","abstract":"<p>The timer should not count.</p>"},"Constants.html#/c:@SDLTouchTypeBegin":{"name":"SDLTouchTypeBegin","abstract":"<p>The touch is the beginning of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeMove":{"name":"SDLTouchTypeMove","abstract":"<p>The touch is the movement of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeEnd":{"name":"SDLTouchTypeEnd","abstract":"<p>The touch is the ending of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeCancel":{"name":"SDLTouchTypeCancel","abstract":"<p>The touch is the cancellation of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTransmissionTypeAutomatic":{"name":"SDLTransmissionTypeAutomatic","abstract":"<p>Automatic transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeContinuouslyVariable":{"name":"SDLTransmissionTypeContinuouslyVariable","abstract":"<p>Continuously variable transmission(CVT).</p>"},"Constants.html#/c:@SDLTransmissionTypeDirectDrive":{"name":"SDLTransmissionTypeDirectDrive","abstract":"<p>Direct drive between engine and wheels.</p>"},"Constants.html#/c:@SDLTransmissionTypeDualClutch":{"name":"SDLTransmissionTypeDualClutch","abstract":"<p>Dual clutch transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeElectricVariable":{"name":"SDLTransmissionTypeElectricVariable","abstract":"<p>Electric variable transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeInfinitelyVariable":{"name":"SDLTransmissionTypeInfinitelyVariable","abstract":"<p>Infinitely variable transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeManual":{"name":"SDLTransmissionTypeManual","abstract":"<p>Manual transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeSemiAutomatic":{"name":"SDLTransmissionTypeSemiAutomatic","abstract":"<p>Semi automatic transmission.</p>"},"Constants.html#/c:@SDLTriggerSourceMenu":{"name":"SDLTriggerSourceMenu","abstract":"<p>Selection made via menu</p>"},"Constants.html#/c:@SDLTriggerSourceVoiceRecognition":{"name":"SDLTriggerSourceVoiceRecognition","abstract":"<p>Selection made via Voice session</p>"},"Constants.html#/c:@SDLTriggerSourceKeyboard":{"name":"SDLTriggerSourceKeyboard","abstract":"<p>Selection made via Keyboard</p>"},"Constants.html#/c:@SDLTurnSignalOff":{"name":"SDLTurnSignalOff","abstract":"<p>Turn signal is OFF</p>"},"Constants.html#/c:@SDLTurnSignalLeft":{"name":"SDLTurnSignalLeft","abstract":"<p>Left turn signal is on</p>"},"Constants.html#/c:@SDLTurnSignalRight":{"name":"SDLTurnSignalRight","abstract":"<p>Right turn signal is on</p>"},"Constants.html#/c:@SDLTurnSignalBoth":{"name":"SDLTurnSignalBoth","abstract":"<p>Both signals (left and right) are on</p>"},"Constants.html#/c:@SDLUpdateModeCountUp":{"name":"SDLUpdateModeCountUp","abstract":"<p>Starts the media clock timer counting upward, in increments of 1 second.</p>"},"Constants.html#/c:@SDLUpdateModeCountDown":{"name":"SDLUpdateModeCountDown","abstract":"<p>Starts the media clock timer counting downward, in increments of 1 second.</p>"},"Constants.html#/c:@SDLUpdateModePause":{"name":"SDLUpdateModePause","abstract":"<p>Pauses the media clock timer.</p>"},"Constants.html#/c:@SDLUpdateModeResume":{"name":"SDLUpdateModeResume","abstract":"<p>Resumes the media clock timer. The timer resumes counting in whatever mode was in effect before pausing (i.e. COUNTUP or COUNTDOWN).</p>"},"Constants.html#/c:@SDLUpdateModeClear":{"name":"SDLUpdateModeClear","abstract":"<p>Clear the media clock timer.</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveNotConfirmed","abstract":"<p>Inactive not confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveConfirmed","abstract":"<p>Inactive confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusActiveNotConfirmed","abstract":"<p>Active not confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveConfirmed":{"name":"SDLVehicleDataActiveStatusActiveConfirmed","abstract":"<p>Active confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusFault":{"name":"SDLVehicleDataActiveStatusFault","abstract":"<p>Fault</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNoEvent":{"name":"SDLVehicleDataEventStatusNoEvent","abstract":"<p>No event</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNo":{"name":"SDLVehicleDataEventStatusNo","abstract":"<p>The event is a No status</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusYes":{"name":"SDLVehicleDataEventStatusYes","abstract":"<p>The event is a Yes status</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNotSupported":{"name":"SDLVehicleDataEventStatusNotSupported","abstract":"<p>Vehicle data event is not supported</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusFault":{"name":"SDLVehicleDataEventStatusFault","abstract":"<p>The event is a Fault status</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotSupported":{"name":"SDLVehicleDataNotificationStatusNotSupported","abstract":"<p>The vehicle data notification status is not supported</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNormal":{"name":"SDLVehicleDataNotificationStatusNormal","abstract":"<p>The vehicle data notification status is normal</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusActive":{"name":"SDLVehicleDataNotificationStatusActive","abstract":"<p>The vehicle data notification status is active</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotUsed":{"name":"SDLVehicleDataNotificationStatusNotUsed","abstract":"<p>The vehicle data notification status is not used</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeSuccess":{"name":"SDLVehicleDataResultCodeSuccess","abstract":"<p>Individual vehicle data item / DTC / DID request or subscription successful</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeTruncatedData":{"name":"SDLVehicleDataResultCodeTruncatedData","abstract":"<p>DTC / DID request successful, however, not all active DTCs or full contents of DID location available</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDisallowed":{"name":"SDLVehicleDataResultCodeDisallowed","abstract":"<p>This vehicle data item is not allowed for this app by SDL</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeUserDisallowed":{"name":"SDLVehicleDataResultCodeUserDisallowed","abstract":"<p>The user has not granted access to this type of vehicle data item at this time</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeInvalidId":{"name":"SDLVehicleDataResultCodeInvalidId","abstract":"<p>The ECU ID referenced is not a valid ID on the bus / system</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeVehicleDataNotAvailable":{"name":"SDLVehicleDataResultCodeVehicleDataNotAvailable","abstract":"<p>The requested vehicle data item / DTC / DID is not currently available or responding on the bus / system</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDataAlreadySubscribed":{"name":"SDLVehicleDataResultCodeDataAlreadySubscribed","abstract":"<p>The vehicle data item is already subscribed</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDataNotSubscribed":{"name":"SDLVehicleDataResultCodeDataNotSubscribed","abstract":"<p>The vehicle data item cannot be unsubscribed because it is not currently subscribed</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeIgnored":{"name":"SDLVehicleDataResultCodeIgnored","abstract":"<p>The request for this item is ignored because it is already in progress</p>"},"Constants.html#/c:@SDLVehicleDataStatusNoDataExists":{"name":"SDLVehicleDataStatusNoDataExists","abstract":"<p>No data available</p>"},"Constants.html#/c:@SDLVehicleDataStatusOff":{"name":"SDLVehicleDataStatusOff","abstract":"<p>The status is Off</p>"},"Constants.html#/c:@SDLVehicleDataStatusOn":{"name":"SDLVehicleDataStatusOn","abstract":"<p>The status is On</p>"},"Constants.html#/c:@SDLVehicleDataTypeGearStatus":{"name":"SDLVehicleDataTypeGearStatus","abstract":"<p>Vehicle Gear Status data"},"Constants.html#/c:@SDLVehicleDataTypeGPS":{"name":"SDLVehicleDataTypeGPS","abstract":"<p>GPS vehicle data</p>"},"Constants.html#/c:@SDLVehicleDataTypeSpeed":{"name":"SDLVehicleDataTypeSpeed","abstract":"<p>Vehicle speed data</p>"},"Constants.html#/c:@SDLVehicleDataTypeStabilityControlsStatus":{"name":"SDLVehicleDataTypeStabilityControlsStatus","abstract":"<p>vehicle data StabilityControlsStatus to know if stability controls like ESC, Traction Control etc. are active.</p>"},"Constants.html#/c:@SDLVehicleDataTypeRPM":{"name":"SDLVehicleDataTypeRPM","abstract":"<p>Vehicle RPM data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelLevel":{"name":"SDLVehicleDataTypeFuelLevel","abstract":"<p>Vehicle fuel level data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelLevelState":{"name":"SDLVehicleDataTypeFuelLevelState","abstract":"<p>Vehicle fuel level state data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelConsumption":{"name":"SDLVehicleDataTypeFuelConsumption","abstract":"<p>Vehicle fuel consumption data</p>"},"Constants.html#/c:@SDLVehicleDataTypeExternalTemperature":{"name":"SDLVehicleDataTypeExternalTemperature","abstract":"<p>Vehicle external temperature data"},"Constants.html#/c:@SDLVehicleDataTypeVehicleDataClimateData":{"name":"SDLVehicleDataTypeVehicleDataClimateData","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLVehicleDataTypeVIN":{"name":"SDLVehicleDataTypeVIN","abstract":"<p>Vehicle VIN data</p>"},"Constants.html#/c:@SDLVehicleDataTypePRNDL":{"name":"SDLVehicleDataTypePRNDL","abstract":"<p>Vehicle PRNDL data</p>"},"Constants.html#/c:@SDLVehicleDataTypeTirePressure":{"name":"SDLVehicleDataTypeTirePressure","abstract":"<p>Vehicle tire pressure data</p>"},"Constants.html#/c:@SDLVehicleDataTypeOdometer":{"name":"SDLVehicleDataTypeOdometer","abstract":"<p>Vehicle odometer data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBeltStatus":{"name":"SDLVehicleDataTypeBeltStatus","abstract":"<p>Vehicle belt status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBodyInfo":{"name":"SDLVehicleDataTypeBodyInfo","abstract":"<p>Vehicle body info data</p>"},"Constants.html#/c:@SDLVehicleDataTypeDeviceStatus":{"name":"SDLVehicleDataTypeDeviceStatus","abstract":"<p>Vehicle device status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeECallInfo":{"name":"SDLVehicleDataTypeECallInfo","abstract":"<p>Vehicle emergency call info data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelRange":{"name":"SDLVehicleDataTypeFuelRange","abstract":"<p>Vehicle fuel range data</p>"},"Constants.html#/c:@SDLVehicleDataTypeAirbagStatus":{"name":"SDLVehicleDataTypeAirbagStatus","abstract":"<p>Vehicle airbag status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEmergencyEvent":{"name":"SDLVehicleDataTypeEmergencyEvent","abstract":"<p>Vehicle emergency event info</p>"},"Constants.html#/c:@SDLVehicleDataTypeClusterModeStatus":{"name":"SDLVehicleDataTypeClusterModeStatus","abstract":"<p>Vehicle cluster mode status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeMyKey":{"name":"SDLVehicleDataTypeMyKey","abstract":"<p>Vehicle MyKey data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBraking":{"name":"SDLVehicleDataTypeBraking","abstract":"<p>Vehicle braking data</p>"},"Constants.html#/c:@SDLVehicleDataTypeWiperStatus":{"name":"SDLVehicleDataTypeWiperStatus","abstract":"<p>Vehicle wiper status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeHandsOffSteering":{"name":"SDLVehicleDataTypeHandsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel"},"Constants.html#/c:@SDLVehicleDataTypeHeadlampStatus":{"name":"SDLVehicleDataTypeHeadlampStatus","abstract":"<p>Vehicle headlamp status</p>"},"Constants.html#/c:@SDLVehicleDataTypeBatteryVoltage":{"name":"SDLVehicleDataTypeBatteryVoltage","abstract":"<p>Vehicle battery voltage data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEngineOilLife":{"name":"SDLVehicleDataTypeEngineOilLife","abstract":"<p>Vehicle engine oil life data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEngineTorque":{"name":"SDLVehicleDataTypeEngineTorque","abstract":"<p>Vehicle engine torque data</p>"},"Constants.html#/c:@SDLVehicleDataTypeAccelerationPedal":{"name":"SDLVehicleDataTypeAccelerationPedal","abstract":"<p>Vehicle acceleration pedal data</p>"},"Constants.html#/c:@SDLVehicleDataTypeSteeringWheel":{"name":"SDLVehicleDataTypeSteeringWheel","abstract":"<p>Vehicle steering wheel data</p>"},"Constants.html#/c:@SDLVehicleDataTypeElectronicParkBrakeStatus":{"name":"SDLVehicleDataTypeElectronicParkBrakeStatus","abstract":"<p>Vehicle electronic parking brake status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeTurnSignal":{"name":"SDLVehicleDataTypeTurnSignal","abstract":"<p>Vehicle turn signal data</p>"},"Constants.html#/c:@SDLVehicleDataTypeCloudAppVehicleID":{"name":"SDLVehicleDataTypeCloudAppVehicleID","abstract":"<p>The cloud application vehicle id. Used by cloud apps to identify a head unit</p>"},"Constants.html#/c:@SDLVehicleDataTypeOEMVehicleDataType":{"name":"SDLVehicleDataTypeOEMVehicleDataType","abstract":"<p>Custom OEM Vehicle data</p>"},"Constants.html#/c:@SDLVehicleDataTypeWindowStatus":{"name":"SDLVehicleDataTypeWindowStatus","abstract":"<p>Describes the status of a window of a door/liftgate etc.</p>"},"Constants.html#/c:@SDLVehicleDataTypeSeatOccupancy":{"name":"SDLVehicleDataTypeSeatOccupancy","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLVentilationModeUpper":{"name":"SDLVentilationModeUpper","abstract":"<p>The upper ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeLower":{"name":"SDLVentilationModeLower","abstract":"<p>The lower ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeBoth":{"name":"SDLVentilationModeBoth","abstract":"<p>The both ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeNone":{"name":"SDLVentilationModeNone","abstract":"<p>No ventilation mode</p>"},"Constants.html#/c:@SDLVideoStreamingCodecH264":{"name":"SDLVideoStreamingCodecH264","abstract":"<p>H264</p>"},"Constants.html#/c:@SDLVideoStreamingCodecH265":{"name":"SDLVideoStreamingCodecH265","abstract":"<p>H265</p>"},"Constants.html#/c:@SDLVideoStreamingCodecTheora":{"name":"SDLVideoStreamingCodecTheora","abstract":"<p>Theora</p>"},"Constants.html#/c:@SDLVideoStreamingCodecVP8":{"name":"SDLVideoStreamingCodecVP8","abstract":"<p>VP8</p>"},"Constants.html#/c:@SDLVideoStreamingCodecVP9":{"name":"SDLVideoStreamingCodecVP9","abstract":"<p>VP9</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRAW":{"name":"SDLVideoStreamingProtocolRAW","abstract":"<p>RAW</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTP":{"name":"SDLVideoStreamingProtocolRTP","abstract":"<p>RTP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTSP":{"name":"SDLVideoStreamingProtocolRTSP","abstract":"<p>RTSP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTMP":{"name":"SDLVideoStreamingProtocolRTMP","abstract":"<p>RTMP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolWebM":{"name":"SDLVideoStreamingProtocolWebM","abstract":"<p>WebM</p>"},"Constants.html#/c:@SDLVideoStreamingStateStreamable":{"name":"SDLVideoStreamingStateStreamable","abstract":"<p>STREAMABLE, the current app is allowed to stream video</p>"},"Constants.html#/c:@SDLVideoStreamingStateNotStreamable":{"name":"SDLVideoStreamingStateNotStreamable","abstract":"<p>NOT_STREAMABLE, the current app is not allowed to stream video</p>"},"Constants.html#/c:@SDLVRCapabilitiesText":{"name":"SDLVRCapabilitiesText","abstract":"<p>The SDL platform is capable of recognizing spoken text in the current language.</p>"},"Constants.html#/c:@SDLWarningLightStatusOff":{"name":"SDLWarningLightStatusOff","abstract":"<p>The warning light is off</p>"},"Constants.html#/c:@SDLWarningLightStatusOn":{"name":"SDLWarningLightStatusOn","abstract":"<p>The warning light is off</p>"},"Constants.html#/c:@SDLWarningLightStatusFlash":{"name":"SDLWarningLightStatusFlash","abstract":"<p>The warning light is flashing</p>"},"Constants.html#/c:@SDLWarningLightStatusNotUsed":{"name":"SDLWarningLightStatusNotUsed","abstract":"<p>The warning light is unused</p>"},"Constants.html#/c:@SDLWayPointTypeAll":{"name":"SDLWayPointTypeAll","abstract":"<p>All other waypoint types</p>"},"Constants.html#/c:@SDLWayPointTypeDestination":{"name":"SDLWayPointTypeDestination","abstract":"<p>The destination waypoint</p>"},"Constants.html#/c:@SDLWindowTypeMain":{"name":"SDLWindowTypeMain","abstract":"<p>This window type describes the main window on a display.</p>"},"Constants.html#/c:@SDLWindowTypeWidget":{"name":"SDLWindowTypeWidget","abstract":"<p>A widget is a small window that the app can create to provide information and soft buttons for quick app control.</p>"},"Constants.html#/c:@SDLWiperStatusOff":{"name":"SDLWiperStatusOff","abstract":"<p>Wiper is off</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticOff":{"name":"SDLWiperStatusAutomaticOff","abstract":"<p>Wiper is off automatically</p>"},"Constants.html#/c:@SDLWiperStatusOffMoving":{"name":"SDLWiperStatusOffMoving","abstract":"<p>Wiper is moving but off</p>"},"Constants.html#/c:@SDLWiperStatusManualIntervalOff":{"name":"SDLWiperStatusManualIntervalOff","abstract":"<p>Wiper is off due to a manual interval</p>"},"Constants.html#/c:@SDLWiperStatusManualIntervalOn":{"name":"SDLWiperStatusManualIntervalOn","abstract":"<p>Wiper is on due to a manual interval</p>"},"Constants.html#/c:@SDLWiperStatusManualLow":{"name":"SDLWiperStatusManualLow","abstract":"<p>Wiper is on low manually</p>"},"Constants.html#/c:@SDLWiperStatusManualHigh":{"name":"SDLWiperStatusManualHigh","abstract":"<p>Wiper is on high manually</p>"},"Constants.html#/c:@SDLWiperStatusManualFlick":{"name":"SDLWiperStatusManualFlick","abstract":"<p>Wiper is on for a single wipe manually</p>"},"Constants.html#/c:@SDLWiperStatusWash":{"name":"SDLWiperStatusWash","abstract":"<p>Wiper is in wash mode</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticLow":{"name":"SDLWiperStatusAutomaticLow","abstract":"<p>Wiper is on low automatically</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticHigh":{"name":"SDLWiperStatusAutomaticHigh","abstract":"<p>Wiper is on high automatically</p>"},"Constants.html#/c:@SDLWiperStatusCourtesyWipe":{"name":"SDLWiperStatusCourtesyWipe","abstract":"<p>Wiper is performing a courtesy wipe</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticAdjust":{"name":"SDLWiperStatusAutomaticAdjust","abstract":"<p>Wiper is on automatic adjust</p>"},"Constants.html#/c:@SDLWiperStatusStalled":{"name":"SDLWiperStatusStalled","abstract":"<p>Wiper is stalled</p>"},"Constants.html#/c:@SDLWiperStatusNoDataExists":{"name":"SDLWiperStatusNoDataExists","abstract":"<p>Wiper data is not available</p>"},"Constants.html#/c:@SmartDeviceLinkVersionNumber":{"name":"SmartDeviceLinkVersionNumber","abstract":"<p>Project version number for SmartDeviceLink.</p>"},"Constants.html#/c:@SmartDeviceLinkVersionString":{"name":"SmartDeviceLinkVersionString","abstract":"<p>Project version string for SmartDeviceLink.</p>"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(im)initWithType:maximumNumberOfWindows:":{"name":"-initWithType:maximumNumberOfWindows:","abstract":"<p>Init with required parameters</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(py)type":{"name":"type","abstract":"<p>Type of windows available, to create.</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(py)maximumNumberOfWindows":{"name":"maximumNumberOfWindows","abstract":"<p>Number of windows available, to create.</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(im)initWithLocation:state:":{"name":"-initWithLocation:state:","parent_name":"SDLWindowStatus"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(py)location":{"name":"location","abstract":"<p>location</p>","parent_name":"SDLWindowStatus"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(py)state":{"name":"state","abstract":"<p>state</p>","parent_name":"SDLWindowStatus"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(im)initWithApproximatePosition:deviation:":{"name":"-initWithApproximatePosition:deviation:","parent_name":"SDLWindowState"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(py)approximatePosition":{"name":"approximatePosition","abstract":"<p>The approximate percentage that the window is open - 0 being fully closed, 100 being fully open</p>","parent_name":"SDLWindowState"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(py)deviation":{"name":"deviation","abstract":"<p>The percentage deviation of the approximatePosition. e.g. If the approximatePosition is 50 and the deviation is 10, then the window&rsquo;s location is somewhere between 40 and 60.</p>","parent_name":"SDLWindowState"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(im)initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:":{"name":"-initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(im)initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:":{"name":"-initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)windowID":{"name":"windowID","abstract":"<p>The specified ID of the window. Can be set to a predefined window, or omitted for the main window on the main display.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)textFields":{"name":"textFields","abstract":"<p>A set of all fields that support text data. - see: TextField</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)imageFields":{"name":"imageFields","abstract":"<p>A set of all fields that support images. - see: ImageField</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)imageTypeSupported":{"name":"imageTypeSupported","abstract":"<p>Provides information about image types supported by the system.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)templatesAvailable":{"name":"templatesAvailable","abstract":"<p>A set of all window templates available on the head unit.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)numCustomPresetsAvailable":{"name":"numCustomPresetsAvailable","abstract":"<p>The number of on-window custom presets available (if any); otherwise omitted.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>The number of buttons and the capabilities of each on-window button.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>The number of soft buttons available on-window and the capabilities for each button.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)menuLayoutsAvailable":{"name":"menuLayoutsAvailable","abstract":"<p>An array of available menu layouts. If this parameter is not provided, only the <code>LIST</code> layout is assumed to be available.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)dynamicUpdateCapabilities":{"name":"dynamicUpdateCapabilities","abstract":"<p>Contains the head unit&rsquo;s capabilities for dynamic updating features declaring if the module will send dynamic update RPCs.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)keyboardCapabilities":{"name":"keyboardCapabilities","abstract":"<p>See KeyboardCapabilities</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(im)initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:":{"name":"-initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)currentForecastSupported":{"name":"currentForecastSupported","abstract":"<p>Whether or not the current forecast is supported.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMultidayForecastAmount":{"name":"maxMultidayForecastAmount","abstract":"<p>The maximum number of day-by-day forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxHourlyForecastAmount":{"name":"maxHourlyForecastAmount","abstract":"<p>The maximum number of hour-by-hour forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMinutelyForecastAmount":{"name":"maxMinutelyForecastAmount","abstract":"<p>The maximum number of minute-by-minute forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)weatherForLocationSupported":{"name":"weatherForLocationSupported","abstract":"<p>Whether or not the weather for location is supported.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:":{"name":"-initWithLocation:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:":{"name":"-initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)location":{"name":"location","abstract":"<p>The location.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)currentForecast":{"name":"currentForecast","abstract":"<p>The current forecast.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)minuteForecast":{"name":"minuteForecast","abstract":"<p>A minute-by-minute array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)hourlyForecast":{"name":"hourlyForecast","abstract":"<p>An hour-by-hour array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)multidayForecast":{"name":"multidayForecast","abstract":"<p>A day-by-day array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)alerts":{"name":"alerts","abstract":"<p>An array of weather alerts. This array should be ordered with the first object being the current day.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(im)initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:":{"name":"-initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:","abstract":"<p>Convenience init for all parameters</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)currentTemperature":{"name":"currentTemperature","abstract":"<p>The current temperature.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureHigh":{"name":"temperatureHigh","abstract":"<p>The predicted high temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureLow":{"name":"temperatureLow","abstract":"<p>The predicted low temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperature":{"name":"apparentTemperature","abstract":"<p>The apparent temperature.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureHigh":{"name":"apparentTemperatureHigh","abstract":"<p>The predicted high apparent temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureLow":{"name":"apparentTemperatureLow","abstract":"<p>The predicted low apparent temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherSummary":{"name":"weatherSummary","abstract":"<p>A summary of the weather.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)time":{"name":"time","abstract":"<p>The time this data refers to.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)humidity":{"name":"humidity","abstract":"<p>From 0 to 1, percentage humidity.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)cloudCover":{"name":"cloudCover","abstract":"<p>From 0 to 1, percentage cloud cover.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)moonPhase":{"name":"moonPhase","abstract":"<p>From 0 to 1, percentage of the moon seen, e.g. 0 = no moon, 0.25 = quarter moon</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windBearing":{"name":"windBearing","abstract":"<p>In degrees, true north at 0 degrees.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windGust":{"name":"windGust","abstract":"<p>In km/hr</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windSpeed":{"name":"windSpeed","abstract":"<p>In km/hr</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormBearing":{"name":"nearestStormBearing","abstract":"<p>In degrees, true north at 0 degrees.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormDistance":{"name":"nearestStormDistance","abstract":"<p>In km</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipAccumulation":{"name":"precipAccumulation","abstract":"<p>In cm</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipIntensity":{"name":"precipIntensity","abstract":"<p>In cm of water per hour.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipProbability":{"name":"precipProbability","abstract":"<p>From 0 to 1, percentage chance.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipType":{"name":"precipType","abstract":"<p>A description of the precipitation type (e.g. &ldquo;rain&rdquo;, &ldquo;snow&rdquo;, &ldquo;sleet&rdquo;, &ldquo;hail&rdquo;)</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)visibility":{"name":"visibility","abstract":"<p>In km</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherIcon":{"name":"weatherIcon","abstract":"<p>The weather icon image.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(im)initWithTitle:summary:expires:regions:severity:timeIssued:":{"name":"-initWithTitle:summary:expires:regions:severity:timeIssued:","abstract":"<p>Convenience init for all parameters</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)title":{"name":"title","abstract":"<p>The title of the alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)summary":{"name":"summary","abstract":"<p>A summary for the alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)expires":{"name":"expires","abstract":"<p>The date the alert expires.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)regions":{"name":"regions","abstract":"<p>Regions affected.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)severity":{"name":"severity","abstract":"<p>Severity of the weather alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)timeIssued":{"name":"timeIssued","abstract":"<p>The date the alert was issued.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:":{"name":"-initWithText:image:","abstract":"<p>Convenience init to create a VR help item with the following parameters</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:position:":{"name":"-initWithText:image:position:","abstract":"<p>Convenience init to create a VR help item with all parameters</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)text":{"name":"text","abstract":"<p>Text to display for VR Help item</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)image":{"name":"image","abstract":"<p>Image for VR Help item</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)position":{"name":"position","abstract":"<p>Position to display item in VR Help list</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The strings the user can say to activate this voice command</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)handler":{"name":"handler","abstract":"<p>The handler that will be called when the command is activated</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(im)initWithVoiceCommands:handler:":{"name":"-initWithVoiceCommands:handler:","abstract":"<p>Convenience init</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)minimumAspectRatio":{"name":"minimumAspectRatio","abstract":"<p>The minimum supported normalized aspect ratio, min value is 1.0, defaults to 1.0</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)maximumAspectRatio":{"name":"maximumAspectRatio","abstract":"<p>The maximum supported normalized aspect ratio, min value is 1.0, defaults to 9999.0</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)minimumDiagonal":{"name":"minimumDiagonal","abstract":"<p>The minimum supported diagonal screen size in inches, defaults to 0.0 (matches any size)</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)minimumResolution":{"name":"minimumResolution","abstract":"<p>The minimum resolution to support, it overrides .minimumAspectRatio</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)maximumResolution":{"name":"maximumResolution","abstract":"<p>The maximum resolution to support, it overrides .maximumAspectRatio</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)initWithMinimumResolution:maximumResolution:":{"name":"-initWithMinimumResolution:maximumResolution:","abstract":"<p>Create a video streaming range based on a minimum and maximum resolution</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)initWithMinimumResolution:maximumResolution:minimumAspectRatio:maximumAspectRatio:minimumDiagonal:":{"name":"-initWithMinimumResolution:maximumResolution:minimumAspectRatio:maximumAspectRatio:minimumDiagonal:","abstract":"<p>Create a video streaming range with all supported options</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(cm)disabled":{"name":"+disabled","abstract":"<p>A convenience method to create a disabled range with the min and max resolutions equal to zero</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)isImageResolutionInRange:":{"name":"-isImageResolutionInRange:","abstract":"<p>Check if the argument is within the [.minimumResolution, .maximumResolution] range</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)isAspectRatioInRange:":{"name":"-isAspectRatioInRange:","abstract":"<p>Check if the argument is within the [.minimumAspectRatio, .maximumAspectRatio] range</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)protocol":{"name":"protocol","abstract":"<p>Protocol type, see VideoStreamingProtocol</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)codec":{"name":"codec","abstract":"<p>Codec type, see VideoStreamingCodec</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(im)initWithCodec:protocol:":{"name":"-initWithCodec:protocol:","abstract":"<p>Convenience init</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(im)initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:","abstract":"<p>Convenience init for creating a video streaming capability with all parameters.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(im)initWithPreferredResolution:maxBitrate:supportedFormats:hapticSpatialDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticSpatialDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS:","abstract":"<p>Convenience init for creating a video streaming capability with all parameters.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredResolution":{"name":"preferredResolution","abstract":"<p>The preferred resolution of a video stream for decoding and rendering on HMI</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)maxBitrate":{"name":"maxBitrate","abstract":"<p>The maximum bitrate of video stream that is supported, in kbps, optional</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)supportedFormats":{"name":"supportedFormats","abstract":"<p>Detailed information on each format supported by this system, in its preferred order</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)hapticSpatialDataSupported":{"name":"hapticSpatialDataSupported","abstract":"<p>True if the system can utilize the haptic spatial data from the source being streamed.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)diagonalScreenSize":{"name":"diagonalScreenSize","abstract":"<p>The diagonal screen size in inches.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)pixelPerInch":{"name":"pixelPerInch","abstract":"<p>The diagonal resolution in pixels divided by the diagonal screen size in inches.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)scale":{"name":"scale","abstract":"<p>The scaling factor the app should use to change the size of the projecting view.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)additionalVideoStreamingCapabilities":{"name":"additionalVideoStreamingCapabilities","abstract":"<p>{&ldquo;array_min_size&rdquo;: 1, &ldquo;array_max_size&rdquo;: 100}</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredFPS":{"name":"preferredFPS","abstract":"<p>The preferred frame rate per second of the head unit. The mobile application / app library may take other factors into account that constrain the frame rate lower than this value, but it should not perform streaming at a higher frame rate than this value.","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)major":{"name":"major","abstract":"<p>Major version (e.g. X.0.0)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)minor":{"name":"minor","abstract":"<p>Minor version (e.g. 0.X.0)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)patch":{"name":"patch","abstract":"<p>Patch version (e.g. 0.0.X)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)stringVersion":{"name":"stringVersion","abstract":"<p>A String format of the current SDLVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithMajor:minor:patch:":{"name":"-initWithMajor:minor:patch:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithMajor:minor:patch:":{"name":"+versionWithMajor:minor:patch:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithString:":{"name":"-initWithString:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithString:":{"name":"+versionWithString:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithSDLMsgVersion:":{"name":"-initWithSDLMsgVersion:","abstract":"<p>Convenience init to set version using SDLMsgVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithSDLMsgVersion:":{"name":"+versionWithSDLMsgVersion:","abstract":"<p>Convenience init to set version using SDLMsgVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)compare:":{"name":"-compare:","abstract":"<p>Compare two SDLVersions</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanVersion:":{"name":"-isLessThanVersion:","abstract":"<p>Compare is less than</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isEqualToVersion:":{"name":"-isEqualToVersion:","abstract":"<p>Compare is equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanVersion:":{"name":"-isGreaterThanVersion:","abstract":"<p>Compare is greater than</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanOrEqualToVersion:":{"name":"-isGreaterThanOrEqualToVersion:","abstract":"<p>Compare is greater than or equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanOrEqualToVersion:":{"name":"-isLessThanOrEqualToVersion:","abstract":"<p>Compare is less than or equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)make":{"name":"make","abstract":"<p>The make of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)model":{"name":"model","abstract":"<p>The model of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)modelYear":{"name":"modelYear","abstract":"<p>The model year of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)trim":{"name":"trim","abstract":"<p>The trim of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(im)initWithMake:model:modelYear:trim:":{"name":"-initWithMake:model:modelYear:trim:","abstract":"<p>Initialize the object</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(im)initWithDataType:resultCode:":{"name":"-initWithDataType:resultCode:","abstract":"<p>Convenience init for creating a SDLVehicleDataResult with a dataType</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(im)initWithCustomOEMDataType:resultCode:":{"name":"-initWithCustomOEMDataType:resultCode:","abstract":"<p>Convenience init for creating a SDLVehicleDataResult with a customDataType</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)dataType":{"name":"dataType","abstract":"<p>Defined published data element type</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)customOEMDataType":{"name":"customOEMDataType","abstract":"<p>OEM custom defined published data element type</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)resultCode":{"name":"resultCode","abstract":"<p>Published data result code</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(im)initWithTurnList:softButtons:":{"name":"-initWithTurnList:softButtons:","abstract":"<p>Convenience init to update a list of maneuvers for navigation</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)turnList":{"name":"turnList","abstract":"<p>Optional, SDLTurn, 1 - 100 entries</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)softButtons":{"name":"softButtons","abstract":"<p>Required, SDLSoftButton, 0 - 1 Entries</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The result of requesting to unsubscribe to the GPSData.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The result of requesting to unsubscribe to the vehicle speed in kilometers per hour.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The result of requesting to unsubscribe to the number of revolutions per minute of the engine.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The result of requesting to unsubscribe to the fuel level in the tank (percentage)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The result of requesting to unsubscribe to the fuel level state.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The result of requesting to unsubscribe to the fuel range.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The result of requesting to unsubscribe to the instantaneous fuel consumption in microlitres.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The result of requesting to unsubscribe to the tireStatus.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>The result of requesting to unsubscribe to the odometer in km.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the seat belts.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The result of requesting to unsubscribe to the body information including power modes.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The result of requesting to unsubscribe to the device status including signal and battery strength.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The result of requesting to unsubscribe to the status of the brake pedal.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the wipers.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>The result of requesting to unsubscribe from the status of driver hands are off the steering wheel</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the head lamps.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The result of requesting to unsubscribe to the estimated percentage of remaining oil life of the engine.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>The result of requesting to unsubscribe to the torque value for engine (in Nm) on non-diesel variants.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>The result of requesting to unsubscribe to the accelerator pedal position (percentage depressed)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>The result of requesting to unsubscribe to the current angle of the steering wheel (in deg)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>The result of requesting to unsubscribe to the emergency call info</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The result of requesting to unsubscribe to the airbag status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>The result of requesting to unsubscribe to the emergency event</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"<p>The result of requesting to unsubscribe to the cluster modes</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>The result of requesting to unsubscribe to the myKey status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The result of requesting to unsubscribe to the electronic parking brake status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The result of requesting to unsubscribe to the turn signal</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The result of requesting to unsubscribe to the cloud app vehicle id</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"<p>Convenience init for unsubscribing to all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for unsubscribing from all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for unsubscribing from all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gps":{"name":"gps","abstract":"<p>If true, unsubscribes from GPS</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)speed":{"name":"speed","abstract":"<p>If true, unsubscribes from Speed</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"<p>If true, unsubscribes from RPM</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>If true, unsubscribes from Fuel Level</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>If true, unsubscribes from Fuel Level State</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>If true, unsubscribes from Fuel Range</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>If true, unsubscribes from Instant Fuel Consumption</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>If true, unsubscribes from Tire Pressure</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"<p>If true, unsubscribes from Odometer</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>If true, unsubscribes from Belt Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>If true, unsubscribes from Body Information</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>If true, unsubscribes from Device Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>If true, unsubscribes from Driver Braking</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>If true, unsubscribes from Wiper Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>If true, unsubscribes from Head Lamp Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>If true, unsubscribes from Engine Oil Life</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>If true, unsubscribes from Engine Torque</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>If true, unsubscribes from Acc Pedal Position</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>If true, unsubscribes from Steering Wheel Angle data</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>If true, unsubscribes from eCallInfo</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>If true, unsubscribes from Airbag Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>If true, unsubscribes from Emergency Event</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>If true, unsubscribes from Cluster Mode Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"<p>If true, unsubscribes from My Key</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, unsubscribes to the Electronic Parking Brake Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, unsubscribes to the Turn Signal</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, unsubscribes to the Cloud App Vehicle ID</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(im)initWithButtonName:":{"name":"-initWithButtonName:","abstract":"<p>Convenience init to unsubscribe from a subscription button</p>","parent_name":"SDLUnsubscribeButton"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(py)buttonName":{"name":"buttonName","abstract":"<p>A name of the button to unsubscribe from","parent_name":"SDLUnsubscribeButton"},"Classes/SDLUnpublishAppService.html#/c:objc(cs)SDLUnpublishAppService(im)initWithServiceID:":{"name":"-initWithServiceID:","abstract":"<p>Create an instance of UnpublishAppService with the serviceID that corresponds with the service to be unpublished</p>","parent_name":"SDLUnpublishAppService"},"Classes/SDLUnpublishAppService.html#/c:objc(cs)SDLUnpublishAppService(py)serviceID":{"name":"serviceID","abstract":"<p>The ID of the service to be unpublished.</p>","parent_name":"SDLUnpublishAppService"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(im)initWithNavigationText:turnIcon:":{"name":"-initWithNavigationText:turnIcon:","abstract":"<p>Convenience init to UpdateTurnList for navigation</p>","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)navigationText":{"name":"navigationText","abstract":"<p>Individual turn text. Must provide at least text or icon for a given turn</p>","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)turnIcon":{"name":"turnIcon","abstract":"<p>Individual turn icon. Must provide at least text or icon for a given turn</p>","parent_name":"SDLTurn"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventDelegate":{"name":"touchEventDelegate","abstract":"<p>Notified of processed touches such as pinches, pans, and taps</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventHandler":{"name":"touchEventHandler","abstract":"<p>Returns all OnTouchEvent notifications as SDLTouch and SDLTouchType objects.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapDistanceThreshold":{"name":"tapDistanceThreshold","abstract":"<p>Distance between two taps on the screen, in the head unit&rsquo;s coordinate system, used for registering double-tap callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)panDistanceThreshold":{"name":"panDistanceThreshold","abstract":"<p>Minimum distance for a pan gesture in the head unit&rsquo;s coordinate system, used for registering pan callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapTimeThreshold":{"name":"tapTimeThreshold","abstract":"<p>Time (in seconds) between tap events to register a double-tap callback. This must be greater than 0.0.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)enableSyncedPanning":{"name":"enableSyncedPanning","abstract":"<p>If set to NO, the display link syncing will be ignored. Defaults to YES.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEnabled":{"name":"touchEnabled","abstract":"<p>Boolean denoting whether or not the touch manager should deliver touch event callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)cancelPendingTouches":{"name":"-cancelPendingTouches","abstract":"<p>Cancels pending touch event timers that may be in progress.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)initWithHitTester:videoScaleManager:":{"name":"-initWithHitTester:videoScaleManager:","abstract":"<p>Initialize a touch manager with a hit tester and a video scale manager.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)syncFrame":{"name":"-syncFrame","abstract":"<p>Called by SDLStreamingMediaManager in sync with the streaming framerate. This helps to moderate panning gestures by allowing the UI to be modified in time with the framerate.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)pressAvailable":{"name":"pressAvailable","abstract":"<p>Whether or not long presses are available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)multiTouchAvailable":{"name":"multiTouchAvailable","abstract":"<p>Whether or not multi-touch (e.g. a pinch gesture) is available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)doublePressAvailable":{"name":"doublePressAvailable","abstract":"<p>Whether or not a double tap is available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)touchEventId":{"name":"touchEventId","abstract":"<p>A touch&rsquo;s unique identifier. The application can track the current touch events by id.</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)timeStamp":{"name":"timeStamp","abstract":"<p>The time that the touch was recorded. This number can the time since the beginning of the session or something else as long as the units are in milliseconds.</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)coord":{"name":"coord","abstract":"<p>The touch&rsquo;s coordinate</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)x":{"name":"x","abstract":"<p>The x value of the touch coordinate</p>","parent_name":"SDLTouchCoord"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)y":{"name":"y","abstract":"<p>The y value of the touch coordinate</p>","parent_name":"SDLTouchCoord"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(im)initWithTouchEvent:":{"name":"-initWithTouchEvent:","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)identifier":{"name":"identifier","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)location":{"name":"location","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)timeStamp":{"name":"timeStamp","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isFirstFinger":{"name":"isFirstFinger","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isSecondFinger":{"name":"isSecondFinger","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)pressureTelltale":{"name":"pressureTelltale","abstract":"<p>Status of the Tire Pressure Telltale. See WarningLightStatus.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftFront":{"name":"leftFront","abstract":"<p>The status of the left front tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightFront":{"name":"rightFront","abstract":"<p>The status of the right front tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftRear":{"name":"leftRear","abstract":"<p>The status of the left rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightRear":{"name":"rightRear","abstract":"<p>The status of the right rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerLeftRear":{"name":"innerLeftRear","abstract":"<p>The status of the inner left rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerRightRear":{"name":"innerRightRear","abstract":"<p>The status of the inner right rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)name":{"name":"name","abstract":"<p>The enumeration identifying the field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)characterSet":{"name":"characterSet","abstract":"<p>The set of characters that are supported by this text field. All text is sent in UTF-8 format, but not all systems may support all of the characters expressed by UTF-8. All systems will support at least ASCII, but they may support more, either the LATIN-1 character set, or the full UTF-8 character set.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)width":{"name":"width","abstract":"<p>The number of characters in one row of this field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)rows":{"name":"rows","abstract":"<p>The number of rows for this text field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(im)initWithName:characterSet:width:rows:":{"name":"-initWithName:characterSet:width:rows:","abstract":"<p>Convenience initializer for the TextField RPC struct</p>","parent_name":"SDLTextField"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithPredefinedLayout:":{"name":"-initWithPredefinedLayout:","abstract":"<p>Constructor with the required values.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithTemplate:":{"name":"-initWithTemplate:","abstract":"<p>Init with the required values.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithTemplate:dayColorScheme:nightColorScheme:":{"name":"-initWithTemplate:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience constructor with all the parameters.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)template":{"name":"template","abstract":"<p>Predefined or dynamically created window template. Currently only predefined window template layouts are defined.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to use when the head unit is in a light / day situation.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to use when the head unit is in a dark / night situation.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:":{"name":"-initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:","abstract":"<p>Convenience init</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryColor:secondaryColor:backgroundColor:":{"name":"-initWithPrimaryColor:secondaryColor:backgroundColor:","abstract":"<p>Convenience init</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)primaryColor":{"name":"primaryColor","abstract":"<p>The &ldquo;primary&rdquo; color. This must always be your primary brand color. If the OEM only uses one color, this will be the color. It is recommended to the OEMs that the primaryColor should change the <code>mediaClockTimer</code> bar and the highlight color of soft buttons.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)secondaryColor":{"name":"secondaryColor","abstract":"<p>The &ldquo;secondary&rdquo; color. This may be an accent or complimentary color to your primary brand color. If the OEM uses this color, they must also use the primary color. It is recommended to the OEMs that the secondaryColor should change the background color of buttons, such as soft buttons.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The background color to be used on the template. If the OEM does not support this parameter, assume on &ldquo;dayColorScheme&rdquo; that this will be a light color, and on &ldquo;nightColorScheme&rdquo; a dark color. You should do the same for your custom schemes.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithFahrenheitValue:":{"name":"-initWithFahrenheitValue:","abstract":"<p>Convenience init for a fahrenheit temperature value.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithCelsiusValue:":{"name":"-initWithCelsiusValue:","abstract":"<p>Convenience init for a celsius temperature value.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithUnit:value:":{"name":"-initWithUnit:value:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)unit":{"name":"unit","abstract":"<p>Temperature unit</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)value":{"name":"value","abstract":"<p>Temperature value in specified unit. Range depends on OEM and is not checked by SDL.</p>","parent_name":"SDLTemperature"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(im)initWithText:type:":{"name":"-initWithText:type:","abstract":"<p>Initialize with text and a type</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)textChunksFromString:":{"name":"+textChunksFromString:","abstract":"<p>Create TTS using text</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)sapiChunksFromString:":{"name":"+sapiChunksFromString:","abstract":"<p>Create TTS using SAPI</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)lhPlusChunksFromString:":{"name":"+lhPlusChunksFromString:","abstract":"<p>Create TTS using LH Plus</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)prerecordedChunksFromString:":{"name":"+prerecordedChunksFromString:","abstract":"<p>Create TTS using prerecorded chunks</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)silenceChunks":{"name":"+silenceChunks","abstract":"<p>Create TTS using silence</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)fileChunksWithName:":{"name":"+fileChunksWithName:","abstract":"<p>Create &ldquo;TTS&rdquo; to play an audio file previously uploaded to the system.</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)text":{"name":"text","abstract":"<p>Text to be spoken, a phoneme specification, or the name of a pre-recorded / pre-uploaded sound. The contents of this field are indicated by the &ldquo;type&rdquo; field.</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)type":{"name":"type","abstract":"<p>The type of information in the &ldquo;text&rdquo; field (e.g. phrase to be spoken, phoneme specification, name of pre-recorded sound).</p>","parent_name":"SDLTTSChunk"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithType:fileName:":{"name":"-initWithType:fileName:","abstract":"<p>Create a generic system request with a file name</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithProprietaryType:fileName:":{"name":"-initWithProprietaryType:fileName:","abstract":"<p>Create an OEM_PROPRIETARY system request with a subtype and file name</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestType":{"name":"requestType","abstract":"<p>The type of system request. Note that Proprietary requests should forward the binary data to the known proprietary module on the system.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"<p>A request subType used when the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestType\">requestType</a></code> is <code>OEM_SPECIFIC</code>.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)fileName":{"name":"fileName","abstract":"<p>Filename of HTTP data to store in predefined system staging area.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(py)vehicleType":{"name":"vehicleType","abstract":"<p>The connected module&rsquo;s vehicle type: it&rsquo;s make, model, trim, and model year</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(py)systemSoftwareVersion":{"name":"systemSoftwareVersion","abstract":"<p>The connected module&rsquo;s software version</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(py)systemHardwareVersion":{"name":"systemHardwareVersion","abstract":"<p>The connected module&rsquo;s hardware version</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(im)initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:":{"name":"-initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:","abstract":"<p>Initialize a system info object with individual pieces</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(im)initWithVehicleType:softwareVersion:hardwareVersion:":{"name":"-initWithVehicleType:softwareVersion:hardwareVersion:","abstract":"<p>Initialize a system info object with the vehicle type and versions</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)displays":{"name":"displays","abstract":"<p>Provides window capabilities of all displays connected with SDL. By default, one display is connected and supported which includes window capability information of the default main window of the display. May be nil if the system has not provided display and window capability information yet.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>If returned, the platform supports on-screen SoftButtons</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>If returned, the platform supports custom on-screen Presets</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)speechCapabilities":{"name":"speechCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)prerecordedSpeechCapabilities":{"name":"prerecordedSpeechCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)vrCapability":{"name":"vrCapability","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)pcmStreamCapability":{"name":"pcmStreamCapability","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"<p>If returned, the platform supports app services</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)navigationCapability":{"name":"navigationCapability","abstract":"<p>If returned, the platform supports navigation</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)phoneCapability":{"name":"phoneCapability","abstract":"<p>If returned, the platform supports making phone calls</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>If returned, the platform supports video streaming</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"<p>If returned, the platform supports remote control capabilities</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)seatLocationCapability":{"name":"seatLocationCapability","abstract":"<p>If returned, the platform supports remote control capabilities for seats</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)driverDistractionCapability":{"name":"driverDistractionCapability","abstract":"<p>If returned, the platform supports driver distraction capabilities</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)defaultMainWindowCapability":{"name":"defaultMainWindowCapability","abstract":"<p>Returns the window capability object of the default main window which is always pre-created by the connected system. This is a convenience method for easily accessing the capabilities of the default main window.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)supportsSubscriptions":{"name":"supportsSubscriptions","abstract":"<p>YES if subscriptions are available on the connected module and you will automatically be notified if the value changes on the module. If NO, calls to <code>subscribe</code> methods will subscribe to updates, but the module will not automatically notify you. You will need to call <code>updateWithCapabilityType:completionHandler:</code> to force an update if you need one (though this should be rare). This does not apply to the <code>DISPLAYS</code> capability type which you can always subscribe to.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)init":{"name":"-init","abstract":"<p>Init is unavailable. Dependencies must be injected using initWithConnectionManager:</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)initWithConnectionManager:":{"name":"-initWithConnectionManager:","abstract":"<p>Creates a new system capability manager with a specified connection manager</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)start":{"name":"-start","abstract":"<p>Starts the manager. This method is used internally.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager. This method is used internally.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)windowCapabilityWithWindowID:":{"name":"-windowCapabilityWithWindowID:","abstract":"<p>Returns the window capability of one of your app&rsquo;s windows with the specified window ID that is on the primary display (i.e. the head unit itself). This is a convenience method to easily access capabilities of windows such as your apps&rsquo; widget windows.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)isCapabilitySupported:":{"name":"-isCapabilitySupported:","abstract":"<p>Returns whether or not the capability type is supported on the module. You can use this to check if subscribing to the capability will work. If this returns NO, then the feature is not supported by the head unit. If YES, the feature is supported by the head unit. You can subscribe to the capability type to get more information about the capability&rsquo;s support and features on the connected module.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)updateCapabilityType:completionHandler:":{"name":"-updateCapabilityType:completionHandler:","abstract":"<p>This method has been superseded by the <code>subscribeToCapabilityType:</code> methods. You should use one of those methods instead unless you only want a value once (you don&rsquo;t want to keep a long-lasting observer) and it must be current (most capabilities do not need to be updated). If you have a separate subscription observer and are connected to a head unit that does not support subscriptions, when this method returns, it will also call all subscription callbacks that you&rsquo;ve set up with the new value if there is one. Therefore, you can use this method to force an update to all subscriptions of that particular type on head units that don&rsquo;t support subscriptions (<code>supportsSubscriptions == NO</code>).</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)subscribeToCapabilityType:withUpdateHandler:":{"name":"-subscribeToCapabilityType:withUpdateHandler:","abstract":"<p>Subscribe to a particular capability type using a handler callback.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)subscribeToCapabilityType:withObserver:selector:":{"name":"-subscribeToCapabilityType:withObserver:selector:","abstract":"<p>Subscribe to a particular capability type with a selector callback.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)unsubscribeFromCapabilityType:withObserver:":{"name":"-unsubscribeFromCapabilityType:withObserver:","abstract":"<p>Unsubscribe from a particular capability type. If it was subscribed with a block / handler, the return value should be passed to the <code>observer</code> to unsubscribe the block. If it was subscribed with a selector, the <code>observer</code> object (on which the selector exists and is called) should be passed to unsubscribe the object selector.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithAppServicesCapabilities:":{"name":"-initWithAppServicesCapabilities:","abstract":"<p>Convenience init for an App Service Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithNavigationCapability:":{"name":"-initWithNavigationCapability:","abstract":"<p>Convenience init for a Navigation Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithPhoneCapability:":{"name":"-initWithPhoneCapability:","abstract":"<p>Convenience init for a Phone Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithVideoStreamingCapability:":{"name":"-initWithVideoStreamingCapability:","abstract":"<p>Convenience init for a Video Streaming Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithRemoteControlCapability:":{"name":"-initWithRemoteControlCapability:","abstract":"<p>Convenience init for a Remote Control Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithDisplayCapabilities:":{"name":"-initWithDisplayCapabilities:","abstract":"<p>Convenience init for DisplayCapability list</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithSeatLocationCapability:":{"name":"-initWithSeatLocationCapability:","abstract":"<p>Convenience init for a Remote Control Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithDriverDistractionCapability:":{"name":"-initWithDriverDistractionCapability:","abstract":"<p>Convenience init for a Driver Distraction capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"<p>Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other parameter included.</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"<p>Describes the capabilities of app services including what service types are supported and the current state of services.</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)navigationCapability":{"name":"navigationCapability","abstract":"<p>Describes the extended capabilities of the onboard navigation system</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)phoneCapability":{"name":"phoneCapability","abstract":"<p>Describes the extended capabilities of the module&rsquo;s phone feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>Describes the capabilities of the module&rsquo;s video streaming feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"<p>Describes the extended capabilities of the module&rsquo;s remote control feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)seatLocationCapability":{"name":"seatLocationCapability","abstract":"<p>Describes information about the locations of each seat</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>Contain the display related information and all windows related to that display</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)driverDistractionCapability":{"name":"driverDistractionCapability","abstract":"<p>Describes capabilities when the driver is distracted</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSubtleAlertResponse.html#/c:objc(cs)SDLSubtleAlertResponse(im)initWithTryAgainTime:":{"name":"-initWithTryAgainTime:","parent_name":"SDLSubtleAlertResponse"},"Classes/SDLSubtleAlertResponse.html#/c:objc(cs)SDLSubtleAlertResponse(py)tryAgainTime":{"name":"tryAgainTime","abstract":"<p>Amount of time (in milliseconds) that an app must wait before resending an alert. If provided, another system event or overlay currently has a higher priority than this alert. An app must not send an alert without waiting at least the amount of time dictated.","parent_name":"SDLSubtleAlertResponse"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(im)initWithAlertText1:alertText2:alertIcon:ttsChunks:duration:softButtons:cancelID:":{"name":"-initWithAlertText1:alertText2:alertIcon:ttsChunks:duration:softButtons:cancelID:","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertText1":{"name":"alertText1","abstract":"<p>The first line of the alert text field","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertText2":{"name":"alertText2","abstract":"<p>The second line of the alert text field","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertIcon":{"name":"alertIcon","abstract":"<p>Image to be displayed for the corresponding alert. See Image. If omitted on supported displays, no (or the default if applicable) icon should be displayed.</p>","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks of type TTSChunk. See TTSChunk. The array must have at least one item.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)duration":{"name":"duration","abstract":"<p>Timeout in milliseconds. Typical timeouts are 3-5 seconds. If omitted, timeout is set to 5s.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)softButtons":{"name":"softButtons","abstract":"<p>App defined SoftButtons. If omitted on supported displays, the displayed alert shall not have any SoftButtons.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific alert to allow cancellation through the <code>CancelInteraction</code> RPC.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The result of requesting to subscribe to the GPSData.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The result of requesting to subscribe to the vehicle speed in kilometers per hour.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The result of requesting to subscribe to the number of revolutions per minute of the engine.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The result of requesting to subscribe to the fuel level in the tank (percentage)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The result of requesting to subscribe to the fuel level state.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The result of requesting to subscribe to the fuel range.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The result of requesting to subscribe to the instantaneous fuel consumption in microlitres.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The result of requesting to subscribe to the tireStatus.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>The result of requesting to subscribe to the odometer in km.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The result of requesting to subscribe to the status of the seat belts.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The result of requesting to subscribe to the body information including power modes.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The result of requesting to subscribe to the device status including signal and battery strength.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The result of requesting to subscribe to the status of the brake pedal.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The result of requesting to subscribe to the status of the wipers.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>The result of requesting to subscribe to the status of the head lamps.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The result of requesting to subscribe to the estimated percentage of remaining oil life of the engine.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>The result of requesting to subscribe to the torque value for engine (in Nm) on non-diesel variants.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>The result of requesting to subscribe to the accelerator pedal position (percentage depressed)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>The result of requesting to subscribe to the current angle of the steering wheel (in deg)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>The result of requesting to subscribe to the emergency call info</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The result of requesting to subscribe to the airbag status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>The result of requesting to subscribe to the emergency event</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"<p>The result of requesting to subscribe to the cluster modes</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>The result of requesting to subscribe to the myKey status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The result of requesting to subscribe to the electronic parking brake status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The result of requesting to subscribe to the turn signal</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The result of requesting to subscribe to the cloud app vehicle ID</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gps":{"name":"gps","abstract":"<p>A boolean value. If true, subscribes GPS data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)speed":{"name":"speed","abstract":"<p>A boolean value. If true, subscribes Speed data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"<p>A boolean value. If true, subscribes RPM data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>A boolean value. If true, subscribes Fuel Level data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>A boolean value. If true, subscribes Fuel Level State data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>A boolean value. If true, subscribes Fuel Range data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>A boolean value. If true, subscribes Instant Fuel Consumption data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>A boolean value. If true, subscribes Tire Pressure status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"<p>A boolean value. If true, subscribes Odometer data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>A boolean value. If true, subscribes Belt Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>A boolean value. If true, subscribes Body Information data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>A boolean value. If true, subscribes Device Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>A boolean value. If true, subscribes Driver Braking data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>A boolean value. If true, subscribes Wiper Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>A boolean value. If true, subscribes Head Lamp Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>A boolean value. If true, subscribes to Engine Oil Life data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>A boolean value. If true, subscribes Engine Torque data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>A boolean value. If true, subscribes Acc Pedal Position data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>A boolean value. If true, subscribes Steering Wheel Angle data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>A boolean value. If true, subscribes eCall Info data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>A boolean value. If true, subscribes Airbag Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>A boolean value. If true, subscribes Emergency Event data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>A boolean value. If true, subscribes Cluster Mode Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"<p>A boolean value. If true, subscribes myKey data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, subscribes to the electronic parking brake status.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, subscribes to the turn signal status.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, subscribes to the cloud app vehicle ID.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data value for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Construct a SDLSubscribeButton with a handler callback when an event occurs.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithButtonName:handler:":{"name":"-initWithButtonName:handler:","abstract":"<p>Construct a SDLSubscribeButton with a handler callback when an event occurs with a button name.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)handler":{"name":"handler","abstract":"<p>A handler that will let you know when the button you subscribed to is selected.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)buttonName":{"name":"buttonName","abstract":"<p>The name of the button to subscribe to","parent_name":"SDLSubscribeButton"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)scale":{"name":"scale","abstract":"<p>The scaling factor the app should use to change the size of the projecting view.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)displayViewportResolution":{"name":"displayViewportResolution","abstract":"<p>The screen resolution of the connected display. The units are pixels.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)appViewportFrame":{"name":"appViewportFrame","abstract":"<p>The frame of the app&rsquo;s projecting view. This is calculated by dividing the display&rsquo;s viewport resolution by the scale. The units are points.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)init":{"name":"-init","abstract":"<p>Creates a default streaming video scale manager.","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)initWithScale:displayViewportResolution:":{"name":"-initWithScale:displayViewportResolution:","abstract":"<p>Convenience init for creating the manager with a scale and connected display viewport resolution.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)scaleTouchEventCoordinates:":{"name":"-scaleTouchEventCoordinates:","abstract":"<p>Scales the coordinates of an <code>OnTouchEvent</code> from the display&rsquo;s coordinate system to the app&rsquo;s viewport coordinate system. If the scale value is less than 1.0, the touch events will be returned without being scaled.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)scaleHapticRect:":{"name":"-scaleHapticRect:","abstract":"<p>Scales a haptic rectangle from the app&rsquo;s viewport coordinate system to the display&rsquo;s coordinate system. If the scale value is less than 1.0, the haptic rectangle will be returned without being scaled.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)makeScaledResolution":{"name":"-makeScaledResolution","abstract":"<p>Create and return the current display resolution respecting the scale factor</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager. This method is used internally.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(cm)scale:size:":{"name":"+scale:size:","abstract":"<p>Calculate a new size based on the given size and the scale factor</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)touchManager":{"name":"touchManager","abstract":"<p>Touch Manager responsible for providing touch event notifications.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioManager":{"name":"audioManager","abstract":"<p>Audio Manager responsible for managing streaming audio.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)rootViewController":{"name":"rootViewController","abstract":"<p>This property is used for SDLCarWindow, the ability to stream any view controller. To start, you must set an initial view controller on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaConfiguration.html\">SDLStreamingMediaConfiguration</a></code> <code>rootViewController</code>. After streaming begins, you can replace that view controller with a new root by placing the new view controller into this property.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)focusableItemManager":{"name":"focusableItemManager","abstract":"<p>A haptic interface that can be updated to reparse views within the window you&rsquo;ve provided. Send a <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLDidUpdateProjectionView\">SDLDidUpdateProjectionView</a></code> notification or call the <code>updateInterfaceLayout</code> method to reparse. The &ldquo;output&rdquo; of this haptic interface occurs in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)touchManager\">touchManager</a></code> property where it will call the delegate.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)streamingSupported":{"name":"streamingSupported","abstract":"<p>Whether or not video streaming is supported</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoConnected":{"name":"videoConnected","abstract":"<p>Whether or not the video session is connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoEncrypted":{"name":"videoEncrypted","abstract":"<p>Whether or not the video session is encrypted. This may be different than the requestedEncryptionType.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioConnected":{"name":"audioConnected","abstract":"<p>Whether or not the audio session is connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioEncrypted":{"name":"audioEncrypted","abstract":"<p>Whether or not the audio session is encrypted. This may be different than the requestedEncryptionType.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoStreamingPaused":{"name":"videoStreamingPaused","abstract":"<p>Whether or not the video stream is paused due to either the application being backgrounded, the HMI state being either NONE or BACKGROUND, or the video stream not being ready.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)screenSize":{"name":"screenSize","abstract":"<p>The current screen resolution of the connected display in pixels.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoFormat":{"name":"videoFormat","abstract":"<p>This is the agreed upon format of video encoder that is in use, or nil if not currently connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)supportedFormats":{"name":"supportedFormats","abstract":"<p>A list of all supported video formats by this manager</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)pixelBufferPool":{"name":"pixelBufferPool","abstract":"<p>The pixel buffer pool reference returned back from an active VTCompressionSessionRef encoder.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)requestedEncryptionType":{"name":"requestedEncryptionType","abstract":"<p>The requested encryption type when a session attempts to connect. This setting applies to both video and audio sessions.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)showVideoBackgroundDisplay":{"name":"showVideoBackgroundDisplay","abstract":"<p>When YES, the StreamingMediaManager will send a black screen with &ldquo;Video Backgrounded String&rdquo;. Defaults to YES.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)initWithConnectionManager:configuration:systemCapabilityManager:":{"name":"-initWithConnectionManager:configuration:systemCapabilityManager:","abstract":"<p>Create a new streaming media manager for navigation and projection apps with a specified configuration.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startWithProtocol:":{"name":"-startWithProtocol:","abstract":"<p>Start the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLManager.html\">SDLManager</a></code>.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopAudio":{"name":"-stopAudio","abstract":"<p>Stop the audio feature of the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopVideo":{"name":"-stopVideo","abstract":"<p>Stop the video feature of the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:":{"name":"-sendVideoData:","abstract":"<p>This method receives raw image data and will run iOS8+&lsquo;s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:presentationTimestamp:":{"name":"-sendVideoData:presentationTimestamp:","abstract":"<p>This method receives raw image data and will run iOS8+&lsquo;s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"<p>This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)maximumDesiredEncryption":{"name":"maximumDesiredEncryption","abstract":"<p>What encryption level video/audio streaming should be. The default is SDLStreamingEncryptionFlagAuthenticateAndEncrypt.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)customVideoEncoderSettings":{"name":"customVideoEncoderSettings","abstract":"<p>Properties to use for applications that utilize the video encoder for streaming. See VTCompressionProperties.h for more details. For example, you can set kVTCompressionPropertyKey_ExpectedFrameRate to set your framerate. Setting the framerate this way will also set the framerate if you use CarWindow automatic streaming.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)dataSource":{"name":"dataSource","abstract":"<p>Usable to change run time video stream setup behavior. Only use this and modify the results if you <em>really</em> know what you&rsquo;re doing. The head unit defaults are generally good.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)rootViewController":{"name":"rootViewController","abstract":"<p>Set the initial view controller your video streaming content is within.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)carWindowRenderingType":{"name":"carWindowRenderingType","abstract":"<p>Declares if CarWindow will use layer rendering or view rendering. Defaults to layer rendering.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)enableForcedFramerateSync":{"name":"enableForcedFramerateSync","abstract":"<p>When YES, the StreamingMediaManager will run a CADisplayLink with the framerate set to the video encoder settings kVTCompressionPropertyKey_ExpectedFrameRate. This then forces TouchManager (and CarWindow, if used) to sync their callbacks to the framerate. If using CarWindow, this <em>must</em> be YES. If NO, <code>enableSyncedPanning</code> on SDLTouchManager will be set to NO. Defaults to YES.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)allowMultipleViewControllerOrientations":{"name":"allowMultipleViewControllerOrientations","abstract":"<p>When YES, the StreamingMediaManager will disable its internal checks that the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)rootViewController\">rootViewController</a></code> only has one <code>supportedOrientation</code>. Having multiple orientations can cause streaming issues. If you wish to disable this check, set it to YES. Defaults to NO.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)supportedLandscapeStreamingRange":{"name":"supportedLandscapeStreamingRange","abstract":"<p>Set a landscape image dimension range and/or aspect ratio range that your rootViewController supports. If the module&rsquo;s screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to <code>nil</code>, the default is to support all lanscape streaming ranges. If you wish to disable support for streaming in landscape mode, set a <code>disabled</code> video streaming range.","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)supportedPortraitStreamingRange":{"name":"supportedPortraitStreamingRange","abstract":"<p>Set a portrait image dimension range and/or aspect ratio range that your rootViewController supports. If the module&rsquo;s screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to <code>nil</code>, the default is to support all portrait streaming ranges. If you wish to disable support for streaming in portrait mode, set a <code>disabled</code> video streaming range.","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)delegate":{"name":"delegate","abstract":"<p>The configuration delegate, this is an object conforming to the SDLStreamingVideoDelegate protocol. If video streaming parameters change then this object will be called on.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)init":{"name":"-init","abstract":"<p>Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you&rsquo;d like custom video encoder settings, you can set the property manually.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)secureConfiguration":{"name":"+secureConfiguration","abstract":"<p>Create a secure video streaming configuration. Security managers will be provided from SDLEncryptionConfiguration and the encryption flag will be set to SDLStreamingEncryptionFlagAuthenticateAndEncrypt. If you&rsquo;d like custom video encoder settings, you can set the property manually.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithEncryptionFlag:videoSettings:dataSource:rootViewController:":{"name":"-initWithEncryptionFlag:videoSettings:dataSource:rootViewController:","abstract":"<p>Manually set all the properties to the streaming media configuration</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:":{"name":"-initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:","abstract":"<p>Manually set all the properties to the streaming media configuration</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)insecureConfiguration":{"name":"+insecureConfiguration","abstract":"<p>Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you&rsquo;d like custom video encoder settings, you can set the property manually. This is equivalent to <code>init</code>.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingInsecureConfigurationWithInitialViewController:":{"name":"+autostreamingInsecureConfigurationWithInitialViewController:","abstract":"<p>Create a CarWindow insecure configuration with a view controller</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingSecureConfigurationWithInitialViewController:":{"name":"+autostreamingSecureConfigurationWithInitialViewController:","abstract":"<p>Create a CarWindow secure configuration with a view controller.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(im)initWithCountryCode:fccFacilityId:":{"name":"-initWithCountryCode:fccFacilityId:","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)countryCode":{"name":"countryCode","abstract":"<p>@abstract Binary Representation of ITU Country Code. USA Code is 001.</p>","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)fccFacilityId":{"name":"fccFacilityId","abstract":"<p>@abstract Binary representation of unique facility ID assigned by the FCC","parent_name":"SDLStationIDNumber"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithTimeInterval:":{"name":"-initWithTimeInterval:","abstract":"<p>Create a time struct with a time interval (time in seconds). Fractions of the second will be eliminated and rounded down.</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithHours:minutes:seconds:":{"name":"-initWithHours:minutes:seconds:","abstract":"<p>Create a time struct with hours, minutes, and seconds</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)hours":{"name":"hours","abstract":"<p>The hour of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)minutes":{"name":"minutes","abstract":"<p>The minute of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)seconds":{"name":"seconds","abstract":"<p>The second of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(im)initWithEscSystem:trailerSwayControl:":{"name":"-initWithEscSystem:trailerSwayControl:","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(py)escSystem":{"name":"escSystem","abstract":"<p>true if vehicle stability control is ON, else false</p>","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(py)trailerSwayControl":{"name":"trailerSwayControl","abstract":"<p>true if vehicle trailer sway control is ON, else false</p>","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTS:":{"name":"-initWithTTS:","abstract":"<p>Convenience init to create a speak message</p>","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTSChunks:":{"name":"-initWithTTSChunks:","abstract":"<p>Convenience init to create a speak message</p>","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of TTSChunk structs which, taken together, specify the phrase to be spoken</p>","parent_name":"SDLSpeak"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)name":{"name":"name","abstract":"<p>The name of this soft button state</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)artwork":{"name":"artwork","abstract":"<p>The artwork to be used with this button or nil if it is text-only</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)text":{"name":"text","abstract":"<p>The text to be used with this button or nil if it is image-only</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)highlighted":{"name":"highlighted","abstract":"<p>Whether or not the button should be highlighted on the UI</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)systemAction":{"name":"systemAction","abstract":"<p>A special system action</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)softButton":{"name":"softButton","abstract":"<p>An SDLSoftButton describing this state</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:image:":{"name":"-initWithStateName:text:image:","abstract":"<p>Create the soft button state. Either the text or artwork or both may be set.</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:artwork:":{"name":"-initWithStateName:text:artwork:","abstract":"<p>Create the soft button state. Either the text or artwork or both may be set.</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)name":{"name":"name","abstract":"<p>The name of this button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states":{"name":"states","abstract":"<p>All states available to this button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentState":{"name":"currentState","abstract":"<p>The name of the current state of this soft button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentStateSoftButton":{"name":"currentStateSoftButton","abstract":"<p>Describes an on-screen button which may be presented in various contexts, e.g. templates or alerts</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)eventHandler":{"name":"eventHandler","abstract":"<p>The handler to be called when the button is in the current state and is pressed</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:states:initialStateName:handler:":{"name":"-initWithName:states:initialStateName:handler:","abstract":"<p>Create a multi-state (or single-state, but you should use initWithName:state: instead for that case) soft button. For example, a button that changes its image or text, such as a repeat or shuffle button.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:state:handler:":{"name":"-initWithName:state:handler:","abstract":"<p>Create a single-state soft button. For example, a button that brings up a Perform Interaction menu.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:text:artwork:handler:":{"name":"-initWithName:text:artwork:handler:","abstract":"<p>Create a single-state soft button. For example, a button that brings up a Perform Interaction menu.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToStateNamed:":{"name":"-transitionToStateNamed:","abstract":"<p>Transition the soft button to another state in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states\">states</a></code> property. The wrapper considers all transitions valid (assuming a state with that name exists).</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToNextState":{"name":"-transitionToNextState","abstract":"<p>Transition the soft button to the next state of the array set when in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states\">states</a></code> property</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)stateWithName:":{"name":"-stateWithName:","abstract":"<p>Return a state from the state array with a specific name.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"<p>The button supports a short press.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"<p>The button supports a LONG press.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"<p>The button supports &ldquo;button down&rdquo; and &ldquo;button up&rdquo;.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)imageSupported":{"name":"imageSupported","abstract":"<p>The button supports referencing a static or dynamic image.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)textSupported":{"name":"textSupported","abstract":"<p>The button supports the use of text. If not included, the default value should be considered true that the button will support text.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Convenience init</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithType:text:image:highlighted:buttonId:systemAction:handler:":{"name":"-initWithType:text:image:highlighted:buttonId:systemAction:handler:","abstract":"<p>Convenience init</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)handler":{"name":"handler","abstract":"<p>A handler that may optionally be run when the SDLSoftButton has a corresponding notification occur.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)type":{"name":"type","abstract":"<p>Describes whether this soft button displays only text, only an image, or both</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)text":{"name":"text","abstract":"<p>Optional text to display (if defined as TEXT or BOTH type)</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)image":{"name":"image","abstract":"<p>Optional image struct for SoftButton (if defined as IMAGE or BOTH type)</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)isHighlighted":{"name":"isHighlighted","abstract":"<p>Displays in an alternate mode, e.g. with a colored background or foreground. Depends on the IVI system.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)softButtonID":{"name":"softButtonID","abstract":"<p>Value which is returned via OnButtonPress / OnButtonEvent</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)systemAction":{"name":"systemAction","abstract":"<p>Parameter indicating whether selecting a SoftButton shall call a specific system action. This is intended to allow Notifications to bring the callee into full / focus; or in the case of persistent overlays, the overlay can persist when a SoftButton is pressed.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSliderResponse.html#/c:objc(cs)SDLSliderResponse(py)sliderPosition":{"name":"sliderPosition","abstract":"<p>The selected position of the slider.</p>","parent_name":"SDLSliderResponse"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooters:timeout:cancelID:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooters:timeout:cancelID:","abstract":"<p>Convenience init with all parameters.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:":{"name":"-initWithNumTicks:position:","abstract":"<p>Creates a slider with only the number of ticks and position. Note that this is not enough to get a SUCCESS response. You must supply additional data. See below for required parameters.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooter:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooter:timeout:","abstract":"<p>Creates a slider with all required data and a static footer (or no footer).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooters:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooters:timeout:","abstract":"<p>Creates an slider with all required data and a dynamic footer (or no footer).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)numTicks":{"name":"numTicks","abstract":"<p>Represents a number of selectable items on a horizontal axis.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)position":{"name":"position","abstract":"<p>Initial position of slider control (cannot exceed numTicks).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderHeader":{"name":"sliderHeader","abstract":"<p>Text header to display.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderFooter":{"name":"sliderFooter","abstract":"<p>Text footer to display.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)timeout":{"name":"timeout","abstract":"<p>App defined timeout. Indicates how long of a timeout from the last action (i.e. sliding control resets timeout). If omitted, the value is set to 10 seconds.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific slider to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLSlider"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)status":{"name":"status","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)monitoringSystemStatus":{"name":"monitoringSystemStatus","abstract":"<p>The status of TPMS for this particular tire</p>","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)pressure":{"name":"pressure","abstract":"<p>The pressure value of this particular tire in kPa (kilopascals)</p>","parent_name":"SDLSingleTireStatus"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(im)initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:":{"name":"-initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:","abstract":"<p>Convenience init to create navigation directions</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText1":{"name":"navigationText1","abstract":"<p>The first line of text in a multi-line overlay screen.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText2":{"name":"navigationText2","abstract":"<p>The second line of text in a multi-line overlay screen.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)eta":{"name":"eta","abstract":"<p>Estimated Time of Arrival time at final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)timeToDestination":{"name":"timeToDestination","abstract":"<p>The amount of time needed to reach the final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)totalDistance":{"name":"totalDistance","abstract":"<p>The distance to the final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)turnIcon":{"name":"turnIcon","abstract":"<p>An icon to show with the turn description</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)nextTurnIcon":{"name":"nextTurnIcon","abstract":"<p>An icon to show with the next turn description</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuver":{"name":"distanceToManeuver","abstract":"<p>Distance (in meters) until next maneuver. May be used to calculate progress bar.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuverScale":{"name":"distanceToManeuverScale","abstract":"<p>Distance (in meters) from previous maneuver to next maneuver. May be used to calculate progress bar.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)maneuverComplete":{"name":"maneuverComplete","abstract":"<p>If and when a maneuver has completed while an AlertManeuver is active, the app must send this value set to TRUE in order to clear the AlertManeuver overlay. If omitted the value will be assumed as FALSE.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)softButtons":{"name":"softButtons","abstract":"<p>Three dynamic SoftButtons available (first SoftButton is fixed to &ldquo;Turns&rdquo;). If omitted on supported displays, the currently displayed SoftButton values will not change.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowAppMenu.html#/c:objc(cs)SDLShowAppMenu(im)initWithMenuID:":{"name":"-initWithMenuID:","abstract":"<p>Creates a ShowAppMenu RPC to open the app menu directly to a AddSubMenu RPC&rsquo;s submenu.</p>","parent_name":"SDLShowAppMenu"},"Classes/SDLShowAppMenu.html#/c:objc(cs)SDLShowAppMenu(py)menuID":{"name":"menuID","abstract":"<p>A Menu ID that identifies the AddSubMenu to open if it correlates with the AddSubMenu menuID parameter. If not set the top level menu will be opened.</p>","parent_name":"SDLShowAppMenu"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:":{"name":"-initWithMainField1:mainField2:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:":{"name":"-initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField1":{"name":"mainField1","abstract":"<p>The text displayed in a single-line display, or in the upper display","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField2":{"name":"mainField2","abstract":"<p>The text displayed on the second display line of a two-line display</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField3":{"name":"mainField3","abstract":"<p>The text displayed on the first display line of the second page</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField4":{"name":"mainField4","abstract":"<p>The text displayed on the second display line of the second page</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)alignment":{"name":"alignment","abstract":"<p>The alignment that Specifies how mainField1 and mainField2 text","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)statusBar":{"name":"statusBar","abstract":"<p>Text in the Status Bar</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaClock":{"name":"mediaClock","abstract":"<p>Text value for MediaClock field. Has to be properly formatted by Mobile App according to the module&rsquo;s capabilities. If this text is set, any automatic media clock updates previously set with SetMediaClockTimer will be stopped.","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaTrack":{"name":"mediaTrack","abstract":"<p>The text in the track field</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)graphic":{"name":"graphic","abstract":"<p>An image to be shown on supported displays</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"<p>An image to be shown on supported displays</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)softButtons":{"name":"softButtons","abstract":"<p>The the Soft buttons defined by the App</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)customPresets":{"name":"customPresets","abstract":"<p>The Custom Presets defined by the App</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)metadataTags":{"name":"metadataTags","abstract":"<p>Text Field Metadata</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)windowID":{"name":"windowID","abstract":"<p>This is the unique ID assigned to the window that this RPC is intended. If this param is not included, it will be assumed that this request is specifically for the main window on the main display. - see: PredefinedWindows enum.</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)templateConfiguration":{"name":"templateConfiguration","abstract":"<p>Used to set an alternate template layout to a window.</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)templateTitle":{"name":"templateTitle","abstract":"<p>The title of the current template.</p>","parent_name":"SDLShow"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countUpFromStartTime:toEndTime:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countDownFromStartTime:toEndTime:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)pauseWithPlayPauseIndicator:":{"name":"+pauseWithPlayPauseIndicator:","abstract":"<p>Pause an existing (counting up / down) media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:":{"name":"+updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:","abstract":"<p>Update a pause time (or pause and update the time) on a media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTime:endTime:playPauseIndicator:":{"name":"+updatePauseWithNewStartTime:endTime:playPauseIndicator:","abstract":"<p>Update a pause time (or pause and update the time) on a media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)resumeWithPlayPauseIndicator:":{"name":"+resumeWithPlayPauseIndicator:","abstract":"<p>Resume a paused media clock timer. It resumes at the same time at which it was paused.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Resume a paused media clock timer. It resumes at the same time at which it was paused.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)clearWithPlayPauseIndicator:":{"name":"+clearWithPlayPauseIndicator:","abstract":"<p>Remove a media clock timer from the screen</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:":{"name":"-initWithUpdateMode:","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:startTime:endTime:playPauseIndicator:":{"name":"-initWithUpdateMode:startTime:endTime:playPauseIndicator:","abstract":"<p>Create a SetMediaClockTimer RPC with all available parameters. It&rsquo;s recommended to use the specific initializers above.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"-initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)startTime":{"name":"startTime","abstract":"<p>A Start Time with specifying hour, minute, second values</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)endTime":{"name":"endTime","abstract":"<p>An END time of type SDLStartTime, specifying hour, minute, second values</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)updateMode":{"name":"updateMode","abstract":"<p>The media clock/timer update mode (COUNTUP/COUNTDOWN/PAUSE/RESUME)</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)audioStreamingIndicator":{"name":"audioStreamingIndicator","abstract":"<p>The audio streaming indicator used for a play/pause button.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)forwardSeekIndicator":{"name":"forwardSeekIndicator","abstract":"<p>Used to control the forward seek button to either skip forward a set amount of time or to the next track.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)backSeekIndicator":{"name":"backSeekIndicator","abstract":"<p>Used to control the back seek button to either skip back a set amount of time or to the previous track.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)countRate":{"name":"countRate","abstract":"<p>The value of this parameter is the amount that the media clock timer will advance per 1.0 seconds of real time. Values less than 1.0 will therefore advance the timer slower than real-time, while values greater than 1.0 will advance the timer faster than real-time. e.g. If this parameter is set to <code>0.5</code>, the timer will advance one second per two seconds real-time, or at 50% speed. If this parameter is set to <code>2.0</code>, the timer will advance two seconds per one second real-time, or at 200% speed.","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetInteriorVehicleDataResponse.html#/c:objc(cs)SDLSetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"<p>The new module data for the requested module</p>","parent_name":"SDLSetInteriorVehicleDataResponse"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(im)initWithModuleData:":{"name":"-initWithModuleData:","abstract":"<p>Convenience init to change settings of a module</p>","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"<p>The module data to set for the requested RC module.</p>","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:","abstract":"<p>Initialize SetGlobalProperties with all possible items</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithUserLocation:helpPrompt:timeoutPrompt:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:":{"name":"-initWithUserLocation:helpPrompt:timeoutPrompt:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:","abstract":"<p>Convenience init for setting all possible global properties</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Help prompt for when the user asks for help with an interface prompt</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Help prompt for when an interface prompt times out</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelpTitle":{"name":"vrHelpTitle","abstract":"<p>Sets a voice recognition Help Title</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelp":{"name":"vrHelp","abstract":"<p>Sets the items listed in the VR help screen used in an interaction started by Push to Talk</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuTitle":{"name":"menuTitle","abstract":"<p>Text for the menu button label</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuIcon":{"name":"menuIcon","abstract":"<p>Icon for the menu button</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)keyboardProperties":{"name":"keyboardProperties","abstract":"<p>On-screen keyboard (perform interaction) configuration</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)userLocation":{"name":"userLocation","abstract":"<p>Location of the user&rsquo;s seat. Default is driver&rsquo;s seat location if it is not set yet</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuLayout":{"name":"menuLayout","abstract":"<p>The main menu layout. If this is sent while a menu is already on-screen, the head unit will change the display to the new layout type. See available menu layouts on DisplayCapabilities.menuLayoutsAvailable. Defaults to the head unit default.</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>The display capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>The button capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>The soft button capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>The preset bank capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:":{"name":"-initWithPredefinedLayout:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithLayout:":{"name":"-initWithLayout:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:dayColorScheme:nightColorScheme:":{"name":"-initWithPredefinedLayout:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithLayout:dayColorScheme:nightColorScheme:":{"name":"-initWithLayout:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)displayLayout":{"name":"displayLayout","abstract":"<p>A display layout. Predefined or dynamically created screen layout.","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;light&rdquo; or &ldquo;day&rdquo; color scheme. The OEM may only support this theme if their head unit only has a light color scheme.</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;dark&rdquo; or &ldquo;night&rdquo; color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init.</p>","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(py)properties":{"name":"properties","abstract":"<p>The new cloud application properties.</p>","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init to set an image icon from a file name. The file must already be uploaded to the head unit.</p>","parent_name":"SDLSetAppIcon"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(py)syncFileName":{"name":"syncFileName","abstract":"<p>A file reference name","parent_name":"SDLSetAppIcon"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:":{"name":"-initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:","abstract":"<p>Create a <code>SendLocation</code> request with an address object, without Lat/Long coordinates.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:","abstract":"<p>Create a <code>SendLocation</code> request with Lat/Long coordinate, not an address object</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:","abstract":"<p>Create a <code>SendLocation</code> request with Lat/Long coordinate and an address object and let the nav system decide how to parse it</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>The longitudinal coordinate of the location. Either the latitude / longitude OR the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address\">address</a></code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>The latitudinal coordinate of the location. Either the latitude / longitude OR the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address\">address</a></code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationName":{"name":"locationName","abstract":"<p>Name / title of intended location</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationDescription":{"name":"locationDescription","abstract":"<p>Description of the intended location / establishment</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)addressLines":{"name":"addressLines","abstract":"<p>Location address for display purposes only.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)phoneNumber":{"name":"phoneNumber","abstract":"<p>Phone number of intended location / establishment</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationImage":{"name":"locationImage","abstract":"<p>Image / icon of intended location</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)deliveryMode":{"name":"deliveryMode","abstract":"<p>Mode in which the sendLocation request is sent</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)timeStamp":{"name":"timeStamp","abstract":"<p>Arrival time of Location. If multiple SendLocations are sent, this will be used for sorting as well.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address":{"name":"address","abstract":"<p>Address to be used for setting destination. Either the latitude / longitude OR the <code>address</code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(im)initWithHapticRectData:":{"name":"-initWithHapticRectData:","abstract":"<p>Constructs a new SDLSendHapticData object indicated by the hapticSpatialData parameter</p>","parent_name":"SDLSendHapticData"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(py)hapticRectData":{"name":"hapticRectData","abstract":"<p>Array of spatial data structures that represent the locations of all user controls present on the HMI. This data should be updated if/when the application presents a new screen. When a request is sent, if successful, it will replace all spatial data previously sent through RPC. If an empty array is sent, the existing spatial data will be cleared</p>","parent_name":"SDLSendHapticData"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(im)initWithType:":{"name":"-initWithType:","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(im)initWithType:seekTime:":{"name":"-initWithType:seekTime:","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(cm)seekIndicatorWithSeekTime:":{"name":"+seekIndicatorWithSeekTime:","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(py)type":{"name":"type","abstract":"<p>Undocumented</p>","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(py)seekTime":{"name":"seekTime","abstract":"<p>If the type is TIME, this number of seconds may be present alongside the skip indicator. It will indicate the number of seconds that the currently playing media will skip forward or backward.","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeatStatus.html#/c:objc(cs)SDLSeatStatus(im)initWithSeatLocation:conditionActive:":{"name":"-initWithSeatLocation:conditionActive:","parent_name":"SDLSeatStatus"},"Classes/SDLSeatStatus.html#/c:objc(cs)SDLSeatStatus(py)seatLocation":{"name":"seatLocation","abstract":"<p>Undocumented</p>","parent_name":"SDLSeatStatus"},"Classes/SDLSeatStatus.html#/c:objc(cs)SDLSeatStatus(py)conditionActive":{"name":"conditionActive","abstract":"<p>Undocumented</p>","parent_name":"SDLSeatStatus"},"Classes/SDLSeatOccupancy.html#/c:objc(cs)SDLSeatOccupancy(im)initWithSeatsOccupied:seatsBelted:":{"name":"-initWithSeatsOccupied:seatsBelted:","parent_name":"SDLSeatOccupancy"},"Classes/SDLSeatOccupancy.html#/c:objc(cs)SDLSeatOccupancy(py)seatsOccupied":{"name":"seatsOccupied","abstract":"<p>Seat status array containing location and whether the seats are occupied.","parent_name":"SDLSeatOccupancy"},"Classes/SDLSeatOccupancy.html#/c:objc(cs)SDLSeatOccupancy(py)seatsBelted":{"name":"seatsBelted","abstract":"<p>Seat status array containing location and whether the seats are belted.","parent_name":"SDLSeatOccupancy"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:action:":{"name":"-initWithId:action:","abstract":"<p>@abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:label:action:":{"name":"-initWithId:label:action:","abstract":"<p>@abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)id":{"name":"id","abstract":"<p>@abstract id of the action to be performed.</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)label":{"name":"label","abstract":"<p>@abstract label of the action to be performed.</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)action":{"name":"action","abstract":"<p>@abstract type of action to be performed</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(im)initWithSeats:cols:rows:levels:":{"name":"-initWithSeats:cols:rows:levels:","abstract":"<p>Constructs a newly allocated SDLSeatLocationCapability object with all parameters</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)cols":{"name":"cols","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)rows":{"name":"rows","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)levels":{"name":"levels","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)seats":{"name":"seats","abstract":"<p>Contains a list of SeatLocation in the vehicle, the first element is the driver&rsquo;s seat","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocation.html#/c:objc(cs)SDLSeatLocation(py)grid":{"name":"grid","abstract":"<p>Optional</p>","parent_name":"SDLSeatLocation"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithHeatingEnabled:coolingEnabled:heatingLevel:coolingLevel:horizontalPosition:verticalPosition:frontVerticalPosition:backVerticalPosition:backTiltAngle:headSupportHorizontalPosition:headSupportVerticalPosition:massageEnabled:massageMode:massageCushionFirmness:memory:":{"name":"-initWithHeatingEnabled:coolingEnabled:heatingLevel:coolingLevel:horizontalPosition:verticalPosition:frontVerticalPosition:backVerticalPosition:backTiltAngle:headSupportHorizontalPosition:headSupportVerticalPosition:massageEnabled:massageMode:massageCushionFirmness:memory:","abstract":"<p>Convenience init for setting all possible seat control data</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Constructs a newly allocated SDLSeatControlData object with cushion and firmness</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:":{"name":"-initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:","abstract":"<p>Constructs a newly allocated SDLSeatControlData object with cushion and firmness</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)id":{"name":"id","abstract":"<p>@abstract id of seat that is a remote controllable seat.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingEnabled":{"name":"heatingEnabled","abstract":"<p>@abstract Whether or not heating is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingEnabled":{"name":"coolingEnabled","abstract":"<p>@abstract Whether or not cooling is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingLevel":{"name":"heatingLevel","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingLevel":{"name":"coolingLevel","abstract":"<p>@abstract cooling level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)horizontalPosition":{"name":"horizontalPosition","abstract":"<p>@abstract horizontal Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)verticalPosition":{"name":"verticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)frontVerticalPosition":{"name":"frontVerticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backVerticalPosition":{"name":"backVerticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backTiltAngle":{"name":"backTiltAngle","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportHorizontalPosition":{"name":"headSupportHorizontalPosition","abstract":"<p>@abstract head Support Horizontal Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportVerticalPosition":{"name":"headSupportVerticalPosition","abstract":"<p>@abstract head Support Vertical Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageEnabled":{"name":"massageEnabled","abstract":"<p>@abstract Whether or not massage is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageMode":{"name":"massageMode","abstract":"<p>@abstract Array of massage mode data.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageCushionFirmness":{"name":"massageCushionFirmness","abstract":"<p>@abstract Array of firmness of a cushion.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)memory":{"name":"memory","abstract":"<p>@abstract type of action to be performed</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:moduleInfo:":{"name":"-initWithName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with moduleName and moduleInfo</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:moduleInfo:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:":{"name":"-initWithName:moduleInfo:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with all parameters</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the light control module.","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingEnabledAvailable":{"name":"heatingEnabledAvailable","abstract":"<p>@abstract Whether or not heating is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingEnabledAvailable":{"name":"coolingEnabledAvailable","abstract":"<p>@abstract Whether or not cooling is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingLevelAvailable":{"name":"heatingLevelAvailable","abstract":"<p>@abstract Whether or not heating level is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingLevelAvailable":{"name":"coolingLevelAvailable","abstract":"<p>@abstract Whether or not cooling level is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)horizontalPositionAvailable":{"name":"horizontalPositionAvailable","abstract":"<p>@abstract Whether or not horizontal Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)verticalPositionAvailable":{"name":"verticalPositionAvailable","abstract":"<p>@abstract Whether or not vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)frontVerticalPositionAvailable":{"name":"frontVerticalPositionAvailable","abstract":"<p>@abstract Whether or not front Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backVerticalPositionAvailable":{"name":"backVerticalPositionAvailable","abstract":"<p>@abstract Whether or not back Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backTiltAngleAvailable":{"name":"backTiltAngleAvailable","abstract":"<p>@abstract Whether or not backTilt Angle Available is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportHorizontalPositionAvailable":{"name":"headSupportHorizontalPositionAvailable","abstract":"<p>@abstract Whether or not head Supports for Horizontal Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportVerticalPositionAvailable":{"name":"headSupportVerticalPositionAvailable","abstract":"<p>@abstract Whether or not head Supports for Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageEnabledAvailable":{"name":"massageEnabledAvailable","abstract":"<p>@abstract Whether or not massage Enabled is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageModeAvailable":{"name":"massageModeAvailable","abstract":"<p>@abstract Whether or not massage Mode is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageCushionFirmnessAvailable":{"name":"massageCushionFirmnessAvailable","abstract":"<p>@abstract Whether or not massage Cushion Firmness is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)memoryAvailable":{"name":"memoryAvailable","abstract":"<p>@abstract Whether or not memory is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>@abstract Information about a RC module, including its id.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:":{"name":"-initWithMessage:","abstract":"<p>Convenience init for creating a scrolling message with text.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:timeout:softButtons:cancelID:":{"name":"-initWithMessage:timeout:softButtons:cancelID:","abstract":"<p>Convenience init for creating a scrolling message with text and buttons.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)scrollableMessageBody":{"name":"scrollableMessageBody","abstract":"<p>Body of text that can include newlines and tabs.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)timeout":{"name":"timeout","abstract":"<p>App defined timeout. Indicates how long of a timeout from the last action (i.e. scrolling message resets timeout). If not set, a default value of 30 seconds is used by Core.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)softButtons":{"name":"softButtons","abstract":"<p>Buttons for the displayed scrollable message. If omitted on supported displays, only the system defined &ldquo;Close&rdquo; SoftButton will be displayed.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific scrollable message to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)resolution":{"name":"resolution","abstract":"<p>The resolution of the prescribed screen area</p>","parent_name":"SDLScreenParams"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)touchEventAvailable":{"name":"touchEventAvailable","abstract":"<p>Types of screen touch events available in screen area</p>","parent_name":"SDLScreenParams"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1":{"name":"textField1","abstract":"<p>The top text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2":{"name":"textField2","abstract":"<p>The second text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3":{"name":"textField3","abstract":"<p>The third text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4":{"name":"textField4","abstract":"<p>The fourth text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)mediaTrackTextField":{"name":"mediaTrackTextField","abstract":"<p>The media text field available within the media layout. Often less emphasized than textField(1-4)</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)primaryGraphic":{"name":"primaryGraphic","abstract":"<p>The primary graphic within a template layout</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"<p>A secondary graphic used in some template layouts</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textAlignment":{"name":"textAlignment","abstract":"<p>What alignment textField(1-4) should use</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1Type":{"name":"textField1Type","abstract":"<p>The type of data textField1 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2Type":{"name":"textField2Type","abstract":"<p>The type of data textField2 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3Type":{"name":"textField3Type","abstract":"<p>The type of data textField3 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4Type":{"name":"textField4Type","abstract":"<p>The type of data textField4 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)title":{"name":"title","abstract":"<p>The title of the current template layout.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)softButtonObjects":{"name":"softButtonObjects","abstract":"<p>The current list of soft buttons within a template layout. Set this array to change the displayed soft buttons.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)menuConfiguration":{"name":"menuConfiguration","abstract":"<p>Configures the layout of the menu and sub-menus. If set after a menu already exists, the existing main menu layout will be updated.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)menu":{"name":"menu","abstract":"<p>The current list of menu cells displayed in the app&rsquo;s menu.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)dynamicMenuUpdatesMode":{"name":"dynamicMenuUpdatesMode","abstract":"<p>Change the mode of the dynamic menu updater to be enabled, disabled, or enabled on known compatible head units.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The current list of voice commands available for the user to speak and be recognized by the IVI&rsquo;s voice recognition engine.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)keyboardConfiguration":{"name":"keyboardConfiguration","abstract":"<p>The default keyboard configuration, this can be additionally customized by each SDLKeyboardDelegate.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)preloadedChoices":{"name":"preloadedChoices","abstract":"<p>Cells will be hashed by their text, image names, and VR command text. When assembling an SDLChoiceSet, you can pull objects from here, or recreate them. The preloaded versions will be used so long as their text, image names, and VR commands are the same.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)initWithConnectionManager:fileManager:systemCapabilityManager:":{"name":"-initWithConnectionManager:fileManager:systemCapabilityManager:","abstract":"<p>Initialize a screen manager</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager:":{"name":"-initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager:","abstract":"<p>Initialize a screen manager</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>Starts the manager and all sub-managers</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)beginUpdates":{"name":"-beginUpdates","abstract":"<p>Delays all screen updates until endUpdatesWithCompletionHandler: is called.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdates":{"name":"-endUpdates","abstract":"<p>Pairs with <code>beginUpdates:</code> to batch text, graphic, and layout changes into a single update with a callback when the update is complete.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdatesWithCompletionHandler:":{"name":"-endUpdatesWithCompletionHandler:","abstract":"<p>Pairs with <code>beginUpdates:</code> to batch text, graphic, and layout changes into a single update with a callback when the update is complete.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)changeLayout:withCompletionHandler:":{"name":"-changeLayout:withCompletionHandler:","abstract":"<p>Change the current layout to a new layout and optionally update the layout&rsquo;s night and day color schemes. The values set for the text, graphics, buttons and template title persist between layout changes. To update the text, graphics, buttons and template title at the same time as the template, batch all the updates between <code>beginUpdates</code> and <code>endUpdates</code>. If the layout update fails while batching, then the updated text, graphics, buttons or template title will also not be updated.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)softButtonObjectNamed:":{"name":"-softButtonObjectNamed:","abstract":"<p>Retrieve a SoftButtonObject based on its name.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)subscribeButton:withUpdateHandler:":{"name":"-subscribeButton:withUpdateHandler:","abstract":"<p>Subscribes to a subscribe button. The update handler will be called when the button has been selected. If there is an error subscribing to the subscribe button it will be returned in the <code>error</code> parameter of the updateHandler.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)subscribeButton:withObserver:selector:":{"name":"-subscribeButton:withObserver:selector:","abstract":"<p>Subscribes to a subscribe button. The selector will be called when the button has been selected. If there is an error subscribing to the subscribe button it will be returned in the <code>error</code> parameter of the selector.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)unsubscribeButton:withObserver:withCompletionHandler:":{"name":"-unsubscribeButton:withObserver:withCompletionHandler:","abstract":"<p>Unsubscribes to a subscribe button. Please note that if a subscribe button has multiple subscribers the observer will no longer get notifications, however, the app will still be subscribed to the hard button until the last subscriber is removed.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)preloadChoices:withCompletionHandler:":{"name":"-preloadChoices:withCompletionHandler:","abstract":"<p>Preload cells to the head unit. This will <em>greatly</em> reduce the time taken to present a choice set. Any already matching a choice already on the head unit will be ignored. You <em>do not</em> need to wait until the completion handler is called to present a choice set containing choices being loaded. The choice set will wait until the preload completes and then immediately present.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)deleteChoices:":{"name":"-deleteChoices:","abstract":"<p>Delete loaded cells from the head unit. If the cells don&rsquo;t exist on the head unit they will be ignored.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentChoiceSet:mode:":{"name":"-presentChoiceSet:mode:","abstract":"<p>Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you&rsquo;re lazy&hellip;for real though, it&rsquo;s kind of confusing to the user and isn&rsquo;t recommended.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentSearchableChoiceSet:mode:withKeyboardDelegate:":{"name":"-presentSearchableChoiceSet:mode:withKeyboardDelegate:","abstract":"<p>Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you&rsquo;re lazy&hellip;for real though, it&rsquo;s kind of confusing to the user and isn&rsquo;t recommended.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentKeyboardWithInitialText:delegate:":{"name":"-presentKeyboardWithInitialText:delegate:","abstract":"<p>Present a keyboard-only interface to the user and receive input. The user will be able to input text in the keyboard when in a non-driver distraction situation.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)dismissKeyboardWithCancelID:":{"name":"-dismissKeyboardWithCancelID:","abstract":"<p>Cancels the keyboard-only interface if it is currently showing. If the keyboard has not yet been sent to Core, it will not be sent.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)openMenu":{"name":"-openMenu","abstract":"<p>Present the top-level of your application menu. This method should be called if the menu needs to be opened programmatically because the built in menu button is hidden.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)openSubmenu:":{"name":"-openSubmenu:","abstract":"<p>Present the application menu. This method should be called if the menu needs to be opened programmatically because the built in menu button is hidden. You must update the menu with the proper cells before calling this method. This RPC will fail if the cell does not contain a sub menu, or is not in the menu array.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentAlert:withCompletionHandler:":{"name":"-presentAlert:withCompletionHandler:","abstract":"<p>Present the alert on the screen. To replace a currently presenting alert with a new alert, you must first call <code>cancel</code> on the currently presenting alert before sending the new alert. Otherwise the newest alert will only be presented when the module dismisses the currently presented alert (either due to the timeout or the user selecting a button on the alert). Please note that cancelling a currently presented alert will only work on modules supporting RPC Spec v.5.0+.</p>","parent_name":"SDLScreenManager"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(im)initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:":{"name":"-initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:","abstract":"<p>Convenience init to SISData</p>","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationShortName":{"name":"stationShortName","abstract":"<p>@abstract Identifies the 4-alpha-character station call sign","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationIDNumber":{"name":"stationIDNumber","abstract":"<p>@abstract Used for network Application.","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLongName":{"name":"stationLongName","abstract":"<p>@abstract Identifies the station call sign or other identifying","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLocation":{"name":"stationLocation","abstract":"<p>@abstract Provides the 3-dimensional geographic station location</p>","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationMessage":{"name":"stationMessage","abstract":"<p>@abstract May be used to convey textual information of general interest","parent_name":"SDLSISData"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(im)initWithLocation:status:":{"name":"-initWithLocation:status:","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(im)initWithLocation:status:state:":{"name":"-initWithLocation:status:state:","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(py)location":{"name":"location","abstract":"<p>Undocumented</p>","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(py)status":{"name":"status","abstract":"<p>Undocumented</p>","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(py)state":{"name":"state","abstract":"<p>Undocumented</p>","parent_name":"SDLRoofStatus"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init to reset global properties.</p>","parent_name":"SDLResetGlobalProperties"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(py)properties":{"name":"properties","abstract":"<p>An array of one or more GlobalProperty enumeration elements","parent_name":"SDLResetGlobalProperties"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(im)initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:":{"name":"-initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:","abstract":"<p>Constructs a newly allocated SDLRemoteControlCapabilities object with given parameters</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)climateControlCapabilities":{"name":"climateControlCapabilities","abstract":"<p>If included, the platform supports RC climate controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)radioControlCapabilities":{"name":"radioControlCapabilities","abstract":"<p>If included, the platform supports RC radio controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>If included, the platform supports RC button controls with the included button names.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)seatControlCapabilities":{"name":"seatControlCapabilities","abstract":"<p>If included, the platform supports seat controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)audioControlCapabilities":{"name":"audioControlCapabilities","abstract":"<p>If included, the platform supports audio controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)hmiSettingsControlCapabilities":{"name":"hmiSettingsControlCapabilities","abstract":"<p>If included, the platform supports hmi setting controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)lightControlCapabilities":{"name":"lightControlCapabilities","abstract":"<p>If included, the platform supports light controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(im)initWithModuleType:moduleId:":{"name":"-initWithModuleType:moduleId:","abstract":"<p>Convenience init to release a controlled module</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(py)moduleType":{"name":"moduleType","abstract":"<p>The module type that the app requests to control.</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)sdlMsgVersion":{"name":"sdlMsgVersion","abstract":"<p>Specifies the negotiated version number of the SmartDeviceLink protocol that is to be supported by the mobile application.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)language":{"name":"language","abstract":"<p>The currently active VR+TTS language on the module. See &ldquo;Language&rdquo; for options.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>The currently active display language on the module. See &ldquo;Language&rdquo; for options.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>Contains information about the display&rsquo;s capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>Contains information about the head unit button capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>Contains information about the head unit soft button capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>If returned, the platform supports custom on-screen Presets</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"<p>Contains information about the HMI zone capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)speechCapabilities":{"name":"speechCapabilities","abstract":"<p>Contains information about the text-to-speech capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)prerecordedSpeech":{"name":"prerecordedSpeech","abstract":"<p>Contains a list of prerecorded speech items present on the platform.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vrCapabilities":{"name":"vrCapabilities","abstract":"<p>Contains information about the VR capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"<p>Describes different audio type configurations for PerformAudioPassThru, e.g. {8kHz,8-bit,PCM}. The audio is recorded in monaural.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)pcmStreamCapabilities":{"name":"pcmStreamCapabilities","abstract":"<p>Describes different audio type configurations for the audio PCM stream service, e.g. {8kHz,8-bit,PCM}</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vehicleType":{"name":"vehicleType","abstract":"<p>Specifies the vehicle&rsquo;s type. See VehicleType.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)supportedDiagModes":{"name":"supportedDiagModes","abstract":"<p>Specifies the white-list of supported diagnostic modes (0x00-0xFF) capable for DiagnosticMessage requests. If a mode outside this list is requested, it will be rejected.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"<p>Specifies the HMI capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)sdlVersion":{"name":"sdlVersion","abstract":"<p>The version of SDL Core running on the connected head unit</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)systemSoftwareVersion":{"name":"systemSoftwareVersion","abstract":"<p>The software version of the system that implements the SmartDeviceLink core.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)iconResumed":{"name":"iconResumed","abstract":"<p>Existence of apps icon at system. If true, apps icon was resumed at system. If false, apps icon is not resumed at system.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithLifecycleConfiguration:":{"name":"-initWithLifecycleConfiguration:","abstract":"<p>Convenience init for registering the application with a lifecycle configuration.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:":{"name":"-initWithAppName:appId:languageDesired:","abstract":"<p>Convenience init for registering the application with an app name, app id, and desired language.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:":{"name":"-initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init for registering the application with all possible options.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)sdlMsgVersion":{"name":"sdlMsgVersion","abstract":"<p>Specifies the version number of the SmartDeviceLink protocol that is supported by the mobile application.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appName":{"name":"appName","abstract":"<p>The mobile application&rsquo;s name. This name is displayed in the SDL Mobile Applications menu. It also serves as the unique identifier of the application for SmartDeviceLink. Applications with the same name will be rejected.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ttsName":{"name":"ttsName","abstract":"<p>Text-to-speech string for voice recognition of the mobile application name. Meant to overcome any failing on speech engine in properly pronouncing / understanding app name.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"<p>Provides an abbreviated version of the app name (if needed), that will be displayed on head units that support very few characters. If not provided, the appName is used instead (and will be truncated if too long). It&rsquo;s recommended that this string be no longer than 5 characters.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)vrSynonyms":{"name":"vrSynonyms","abstract":"<p>Defines additional voice recognition commands</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)isMediaApplication":{"name":"isMediaApplication","abstract":"<p>Indicates if the application is a media or a non-media application. Media applications will appear in the head unit&rsquo;s media source list and can use the <code>MEDIA</code> template.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)languageDesired":{"name":"languageDesired","abstract":"<p>App&rsquo;s starting VR+TTS language. If there is a mismatch with the head unit, the app will be able to change its language with ChangeRegistration prior to app being brought into focus.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hmiDisplayLanguageDesired":{"name":"hmiDisplayLanguageDesired","abstract":"<p>Current app&rsquo;s expected display language. If there is a mismatch with the head unit, the app will be able to change its language with ChangeRegistration prior to app being brought into focus.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appHMIType":{"name":"appHMIType","abstract":"<p>List of all applicable app HMI types stating which HMI classifications to be given to the app.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hashID":{"name":"hashID","abstract":"<p>ID used to uniquely identify a previous state of all app data that can persist through connection cycles (e.g. ignition cycles). This registered data (commands, submenus, choice sets, etc.) can be reestablished without needing to explicitly re-send each piece. If omitted, then the previous state of an app&rsquo;s commands, etc. will not be restored.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)deviceInfo":{"name":"deviceInfo","abstract":"<p>Information about the connecting device.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appID":{"name":"appID","abstract":"<p>ID used to validate app with policy table entries.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)fullAppID":{"name":"fullAppID","abstract":"<p>A full UUID appID used to validate app with policy table entries.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appInfo":{"name":"appInfo","abstract":"<p>Contains detailed information about the registered application.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;light&rdquo; or &ldquo;day&rdquo; color scheme. The OEM may only support this theme if their head unit only has a light color scheme.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;dark&rdquo; or &ldquo;night&rdquo; color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithX:y:width:height:":{"name":"-initWithX:y:width:height:","abstract":"<p>Create a Rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithCGRect:":{"name":"-initWithCGRect:","abstract":"<p>Create a Rectangle from a CGRect</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)x":{"name":"x","abstract":"<p>The X-coordinate of the user control</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)y":{"name":"y","abstract":"<p>The Y-coordinate of the user control</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)width":{"name":"width","abstract":"<p>The width of the user control&rsquo;s bounding rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)height":{"name":"height","abstract":"<p>The height of the user control&rsquo;s bounding rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLReadDIDResponse.html#/c:objc(cs)SDLReadDIDResponse(py)didResult":{"name":"didResult","abstract":"<p>Array of requested DID results (with data if available).</p>","parent_name":"SDLReadDIDResponse"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(im)initWithECUName:didLocation:":{"name":"-initWithECUName:didLocation:","abstract":"<p>Convenience init</p>","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)ecuName":{"name":"ecuName","abstract":"<p>An ID of the vehicle module","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)didLocation":{"name":"didLocation","abstract":"<p>Raw data from vehicle data DID location(s)","parent_name":"SDLReadDID"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:":{"name":"-initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initFMWithFrequencyInteger:frequencyFraction:hdChannel:":{"name":"-initFMWithFrequencyInteger:frequencyFraction:hdChannel:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initAMWithFrequencyInteger:hdChannel:":{"name":"-initAMWithFrequencyInteger:hdChannel:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initXMWithFrequencyInteger:":{"name":"-initXMWithFrequencyInteger:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyInteger":{"name":"frequencyInteger","abstract":"<p>The integer part of the frequency ie for 101.7 this value should be 101</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyFraction":{"name":"frequencyFraction","abstract":"<p>The fractional part of the frequency for 101.7 is 7</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)band":{"name":"band","abstract":"<p>Radio band value</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)rdsData":{"name":"rdsData","abstract":"<p>Read only parameter. See RDSData data type for details.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)availableHDs":{"name":"availableHDs","abstract":"<p>number of HD sub-channels if available</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)availableHDChannels":{"name":"availableHDChannels","abstract":"<p>the list of available hd sub-channel indexes, empty list means no Hd channel is available, read-only</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdChannel":{"name":"hdChannel","abstract":"<p>Current HD sub-channel if available</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalStrength":{"name":"signalStrength","abstract":"<p>Signal Strength Value</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalChangeThreshold":{"name":"signalChangeThreshold","abstract":"<p>If the signal strength falls below the set value for this parameter, the radio will tune to an alternative frequency</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)radioEnable":{"name":"radioEnable","abstract":"<p>True if the radio is on, false is the radio is off. When the radio is disabled, no data other than radioEnable is included in a GetInteriorVehicleData response</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)state":{"name":"state","abstract":"<p>Read only parameter. See RadioState data type for details.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdRadioEnable":{"name":"hdRadioEnable","abstract":"<p>True if the hd radio is on, false is the radio is off</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)sisData":{"name":"sisData","abstract":"<p>Read Read-only Station Information Service (SIS) data provides basic information","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(im)initWithModuleName:moduleInfo:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDChannelsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:":{"name":"-initWithModuleName:moduleInfo:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDChannelsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>The short friendly name of the radio control module.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioEnableAvailable":{"name":"radioEnableAvailable","abstract":"<p>Availability of the control of enable/disable radio.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioBandAvailable":{"name":"radioBandAvailable","abstract":"<p>Availability of the control of radio band.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioFrequencyAvailable":{"name":"radioFrequencyAvailable","abstract":"<p>Availability of the control of radio frequency.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdChannelAvailable":{"name":"hdChannelAvailable","abstract":"<p>Availability of the control of HD radio channel.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)rdsDataAvailable":{"name":"rdsDataAvailable","abstract":"<p>Availability of the getting Radio Data System (RDS) data.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)availableHDsAvailable":{"name":"availableHDsAvailable","abstract":"<p>Availability of the getting the number of available HD channels.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)availableHDChannelsAvailable":{"name":"availableHDChannelsAvailable","abstract":"<p>Availability of the list of available HD sub-channel indexes.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)stateAvailable":{"name":"stateAvailable","abstract":"<p>Availability of the getting the Radio state.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalStrengthAvailable":{"name":"signalStrengthAvailable","abstract":"<p>Availability of the getting the signal strength.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalChangeThresholdAvailable":{"name":"signalChangeThresholdAvailable","abstract":"<p>Availability of the getting the signal Change Threshold</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdRadioEnableAvailable":{"name":"hdRadioEnableAvailable","abstract":"<p>Availability of the control of enable/disable HD radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)siriusXMRadioAvailable":{"name":"siriusXMRadioAvailable","abstract":"<p>Availability of sirius XM radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)sisDataAvailable":{"name":"sisDataAvailable","abstract":"<p>Availability of the getting HD radio Station Information Service (SIS) data.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(py)store":{"name":"store","abstract":"<p>The store that contains RPC data</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(py)payloadProtected":{"name":"payloadProtected","abstract":"<p>Declares if the RPC payload ought to be protected</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)initWithDictionary:":{"name":"-initWithDictionary:","abstract":"<p>Convenience init</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)serializeAsDictionary:":{"name":"-serializeAsDictionary:","abstract":"<p>Converts struct to JSON formatted data</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(py)response":{"name":"response","abstract":"<p>The response to be included within the userinfo dictionary</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)initWithName:object:rpcResponse:":{"name":"-initWithName:object:rpcResponse:","abstract":"<p>Create an NSNotification object containing an SDLRPCResponse</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseMemberOfClass:":{"name":"-isResponseMemberOfClass:","abstract":"<p>Returns whether or not the containing response is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseKindOfClass:":{"name":"-isResponseKindOfClass:","abstract":"<p>Returns whether or not the containing response is a kind of class, including subclasses.</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)correlationID":{"name":"correlationID","abstract":"<p>The correlation id of the corresponding SDLRPCRequest.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)success":{"name":"success","abstract":"<p>Whether or not the SDLRPCRequest was successful.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)resultCode":{"name":"resultCode","abstract":"<p>The result of the SDLRPCRequest. If the request failed, the result code contains the failure reason.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)info":{"name":"info","abstract":"<p>More detailed success or error message.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(py)request":{"name":"request","abstract":"<p>The request to be included in the userinfo dictionary</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)initWithName:object:rpcRequest:":{"name":"-initWithName:object:rpcRequest:","abstract":"<p>Create an NSNotification object containing an SDLRPCRequest</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestMemberOfClass:":{"name":"-isRequestMemberOfClass:","abstract":"<p>Returns whether or not the containing request is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestKindOfClass:":{"name":"-isRequestKindOfClass:","abstract":"<p>Returns whether or not the containing request is a kind of class, including subclasses.</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequest.html#/c:objc(cs)SDLRPCRequest(py)correlationID":{"name":"correlationID","abstract":"<p>A unique id assigned to message sent to Core. The Correlation ID is used to map a request to its response.</p>","parent_name":"SDLRPCRequest"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcAllowed":{"name":"rpcAllowed","abstract":"<p>Whether or not the RPC is allowed.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcParameters":{"name":"rpcParameters","abstract":"<p>Holds a dictionary of RPC parameters and objects of an NSNumber<BOOL> specifying if that RPC parameter is currently allowed</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(im)initWithRPCName:isRPCAllowed:rpcParameters:":{"name":"-initWithRPCName:isRPCAllowed:rpcParameters:","abstract":"<p>Initializes a SDLRPCPermissionStatus object.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(py)notification":{"name":"notification","abstract":"<p>The notification within the userinfo dictionary</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)initWithName:object:rpcNotification:":{"name":"-initWithName:object:rpcNotification:","abstract":"<p>Create an NSNotification object caontaining an SDLRPCNotification</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationMemberOfClass:":{"name":"-isNotificationMemberOfClass:","abstract":"<p>Returns whether or not the containing notification is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationKindOfClass:":{"name":"-isNotificationKindOfClass:","abstract":"<p>Returns whether or not the containing notification is a kind of class, including subclasses.</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)initWithName:":{"name":"-initWithName:","abstract":"<p>Convenience init</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setFunctionName:":{"name":"-setFunctionName:","abstract":"<p>Sets the function name.</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setParameters:value:":{"name":"-setParameters:value:","abstract":"<p>Sets a key-value pair using the function name as the key.</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)bulkData":{"name":"bulkData","abstract":"<p>The data in the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)name":{"name":"name","abstract":"<p>The name of the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)parameters":{"name":"parameters","abstract":"<p>The JSON-RPC parameters</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)messageType":{"name":"messageType","abstract":"<p>The type of data in the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithRed:green:blue:":{"name":"-initWithRed:green:blue:","abstract":"<p>Create an SDL color object with red / green / blue values between 0-255</p>","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithColor:":{"name":"-initWithColor:","abstract":"<p>Create an SDL color object with a UIColor object.</p>","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)red":{"name":"red","abstract":"<p>The red value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)green":{"name":"green","abstract":"<p>The green value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)blue":{"name":"blue","abstract":"<p>The blue value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(im)initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:":{"name":"-initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:","abstract":"<p>Convenience init</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programService":{"name":"programService","abstract":"<p>Program Service Name</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)radioText":{"name":"radioText","abstract":"<p>Radio Text</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)clockText":{"name":"clockText","abstract":"<p>The clock text in UTC format as YYYY-MM-DDThh:mm:ss.sTZD</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programIdentification":{"name":"programIdentification","abstract":"<p>Program Identification - the call sign for the radio station</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programType":{"name":"programType","abstract":"<p>The program type - The region should be used to differentiate between EU","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficProgramIdentification":{"name":"trafficProgramIdentification","abstract":"<p>Traffic Program Identification - Identifies a station that offers traffic</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficAnnouncementIdentification":{"name":"trafficAnnouncementIdentification","abstract":"<p>Traffic Announcement Identification - Indicates an ongoing traffic announcement</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)region":{"name":"region","abstract":"<p>Region</p>","parent_name":"SDLRDSData"},"Classes/SDLPutFileResponse.html#/c:objc(cs)SDLPutFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>Provides the total local space available in SDL Core for the registered app. If the transfer has systemFile enabled, then the value will be set to 0 automatically.</p>","parent_name":"SDLPutFileResponse"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)init":{"name":"-init","abstract":"<p>Init</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:":{"name":"-initWithFileName:fileType:","abstract":"<p>Convenience init for creating a putfile with a name and file format.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:":{"name":"-initWithFileName:fileType:persistentFile:","abstract":"<p>Convenience init for creating a putfile with a name, file format, and persistence.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:","abstract":"<p>Convenience init for creating a putfile that is part of a multiple frame payload.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:","abstract":"<p>Convenience init for creating a putfile that is part of a multiple frame payload. A CRC checksum is calculated for the bulk data.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)sdlFileName":{"name":"sdlFileName","abstract":"<p>File reference name</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)fileType":{"name":"fileType","abstract":"<p>A FileType value representing a selected file type</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)persistentFile":{"name":"persistentFile","abstract":"<p>A value to indicates if the file is meant to persist between sessions / ignition cycles. If set to TRUE, then the system will aim to persist this file through session / cycles. While files with this designation will have priority over others, they are subject to deletion by the system at any time. In the event of automatic deletion by the system, the app will receive a rejection and have to resend the file. If omitted, the value will be set to false.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)systemFile":{"name":"systemFile","abstract":"<p>Indicates if the file is meant to be passed through core to elsewhere on the system. If set to TRUE, then the system will instead pass the data thru as it arrives to a predetermined area outside of core.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)offset":{"name":"offset","abstract":"<p>Offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)length":{"name":"length","abstract":"<p>Length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)crc":{"name":"crc","abstract":"<p>Additional CRC32 checksum to protect data integrity up to 512 Mbits.</p>","parent_name":"SDLPutFile"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(im)initWithAppServiceRecord:":{"name":"-initWithAppServiceRecord:","abstract":"<p>Convenience init.</p>","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(py)appServiceRecord":{"name":"appServiceRecord","abstract":"<p>If the request was successful, this object will be the current status of the service record for the published service. This will include the Core supplied service ID.</p>","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(im)initWithAppServiceManifest:":{"name":"-initWithAppServiceManifest:","abstract":"<p>Convenience init.</p>","parent_name":"SDLPublishAppService"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(py)appServiceManifest":{"name":"appServiceManifest","abstract":"<p>The manifest of the service that wishes to be published.","parent_name":"SDLPublishAppService"},"Classes/SDLPresetBankCapabilities.html#/c:objc(cs)SDLPresetBankCapabilities(py)onScreenPresetsAvailable":{"name":"onScreenPresetsAvailable","abstract":"<p>If Onscreen custom presets are available.</p>","parent_name":"SDLPresetBankCapabilities"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(im)initWithFirstTouch:secondTouch:":{"name":"-initWithFirstTouch:secondTouch:","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)firstTouch":{"name":"firstTouch","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)secondTouch":{"name":"secondTouch","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)distance":{"name":"distance","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)center":{"name":"center","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)isValid":{"name":"isValid","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(im)initWithDialNumber:":{"name":"-initWithDialNumber:","abstract":"<p>Convenience init for defining the phone capability</p>","parent_name":"SDLPhoneCapability"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(py)dialNumberEnabled":{"name":"dialNumberEnabled","abstract":"<p>Whether or not the DialNumber RPC is enabled.</p>","parent_name":"SDLPhoneCapability"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(py)requiresEncryption":{"name":"requiresEncryption","abstract":"<p>Flag indicating if the app requires an encryption service to be active.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>Start the manager with a completion block that will be called when startup completes. This is used internally. To use an SDLPermissionManager, you should use the manager found on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLManager.html\">SDLManager</a></code>.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager. This method is used internally.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)isRPCNameAllowed:":{"name":"-isRPCNameAllowed:","abstract":"<p>Determine if an individual RPC is allowed for the current HMI level</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)groupStatusOfRPCPermissions:":{"name":"-groupStatusOfRPCPermissions:","abstract":"<p>Determine if all RPCs are allowed for the current HMI level</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)statusesOfRPCPermissions:":{"name":"-statusesOfRPCPermissions:","abstract":"<p>Retrieve a dictionary with keys that are the passed in RPC names, and objects of an NSNumber<BOOL> specifying if that RPC is currently allowed</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)subscribeToRPCPermissions:groupType:withHandler:":{"name":"-subscribeToRPCPermissions:groupType:withHandler:","abstract":"<p>Subscribe to specified RPC names, with a callback that will be called whenever the value changes. The callback will only return immediately if the groupType is set to SDLPermissionGroupTypeAny or if the groupType is set to SDLPermissionGroupTypeAllAllowed and all RPCs in the rpcNames parameter are allowed.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeAllObservers":{"name":"-removeAllObservers","abstract":"<p>Remove every current observer</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeObserverForIdentifier:":{"name":"-removeObserverForIdentifier:","abstract":"<p>Remove block observers for the specified RPC</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)rpcNameRequiresEncryption:":{"name":"-rpcNameRequiresEncryption:","abstract":"<p>Check whether or not an RPC needs encryption.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)isPermissionParameterAllowed:parameter:":{"name":"-isPermissionParameterAllowed:parameter:","abstract":"<p>Check whether a parameter of an RPC is allowed</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC in the policy table.</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)hmiPermissions":{"name":"hmiPermissions","abstract":"<p>HMI Permissions for the individual RPC; i.e. which HMI levels may it be used in</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)parameterPermissions":{"name":"parameterPermissions","abstract":"<p>RPC parameters for the individual RPC</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)requireEncryption":{"name":"requireEncryption","abstract":"<p>Describes whether or not the RPC needs encryption</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC.","parent_name":"SDLPermissionElement"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(py)parameterPermissions":{"name":"parameterPermissions","abstract":"<p>RPC parameters for the individual RPC</p>","parent_name":"SDLPermissionElement"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(im)initWithRPCName:parameterPermissions:":{"name":"-initWithRPCName:parameterPermissions:","abstract":"<p>Creates a new permission element.</p>","parent_name":"SDLPermissionElement"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)choiceID":{"name":"choiceID","abstract":"<p>ID of the choice that was selected in response to PerformInteraction. Only is valid if general result is &ldquo;success:true&rdquo;.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)manualTextEntry":{"name":"manualTextEntry","abstract":"<p>Manually entered text selection, e.g. through keyboard. Can be returned in lieu of choiceID, depending on the trigger source.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)triggerSource":{"name":"triggerSource","abstract":"<p>A <em>SDLTriggerSource</em> object which will be shown in the HMI. Only is valid if resultCode is SUCCESS.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialText:interactionMode:interactionChoiceSetIDList:cancelID:":{"name":"-initWithInitialText:interactionMode:interactionChoiceSetIDList:cancelID:","abstract":"<p>Convenience init for creating a basic display or voice-recognition menu.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialText:initialPrompt:interactionMode:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:timeout:vrHelp:interactionLayout:cancelID:":{"name":"-initWithInitialText:initialPrompt:interactionMode:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:timeout:vrHelp:interactionLayout:cancelID:","abstract":"<p>Convenience init for setting all parameters of a display or voice-recognition menu.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialText":{"name":"initialText","abstract":"<p>Text to be displayed first.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>This is the TTS prompt spoken to the user at the start of an interaction.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionMode":{"name":"interactionMode","abstract":"<p>For application-requested interactions, this mode indicates the method in which the user is notified and uses the interaction. Users can choose either only by voice (VR_ONLY), by tactile selection from the menu (MANUAL_ONLY), or by either mode (BOTH).</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionChoiceSetIDList":{"name":"interactionChoiceSetIDList","abstract":"<p>List of interaction choice set IDs to use with an interaction.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Help text. This is the spoken text when a user speaks &ldquo;help&rdquo; while the interaction is occurring.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Timeout text. This text is spoken when a VR interaction times out.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeout":{"name":"timeout","abstract":"<p>Timeout in milliseconds. Applies only to the menu portion of the interaction. The VR timeout will be handled by the platform. If omitted a standard value of 10 seconds is used.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)vrHelp":{"name":"vrHelp","abstract":"<p>Suggested voice recognition help items to display on-screen during a perform interaction. If omitted on supported displays, the default generated list of suggested choices shall be displayed.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionLayout":{"name":"interactionLayout","abstract":"<p>For tactile interaction modes (MANUAL_ONLY, or BOTH), the layout mode of how the choices are presented.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific perform interaction to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>initial prompt which will be spoken before opening the audio pass","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText1":{"name":"audioPassThruDisplayText1","abstract":"<p>a line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText2":{"name":"audioPassThruDisplayText2","abstract":"<p>A line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)samplingRate":{"name":"samplingRate","abstract":"<p>A samplingRate</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)maxDuration":{"name":"maxDuration","abstract":"<p>the maximum duration of audio recording in milliseconds</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)bitsPerSample":{"name":"bitsPerSample","abstract":"<p>the quality the audio is recorded - 8 bit or 16 bit</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioType":{"name":"audioType","abstract":"<p>an audioType</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)muteAudio":{"name":"muteAudio","abstract":"<p>a Boolean value representing if the current audio source should be","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioDataHandler":{"name":"audioDataHandler","abstract":"<p>A handler that will be called whenever an <code>onAudioPassThru</code> notification is received.</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(im)initWithServiceSpecificResult:":{"name":"-initWithServiceSpecificResult:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(py)serviceSpecificResult":{"name":"serviceSpecificResult","abstract":"<p>The service can provide specific result strings to the consumer through this param.</p>","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:":{"name":"-initWithServiceUri:serviceID:originApp:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:requestServiceActive:":{"name":"-initWithServiceUri:serviceID:originApp:requestServiceActive:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceUri":{"name":"serviceUri","abstract":"<p>Fully qualified URI based on a predetermined scheme provided by the app service. SDL makes no guarantee that this URI is correct.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceID":{"name":"serviceID","abstract":"<p>The service ID that the app consumer wishes to send this URI.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)originApp":{"name":"originApp","abstract":"<p>This string is the appID of the app requesting the app service provider take the specific action.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)requestServiceActive":{"name":"requestServiceActive","abstract":"<p>This flag signals the requesting consumer would like this service to become the active primary service of the destination&rsquo;s type.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)allowed":{"name":"allowed","abstract":"<p>A set of all parameters that are permitted for this given RPC.</p>","parent_name":"SDLParameterPermissions"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"<p>A set of all parameters that are prohibited for this given RPC.</p>","parent_name":"SDLParameterPermissions"},"Classes/SDLOnWayPointChange.html#/c:objc(cs)SDLOnWayPointChange(py)waypoints":{"name":"waypoints","abstract":"<p>Location address for display purposes only</p>","parent_name":"SDLOnWayPointChange"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gps":{"name":"gps","abstract":"<p>The car current GPS coordinates</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)speed":{"name":"speed","abstract":"<p>The vehicle speed in kilometers per hour</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)rpm":{"name":"rpm","abstract":"<p>The number of revolutions per minute of the engine.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The fuel level in the tank (percentage)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The fuel level state</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The instantaneous fuel consumption in microlitres</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)vin":{"name":"vin","abstract":"<p>The Vehicle Identification Number</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>The current pressure warnings for the user&rsquo;s vehicle</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)odometer":{"name":"odometer","abstract":"<p>Odometer reading in km</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>The status of the seat belts</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The body information including power modes</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The IVI system status including signal and battery strength</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>The status of the brake pedal</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>Status of the head lamps</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The estimated percentage (0% - 100%) of remaining oil life of the engine</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>Torque value for engine (in Nm) on non-diesel variants</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>Accelerator pedal position (percentage depressed)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>Current angle of the steering wheel (in deg)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>Emergency Call notification and confirmation data</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The status of the air bags</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>Information related to an emergency event (and if it occurred)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>The status modes of the cluster</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)myKey":{"name":"myKey","abstract":"<p>Information related to the MyKey feature</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The status of the electronic parking brake</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>The status of the turn signal</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The cloud app vehicle ID</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data item for any given OEM custom vehicle data name.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(im)initWithMenuID:":{"name":"-initWithMenuID:","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(im)initWithMenuID:updateSubCells:":{"name":"-initWithMenuID:updateSubCells:","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(py)menuID":{"name":"menuID","abstract":"<p>This menuID must match a menuID in the current menu structure","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(py)updateSubCells":{"name":"updateSubCells","abstract":"<p>If not set, assume false. If true, the app should send AddCommands with parentIDs matching the menuID. These AddCommands will then be attached to the submenu and displayed if the submenu is selected.</p>","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateFile.html#/c:objc(cs)SDLOnUpdateFile(im)initWithFileName:":{"name":"-initWithFileName:","parent_name":"SDLOnUpdateFile"},"Classes/SDLOnUpdateFile.html#/c:objc(cs)SDLOnUpdateFile(py)fileName":{"name":"fileName","abstract":"<p>File reference name.","parent_name":"SDLOnUpdateFile"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)type":{"name":"type","abstract":"<p>The type of touch event.</p>","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)event":{"name":"event","abstract":"<p>List of all individual touches involved in this event.</p>","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTBTClientState.html#/c:objc(cs)SDLOnTBTClientState(py)state":{"name":"state","abstract":"<p>Current State of TBT client</p>","parent_name":"SDLOnTBTClientState"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestType":{"name":"requestType","abstract":"<p>The type of system request.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"<p>A request subType used when the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestType\">requestType</a></code> is <code>OEM_SPECIFIC</code>.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)url":{"name":"url","abstract":"<p>Optional URL for HTTP requests. If blank, the binary data shall be forwarded to the app. If not blank, the binary data shall be forwarded to the url with a provided timeout in seconds.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)timeout":{"name":"timeout","abstract":"<p>Optional timeout for HTTP requests Required if a URL is provided</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)fileType":{"name":"fileType","abstract":"<p>Optional file type (meant for HTTP file requests).</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(im)initWithSystemCapability:":{"name":"-initWithSystemCapability:","abstract":"<p>Convenience init for required parameters</p>","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(py)systemCapability":{"name":"systemCapability","abstract":"<p>The system capability that has been updated.</p>","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)URL":{"name":"URL","abstract":"<p>The url</p>","parent_name":"SDLOnSyncPData"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)Timeout":{"name":"Timeout","abstract":"<p>How long until a timeout</p>","parent_name":"SDLOnSyncPData"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allocatedModules":{"name":"allocatedModules","abstract":"<p>@abstract Contains a list (zero or more) of module types that","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)freeModules":{"name":"freeModules","abstract":"<p>@abstract Contains a list (zero or more) of module types that are free to access for the application.</p>","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allowed":{"name":"allowed","abstract":"<p>Issued by SDL to notify the application about remote control status change on SDL","parent_name":"SDLOnRCStatus"},"Classes/SDLOnPermissionsChange.html#/c:objc(cs)SDLOnPermissionsChange(py)permissionItem":{"name":"permissionItem","abstract":"<p>Describes change in permissions for a given set of RPCs</p>","parent_name":"SDLOnPermissionsChange"},"Classes/SDLOnPermissionsChange.html#/c:objc(cs)SDLOnPermissionsChange(py)requireEncryption":{"name":"requireEncryption","abstract":"<p>Describes whether or not the app needs the encryption permission</p>","parent_name":"SDLOnPermissionsChange"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)language":{"name":"language","abstract":"<p>Current SDL voice engine (VR+TTS) language</p>","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>Current display language</p>","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)event":{"name":"event","abstract":"<p>The type of keyboard input</p>","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)data":{"name":"data","abstract":"<p>The current keyboard string input from the user</p>","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnInteriorVehicleData.html#/c:objc(cs)SDLOnInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"<p>The subscribed module data that changed</p>","parent_name":"SDLOnInteriorVehicleData"},"Classes/SDLOnHashChange.html#/c:objc(cs)SDLOnHashChange(py)hashID":{"name":"hashID","abstract":"<p>Calculated hash ID to be referenced during RegisterAppInterface request.</p>","parent_name":"SDLOnHashChange"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)hmiLevel":{"name":"hmiLevel","abstract":"<p>SDLHMILevel in effect for the application</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)audioStreamingState":{"name":"audioStreamingState","abstract":"<p>Current state of audio streaming for the application. When this parameter has a value of NOT_AUDIBLE, the application must stop streaming audio to SDL.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)videoStreamingState":{"name":"videoStreamingState","abstract":"<p>Current availability of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)systemContext":{"name":"systemContext","abstract":"<p>Whether a user-initiated interaction is in-progress (VRSESSION or MENU), or not (MAIN)</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)windowID":{"name":"windowID","abstract":"<p>This is the unique ID assigned to the window that this RPC is intended for. If this param is not included, it will be assumed that this request is specifically for the main window on the main display. - see: PredefinedWindows enum.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(im)initWithHMILevel:systemContext:audioStreamingState:videoStreamingState:windowID:":{"name":"-initWithHMILevel:systemContext:audioStreamingState:videoStreamingState:windowID:","abstract":"<p>Initialize an SDLOnHMIStatus RPC with initial parameters</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)data":{"name":"data","abstract":"<p>Contains base64 encoded string of SyncP packets.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)URL":{"name":"URL","abstract":"<p>If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded to the provided URL.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)Timeout":{"name":"Timeout","abstract":"<p>If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded with the provided timeout in seconds.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)state":{"name":"state","abstract":"<p>The driver distraction state (i.e. whether driver distraction rules are in effect, or not)</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)lockScreenDismissalEnabled":{"name":"lockScreenDismissalEnabled","abstract":"<p>If enabled, the lock screen will be able to be dismissed while connected to SDL, allowing users the ability to interact with the app.</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)lockScreenDismissalWarning":{"name":"lockScreenDismissalWarning","abstract":"<p>Warning message to be displayed on the lock screen when dismissal is enabled. This warning should be used to ensure that the user is not the driver of the vehicle, ex. <code>Swipe up to dismiss, acknowledging that you are not the driver.</code>. This parameter must be present if &ldquo;lockScreenDismissalEnabled&rdquo; is set to true.</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)cmdID":{"name":"cmdID","abstract":"<p>The command ID of the command the user selected. This is the command ID value provided by the application in the SDLAddCommand operation that created the command.</p>","parent_name":"SDLOnCommand"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)triggerSource":{"name":"triggerSource","abstract":"<p>Indicates whether command was selected via voice or via a menu selection (using the OK button).</p>","parent_name":"SDLOnCommand"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonName":{"name":"buttonName","abstract":"<p>The button&rsquo;s name</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press event</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)customButtonID":{"name":"customButtonID","abstract":"<p>If ButtonName is &ldquo;CUSTOM_BUTTON&rdquo;, this references the integer ID passed by a custom button. (e.g. softButton ID)</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonName":{"name":"buttonName","abstract":"<p>The name of the button</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonEventMode":{"name":"buttonEventMode","abstract":"<p>Indicates whether this is an UP or DOWN event</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)customButtonID":{"name":"customButtonID","abstract":"<p>If ButtonName is &ldquo;CUSTOM_BUTTON&rdquo;, this references the integer ID passed by a custom button. (e.g. softButton ID)</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(im)initWithServiceData:":{"name":"-initWithServiceData:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(py)serviceData":{"name":"serviceData","abstract":"<p>The updated app service data.</p>","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppInterfaceUnregistered.html#/c:objc(cs)SDLOnAppInterfaceUnregistered(py)reason":{"name":"reason","abstract":"<p>The reason application&rsquo;s interface was terminated</p>","parent_name":"SDLOnAppInterfaceUnregistered"},"Classes/SDLOnAppCapabilityUpdated.html#/c:objc(cs)SDLOnAppCapabilityUpdated(im)initWithAppCapability:":{"name":"-initWithAppCapability:","parent_name":"SDLOnAppCapabilityUpdated"},"Classes/SDLOnAppCapabilityUpdated.html#/c:objc(cs)SDLOnAppCapabilityUpdated(py)appCapability":{"name":"appCapability","abstract":"<p>The app capability that has been updated</p>","parent_name":"SDLOnAppCapabilityUpdated"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:","abstract":"<p>Convenience init to describe an oasis address</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:","abstract":"<p>Convenience init to describe an oasis address with all parameters</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryName":{"name":"countryName","abstract":"<p>Name of the country (localized)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryCode":{"name":"countryCode","abstract":"<p>countryCode of the country(ISO 3166-2)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)postalCode":{"name":"postalCode","abstract":"<p>postalCode of location (PLZ, ZIP, PIN, CAP etc.)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)administrativeArea":{"name":"administrativeArea","abstract":"<p>Portion of country (e.g. state)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subAdministrativeArea":{"name":"subAdministrativeArea","abstract":"<p>Portion of administrativeArea (e.g. county)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)locality":{"name":"locality","abstract":"<p>Hypernym for city/village</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subLocality":{"name":"subLocality","abstract":"<p>Hypernym for district</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)thoroughfare":{"name":"thoroughfare","abstract":"<p>Hypernym for street, road etc.</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subThoroughfare":{"name":"subThoroughfare","abstract":"<p>Portion of thoroughfare (e.g. house number)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allResponseNames":{"name":"+allResponseNames","abstract":"<p>All of the possible SDL RPC Response notification names</p>","parent_name":"SDLNotificationConstants"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allButtonEventNotifications":{"name":"+allButtonEventNotifications","abstract":"<p>All of the possible SDL Button event notification names</p>","parent_name":"SDLNotificationConstants"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(im)initWithAcceptsWayPoints:":{"name":"-initWithAcceptsWayPoints:","abstract":"<p>Convenience init.</p>","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(py)acceptsWayPoints":{"name":"acceptsWayPoints","abstract":"<p>Informs the subscriber if this service can actually accept way points.</p>","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:":{"name":"-initWithTimestamp:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:":{"name":"-initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)timestamp":{"name":"timestamp","abstract":"<p>This is the timestamp of when the data was generated. This is to ensure any time or distance given in the data can accurately be adjusted if necessary.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)origin":{"name":"origin","abstract":"<p>The start location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destination":{"name":"destination","abstract":"<p>The final destination location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destinationETA":{"name":"destinationETA","abstract":"<p>The estimated time of arrival at the final destination location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)instructions":{"name":"instructions","abstract":"<p>This array should be ordered with all remaining instructions. The start of this array should always contain the next instruction.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionETA":{"name":"nextInstructionETA","abstract":"<p>The estimated time of arrival at the next destination.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistance":{"name":"nextInstructionDistance","abstract":"<p>The distance to this instruction from current location. This should only be updated ever .1 unit of distance. For more accuracy the consumer can use the GPS location of itself and the next instruction.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistanceScale":{"name":"nextInstructionDistanceScale","abstract":"<p>Distance till next maneuver (starting from) from previous maneuver.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)prompt":{"name":"prompt","abstract":"<p>This is a prompt message that should be conveyed to the user through either display or voice (TTS). This param will change often as it should represent the following: approaching instruction, post instruction, alerts that affect the current navigation session, etc.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:":{"name":"-initWithLocationDetails:action:","abstract":"<p>Convenience init for required parameters</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:":{"name":"-initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)locationDetails":{"name":"locationDetails","abstract":"<p>The location details.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)action":{"name":"action","abstract":"<p>The navigation action.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)eta":{"name":"eta","abstract":"<p>The estimated time of arrival.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)bearing":{"name":"bearing","abstract":"<p>The angle at which this instruction takes place. For example, 0 would mean straight, &lt;=45 is bearing right, &gt;= 135 is sharp right, between 45 and 135 is a regular right, and 180 is a U-Turn, etc. </p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)junctionType":{"name":"junctionType","abstract":"<p>The navigation junction type.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)drivingSide":{"name":"drivingSide","abstract":"<p>Used to infer which side of the road this instruction takes place. For a U-Turn (action=TURN, bearing=180) this will determine which direction the turn should take place.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)details":{"name":"details","abstract":"<p>This is a string representation of this instruction, used to display instructions to the users. This is not intended to be read aloud to the users, see the param prompt in <code>NavigationServiceData</code> for that.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)image":{"name":"image","abstract":"<p>An image representation of this instruction.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(im)initWithSendLocation:waypoints:":{"name":"-initWithSendLocation:waypoints:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)sendLocationEnabled":{"name":"sendLocationEnabled","abstract":"<p>Whether or not the SendLocation RPC is enabled.</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)getWayPointsEnabled":{"name":"getWayPointsEnabled","abstract":"<p>Whether or not Waypoint related RPCs are enabled.</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLMyKey.html#/c:objc(cs)SDLMyKey(py)e911Override":{"name":"e911Override","abstract":"<p>Indicates whether e911 override is on. References signal &ldquo;MyKey_e911Override_St&rdquo;. See VehicleDataStatus.</p>","parent_name":"SDLMyKey"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(im)initWithMajorVersion:minorVersion:patchVersion:":{"name":"-initWithMajorVersion:minorVersion:patchVersion:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)majorVersion":{"name":"majorVersion","abstract":"<p>The major version indicates versions that is not-compatible to previous versions</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)minorVersion":{"name":"minorVersion","abstract":"<p>The minor version indicates a change to a previous version that should still allow to be run on an older version (with limited functionality)</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)patchVersion":{"name":"patchVersion","abstract":"<p>Allows backward-compatible fixes to the API without increasing the minor version of the interface</p>","parent_name":"SDLMsgVersion"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)moduleId":{"name":"moduleId","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)location":{"name":"location","abstract":"<p>Location of a module.","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)serviceArea":{"name":"serviceArea","abstract":"<p>Service area of a module.","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)allowMultipleAccess":{"name":"allowMultipleAccess","abstract":"<p>Allow multiple users/apps to access the module or not</p>","parent_name":"SDLModuleInfo"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithRadioControlData:":{"name":"-initWithRadioControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with radio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithClimateControlData:":{"name":"-initWithClimateControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with climate control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithAudioControlData:":{"name":"-initWithAudioControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with audio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithLightControlData:":{"name":"-initWithLightControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with light control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithHMISettingsControlData:":{"name":"-initWithHMISettingsControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with hmi settings data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithSeatControlData:":{"name":"-initWithSeatControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with seat control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)moduleType":{"name":"moduleType","abstract":"<p>The moduleType indicates which type of data should be changed and identifies which data object exists in this struct.</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)radioControlData":{"name":"radioControlData","abstract":"<p>The radio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)climateControlData":{"name":"climateControlData","abstract":"<p>The climate control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)seatControlData":{"name":"seatControlData","abstract":"<p>The seat control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)audioControlData":{"name":"audioControlData","abstract":"<p>The audio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)lightControlData":{"name":"lightControlData","abstract":"<p>The light control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)hmiSettingsControlData":{"name":"hmiSettingsControlData","abstract":"<p>The hmi control data</p>","parent_name":"SDLModuleData"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:":{"name":"-initWithTextFieldTypes:mainField2:","abstract":"<p>Constructs a newly allocated SDLMetadataType object with NSArrays</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:mainField3:mainField4:":{"name":"-initWithTextFieldTypes:mainField2:mainField3:mainField4:","abstract":"<p>Constructs a newly allocated SDLMetadataType with all parameters</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField1":{"name":"mainField1","abstract":"<p>The type of data contained in the &ldquo;mainField1&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField2":{"name":"mainField2","abstract":"<p>The type of data contained in the &ldquo;mainField2&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField3":{"name":"mainField3","abstract":"<p>The type of data contained in the &ldquo;mainField3&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField4":{"name":"mainField4","abstract":"<p>The type of data contained in the &ldquo;mainField4&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:":{"name":"-initWithMenuName:","abstract":"<p>Convenience init with required parameters.</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:parentId:position:":{"name":"-initWithMenuName:parentId:position:","abstract":"<p>Convenience init with all parameters.</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:parentID:position:secondaryText:tertiaryText:":{"name":"-initWithMenuName:parentID:position:secondaryText:tertiaryText:","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)parentID":{"name":"parentID","abstract":"<p>The unique ID of an existing submenu to which a command will be added</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)position":{"name":"position","abstract":"<p>The position within the items of the parent Command Menu</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)menuName":{"name":"menuName","abstract":"<p>The menu name which appears in menu, representing this command</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)secondaryText":{"name":"secondaryText","abstract":"<p>Optional secondary text to display","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Optional tertiary text to display","parent_name":"SDLMenuParams"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(py)mainMenuLayout":{"name":"mainMenuLayout","abstract":"<p>Changes the default main menu layout. Defaults to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLMenuLayoutList\">SDLMenuLayoutList</a></code>.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(py)defaultSubmenuLayout":{"name":"defaultSubmenuLayout","abstract":"<p>Changes the default submenu layout. To change this for an individual submenu, set the <code>menuLayout</code> property on the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html\">SDLMenuCell</a></code> initializer for creating a cell with sub-cells. Defaults to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLMenuLayoutList\">SDLMenuLayoutList</a></code>.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(im)initWithMainMenuLayout:defaultSubmenuLayout:":{"name":"-initWithMainMenuLayout:defaultSubmenuLayout:","abstract":"<p>Initialize a new menu configuration with a main menu layout and a default submenu layout which can be overridden per-submenu if desired.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)title":{"name":"title","abstract":"<p>The cell&rsquo;s text to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)icon":{"name":"icon","abstract":"<p>The cell&rsquo;s icon to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The strings the user can say to activate this voice command</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)handler":{"name":"handler","abstract":"<p>The handler that will be called when the command is activated</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)subCells":{"name":"subCells","abstract":"<p>If this is non-nil, this cell will be a sub-menu button, displaying the subcells in a menu when pressed.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)submenuLayout":{"name":"submenuLayout","abstract":"<p>The layout in which the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)subCells\">subCells</a></code> will be displayed.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)uniqueTitle":{"name":"uniqueTitle","abstract":"<p>Primary text of the cell to be displayed on the module. Used to distinguish cells with the same <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)title\">title</a></code> but other fields are different. This is autogenerated by the screen manager. This will not be used when connected to modules supporting RPC 7.1+ because duplicate titles are supported.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)secondaryText":{"name":"secondaryText","abstract":"<p>The cell&rsquo;s secondary text to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>The cell&rsquo;s tertiary text to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)secondaryArtwork":{"name":"secondaryArtwork","abstract":"<p>The cell&rsquo;s secondary icon to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:voiceCommands:handler:":{"name":"-initWithTitle:icon:voiceCommands:handler:","abstract":"<p>Create a menu cell that has no subcells.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:submenuLayout:subCells:":{"name":"-initWithTitle:icon:submenuLayout:subCells:","abstract":"<p>Create a menu cell that has subcells and when selected will go into a deeper part of the menu</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler:":{"name":"-initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler:","abstract":"<p>Create a menu cell that has no subcells.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells:":{"name":"-initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells:","abstract":"<p>Create a menu cell that has subcells and when selected will go into a deeper part of the menu</p>","parent_name":"SDLMenuCell"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(im)initWithMediaType:mediaImage:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:":{"name":"-initWithMediaType:mediaImage:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:","abstract":"<p>Convenience init</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaImage":{"name":"mediaImage","abstract":"<p>Sets the media image associated with the currently playing media","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaType":{"name":"mediaType","abstract":"<p>The type of the currently playing or paused track.</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaTitle":{"name":"mediaTitle","abstract":"<p>Music: The name of the current track","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaArtist":{"name":"mediaArtist","abstract":"<p>Music: The name of the current album artist","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaAlbum":{"name":"mediaAlbum","abstract":"<p>Music: The name of the current album","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)playlistName":{"name":"playlistName","abstract":"<p>Music: The name of the playlist or radio station, if the user is playing from a playlist, otherwise, Null","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)isExplicit":{"name":"isExplicit","abstract":"<p>Whether or not the content currently playing (e.g. the track, episode, or book) contains explicit content.</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackProgress":{"name":"trackPlaybackProgress","abstract":"<p>Music: The current progress of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackDuration":{"name":"trackPlaybackDuration","abstract":"<p>Music: The total duration of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackProgress":{"name":"queuePlaybackProgress","abstract":"<p>Music: The current progress of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackDuration":{"name":"queuePlaybackDuration","abstract":"<p>Music: The total duration of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueCurrentTrackNumber":{"name":"queueCurrentTrackNumber","abstract":"<p>Music: The current number (1 based) of the track in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueTotalTrackCount":{"name":"queueTotalTrackCount","abstract":"<p>Music: The total number of tracks in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(im)initWithMassageMode:massageZone:":{"name":"-initWithMassageMode:massageZone:","abstract":"<p>@abstract Constructs a newly allocated SDLMassageModeData object with massageMode and massageZone</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageMode":{"name":"massageMode","abstract":"<p>@abstract mode of a massage zone</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageZone":{"name":"massageZone","abstract":"<p>@abstract zone of a multi-contour massage seat.</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(im)initWithMassageCushion:firmness:":{"name":"-initWithMassageCushion:firmness:","abstract":"<p>Constructs a newly allocated SDLMassageCushionFirmness object with cushion and firmness</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)cushion":{"name":"cushion","abstract":"<p>@abstract cushion of a multi-contour massage seat.</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)firmness":{"name":"firmness","abstract":"<p>@abstract zone of a multi-contour massage seat.</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)configuration":{"name":"configuration","abstract":"<p>The configuration the manager was set up with.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)hmiLevel":{"name":"hmiLevel","abstract":"<p>The current HMI level of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)audioStreamingState":{"name":"audioStreamingState","abstract":"<p>The current audio streaming state of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemContext":{"name":"systemContext","abstract":"<p>The current system context of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)fileManager":{"name":"fileManager","abstract":"<p>The file manager to be used by the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)permissionManager":{"name":"permissionManager","abstract":"<p>The permission manager monitoring RPC permissions.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)streamManager":{"name":"streamManager","abstract":"<p>The streaming media manager to be used for starting video sessions.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)screenManager":{"name":"screenManager","abstract":"<p>The screen manager for sending UI related RPCs.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemCapabilityManager":{"name":"systemCapabilityManager","abstract":"<p>Centralized manager for retrieving all system capabilities.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)registerResponse":{"name":"registerResponse","abstract":"<p>The response of a register call after it has been received.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)authToken":{"name":"authToken","abstract":"<p>The auth token, if received. This should be used to log into a user account. Primarily used for cloud apps with companion app stores.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)delegate":{"name":"delegate","abstract":"<p>The manager&rsquo;s delegate.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)pendingRPCTransactions":{"name":"pendingRPCTransactions","abstract":"<p>The currently pending RPC request send transactions</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)initWithConfiguration:delegate:":{"name":"-initWithConfiguration:delegate:","abstract":"<p>Initialize the manager with a configuration. Call <code>startWithHandler</code> to begin waiting for a connection.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)startWithReadyHandler:":{"name":"-startWithReadyHandler:","abstract":"<p>Start the manager, which will tell it to start looking for a connection. Once one does, it will automatically run the setup process and call the readyBlock when done.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager, it will disconnect if needed and no longer look for a connection. You probably don&rsquo;t need to call this method ever.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)startRPCEncryption":{"name":"-startRPCEncryption","abstract":"<p>Start the encryption lifecycle manager, which will attempt to open a secure service.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRPC:":{"name":"-sendRPC:","abstract":"<p>Send an RPC of type <code>Response</code>, <code>Notification</code> or <code>Request</code>. Responses and notifications sent to Core do not a response back from Core. Each request sent to Core does get a response, so if you need the response and/or error, call <code>sendRequest:withResponseHandler:</code> instead.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:":{"name":"-sendRequest:","abstract":"<p>Send an RPC request and don&rsquo;t bother with the response or error. If you need the response or error, call sendRequest:withCompletionHandler: instead.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:withResponseHandler:":{"name":"-sendRequest:withResponseHandler:","abstract":"<p>Send an RPC request and set a completion handler that will be called with the response when the response returns.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequests:progressHandler:completionHandler:":{"name":"-sendRequests:progressHandler:completionHandler:","abstract":"<p>Send all of the requests given as quickly as possible, but in order. Call the completionHandler after all requests have either failed or given a response.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendSequentialRequests:progressHandler:completionHandler:":{"name":"-sendSequentialRequests:progressHandler:completionHandler:","abstract":"<p>Send all of the requests one at a time, with the next one going out only after the previous one has received a response. Call the completionHandler after all requests have either failed or given a response.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)subscribeToRPC:withBlock:":{"name":"-subscribeToRPC:withBlock:","abstract":"<p>Subscribe to callbacks about a particular RPC request, notification, or response with a block callback.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)subscribeToRPC:withObserver:selector:":{"name":"-subscribeToRPC:withObserver:selector:","abstract":"<p>Subscribe to callbacks about a particular RPC request, notification, or response with a selector callback.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)unsubscribeFromRPC:withObserver:":{"name":"-unsubscribeFromRPC:withObserver:","abstract":"<p>Unsubscribe to callbacks about a particular RPC request, notification, or response.</p>","parent_name":"SDLManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)modules":{"name":"modules","abstract":"<p>Active log modules</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)targets":{"name":"targets","abstract":"<p>Active log targets</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)filters":{"name":"filters","abstract":"<p>Active log filters</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)globalLogLevel":{"name":"globalLogLevel","abstract":"<p>Any modules that do not have an explicitly specified level will by default use this log level</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)formatType":{"name":"formatType","abstract":"<p>Active log format</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)asynchronous":{"name":"asynchronous","abstract":"<p>Whether or not verbose, debug, and warning logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"<p>Whether or not error logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)disableAssertions":{"name":"disableAssertions","abstract":"<p>Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)dateFormatter":{"name":"dateFormatter","abstract":"<p>Active date formatter</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)logQueue":{"name":"logQueue","abstract":"<p>The queue asynchronously logged logs are logged on. Say that 10 times fast.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)sharedManager":{"name":"+sharedManager","abstract":"<p>The singleton object</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)setConfiguration:":{"name":"+setConfiguration:","abstract":"<p>Sets a configuration to be used by the log manager&rsquo;s sharedManager. This is generally for internal use and you should set your configuration using SDLManager&rsquo;s startWithConfiguration: method.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)setConfiguration:":{"name":"-setConfiguration:","abstract":"<p>Sets a configuration to be used by the log manager. This is generally for internal use and you should set your configuration using SDLManager&rsquo;s startWithConfiguration: method.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log to the sharedManager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log to this log manager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"<p>Log to this sharedManager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"<p>Log to this log manager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"+logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"<p>Log to this sharedManager&rsquo;s active log targets. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"-logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"<p>Log to this manager&rsquo;s active log targets. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"+logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log an error to the sharedManager&rsquo;s active log targets and assert. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"-logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log an error to this manager&rsquo;s active log targets and assert. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(py)filter":{"name":"filter","abstract":"<p>A block that takes in a log model and returns whether or not the log passes the filter and should therefore be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)initWithCustomFilter:":{"name":"-initWithCustomFilter:","abstract":"<p>Create a new filter with a custom filter block. The filter block will take a log model and return a BOOL of pass / fail.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingString:caseSensitive:":{"name":"+filterByDisallowingString:caseSensitive:","abstract":"<p>Returns a filter that only allows logs not containing the passed string within their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingString:caseSensitive:":{"name":"+filterByAllowingString:caseSensitive:","abstract":"<p>Returns a filter that only allows logs containing the passed string within their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingRegex:":{"name":"+filterByDisallowingRegex:","abstract":"<p>Returns a filter that only allows logs not passing the passed regex against their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingRegex:":{"name":"+filterByAllowingRegex:","abstract":"<p>Returns a filter that only allows logs passing the passed regex against their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingModules:":{"name":"+filterByDisallowingModules:","abstract":"<p>Returns a filter that only allows logs not within the specified file modules to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingModules:":{"name":"+filterByAllowingModules:","abstract":"<p>Returns a filter that only allows logs of the specified file modules to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingFileNames:":{"name":"+filterByDisallowingFileNames:","abstract":"<p>Returns a filter that only allows logs not within the specified files to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingFileNames:":{"name":"+filterByAllowingFileNames:","abstract":"<p>Returns a filter that only allows logs within the specified files to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)name":{"name":"name","abstract":"<p>The name of the this module, e.g. &ldquo;Transport&rdquo;</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)files":{"name":"files","abstract":"<p>All of the files contained within this module. When a log is logged, the <code>__FILE__</code> (in Obj-C) or <code>#file</code> (in Swift) is automatically captured and checked to see if any module has a file in this set that matches. If it does, it will be logged using the module&rsquo;s log level and the module&rsquo;s name will be printed in the formatted log.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)logLevel":{"name":"logLevel","abstract":"<p>The custom level of the log. This is <code>SDLLogLevelDefault</code> (whatever the current global log level is) by default.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)init":{"name":"-init","abstract":"<p>This method is unavailable and may not be used.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:level:":{"name":"-initWithName:files:level:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name, set of files, and associated log level.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:":{"name":"-initWithName:files:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name and set of files. The logging level is the same as the current global logging file by using <code>SDLLogLevelDefault</code>.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(cm)moduleWithName:files:":{"name":"+moduleWithName:files:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name and set of files. The logging level is the same as the current global logging file by using <code>SDLLogLevelDefault</code>.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)containsFile:":{"name":"-containsFile:","abstract":"<p>Returns whether or not this module contains a given file.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)modules":{"name":"modules","abstract":"<p>Any custom logging modules used by the developer&rsquo;s code. Defaults to none.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)targets":{"name":"targets","abstract":"<p>Where the logs will attempt to output. Defaults to Console.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)filters":{"name":"filters","abstract":"<p>What log filters will run over this session. Defaults to none.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)formatType":{"name":"formatType","abstract":"<p>How detailed of logs will be output. Defaults to Default.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)asynchronous":{"name":"asynchronous","abstract":"<p>Whether or not logs will be run on a separate queue, asynchronously, allowing the following code to run before the log completes. Or if it will occur synchronously, which will prevent logs from being missed, but will slow down surrounding code. Defaults to YES.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"<p>Whether or not error logs will be dispatched to loggers asynchronously. Defaults to NO.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)disableAssertions":{"name":"disableAssertions","abstract":"<p>Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)globalLogLevel":{"name":"globalLogLevel","abstract":"<p>Any modules that do not have an explicitly specified level will by default use the global log level. Defaults to Error.","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>A default logger for production. This sets the format type to Default, the log level to Error, and the target to SDLLogTargetOSLog.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)debugConfiguration":{"name":"+debugConfiguration","abstract":"<p>A debug logger for use in development. This sets the format type to Detailed, the log level to Debug, and enables the Console and ASL loggers.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)appIcon":{"name":"appIcon","abstract":"<p>The app&rsquo;s icon. This will be set by the lock screen configuration.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)vehicleIcon":{"name":"vehicleIcon","abstract":"<p>The vehicle&rsquo;s designated icon. This will be set by the lock screen manager when it is notified that a lock screen icon has been downloaded.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The designated background color set in the lock screen configuration, or the default SDL gray-blue.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)lockedLabelText":{"name":"lockedLabelText","abstract":"<p>The locked label string. This will be set by the lock screen manager to inform the user about the dismissible state.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(im)addDismissGestureWithCallback:":{"name":"-addDismissGestureWithCallback:","abstract":"<p>Adds a swipe gesture to the lock screen view controller.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(im)removeDismissGesture":{"name":"-removeDismissGesture","abstract":"<p>Remove swipe gesture to the lock screen view controller.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)displayMode":{"name":"displayMode","abstract":"<p>Describes when the lock screen will be displayed. Defaults to <code>SDLLockScreenConfigurationDisplayModeRequiredOnly</code>.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)enableDismissGesture":{"name":"enableDismissGesture","abstract":"<p>If YES, then the lock screen can be dismissed with a downward swipe on compatible head units. Requires a connection of SDL 6.0+ and the head unit to enable the feature. Defaults to YES.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)showDeviceLogo":{"name":"showDeviceLogo","abstract":"<p>If YES, then the lockscreen will show the vehicle&rsquo;s logo if the vehicle has made it available. If NO, then the lockscreen will not show the vehicle logo. Defaults to YES.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The background color of the lock screen. This could be a branding color, or leave at the default for a dark blue-gray.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)appIcon":{"name":"appIcon","abstract":"<p>Your app icon as it will appear on the lock screen.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)customViewController":{"name":"customViewController","abstract":"<p>A custom view controller that the lock screen will manage the presentation of.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)disabledConfiguration":{"name":"+disabledConfiguration","abstract":"<p>Use this configuration if you wish to manage a lock screen yourself. This may be useful if the automatic presentation feature of SDLLockScreenManager is failing for some reason.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfiguration":{"name":"+enabledConfiguration","abstract":"<p>Use this configuration for the basic default lock screen. A custom app icon will not be used.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithAppIcon:backgroundColor:":{"name":"+enabledConfigurationWithAppIcon:backgroundColor:","abstract":"<p>Use this configuration to provide a custom lock screen icon and a custom background color, or nil if you wish to use the default background color. This will use the default lock screen layout.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithViewController:":{"name":"+enabledConfigurationWithViewController:","abstract":"<p>Use this configuration if you wish to provide your own view controller for the lock screen. This view controller&rsquo;s presentation and dismissal will still be managed by the lock screen manager. Note that you may subclass SDLLockScreenViewController and pass it here to continue to have the vehicle icon set to your view controller by the manager.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:":{"name":"-initWithCoordinate:","abstract":"<p>Convenience init for location coordinate.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:":{"name":"-initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)coordinate":{"name":"coordinate","abstract":"<p>Latitude/Longitude of the location</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationName":{"name":"locationName","abstract":"<p>Name of location.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)addressLines":{"name":"addressLines","abstract":"<p>Location address for display purposes only.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationDescription":{"name":"locationDescription","abstract":"<p>Description intended location / establishment.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)phoneNumber":{"name":"phoneNumber","abstract":"<p>Phone number of location / establishment.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationImage":{"name":"locationImage","abstract":"<p>Image / icon of intended location.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)searchAddress":{"name":"searchAddress","abstract":"<p>Address to be used by navigation engines for search.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(im)initWithLatitudeDegrees:longitudeDegrees:":{"name":"-initWithLatitudeDegrees:longitudeDegrees:","abstract":"<p>Convenience init for location coordinates</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>Latitude of the location</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>Latitude of the location</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)filenames":{"name":"filenames","abstract":"<p>An array of all filenames resident on the module for the given registered app. If omitted, then no files currently reside on the system.</p>","parent_name":"SDLListFilesResponse"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>Provides the total local space available on the module for the registered app.</p>","parent_name":"SDLListFilesResponse"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:":{"name":"-initWithId:status:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:density:color:":{"name":"-initWithId:status:density:color:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:lightStatus:lightDensity:lightColor:":{"name":"-initWithId:lightStatus:lightDensity:lightColor:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)id":{"name":"id","abstract":"<p>@abstract The name of a light or a group of lights</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)status":{"name":"status","abstract":"<p>@abstract Reflects the status of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)density":{"name":"density","abstract":"<p>@abstract Reflects the density of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)color":{"name":"color","abstract":"<p>@abstract Reflects the color of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(im)initWithLightStates:":{"name":"-initWithLightStates:","abstract":"<p>Constructs a newly allocated SDLLightControlData object with lightState</p>","parent_name":"SDLLightControlData"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(py)lightState":{"name":"lightState","abstract":"<p>@abstract An array of LightNames and their current or desired status.","parent_name":"SDLLightControlData"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(im)initWithModuleName:moduleInfo:supportedLights:":{"name":"-initWithModuleName:moduleInfo:supportedLights:","abstract":"<p>Constructs a newly allocated SDLLightControlCapabilities object with given parameters</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the light control module.","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)supportedLights":{"name":"supportedLights","abstract":"<p>@abstract An array of available LightCapabilities that are controllable.</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:":{"name":"-initWithName:","abstract":"<p>Constructs a newly allocated SDLLightCapabilities object with the name of the light or group of lights</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:densityAvailable:colorAvailable:statusAvailable:":{"name":"-initWithName:densityAvailable:colorAvailable:statusAvailable:","abstract":"<p>Constructs a newly allocated SDLLightCapabilities object with given parameters</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)name":{"name":"name","abstract":"<p>@abstract The name of a light or a group of lights</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)densityAvailable":{"name":"densityAvailable","abstract":"<p>@abstract Indicates if the light&rsquo;s density can be set remotely (similar to a dimmer).</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)colorAvailable":{"name":"colorAvailable","abstract":"<p>@abstract Indicates if the light&rsquo;s color can be set remotely by using the RGB color space.</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)statusAvailable":{"name":"statusAvailable","abstract":"<p>@abstract Indicates if the status (ON/OFF) can be set remotely.","parent_name":"SDLLightCapabilities"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)appName":{"name":"appName","abstract":"<p>The full name of the app to that the configuration should be updated to.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)shortAppName":{"name":"shortAppName","abstract":"<p>An abbrevited application name that will be used on the app launching screen if the full one would be truncated.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)ttsName":{"name":"ttsName","abstract":"<p>A Text to Speech String for voice recognition of the mobile application name.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"<p>Additional voice recognition commands. May not interfere with any other app name or global commands.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(im)initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:":{"name":"-initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:","abstract":"<p>Initializes and returns a newly allocated lifecycle configuration update object with the specified app data.","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)defaultConfigurationWithAppName:fullAppId:":{"name":"+defaultConfigurationWithAppName:fullAppId:","abstract":"<p>A production configuration that runs using IAP. Additional functionality should be customized on the properties.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)debugConfigurationWithAppName:fullAppId:ipAddress:port:":{"name":"+debugConfigurationWithAppName:fullAppId:ipAddress:port:","abstract":"<p>A debug configuration that runs using TCP. Additional functionality should be customized on the properties.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugMode":{"name":"tcpDebugMode","abstract":"<p>Whether or not debug mode is enabled</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugIPAddress":{"name":"tcpDebugIPAddress","abstract":"<p>The ip address at which the library will look for a server</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugPort":{"name":"tcpDebugPort","abstract":"<p>The port at which the library will look for a server</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appName":{"name":"appName","abstract":"<p>The full name of the app</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appId":{"name":"appId","abstract":"<p>The app id. This must be the same as the app id received from the SDL developer portal.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)fullAppId":{"name":"fullAppId","abstract":"<p>The full app id. This must be the same as the full app id received from the SDL developer portal.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)resumeHash":{"name":"resumeHash","abstract":"<p>A hash id which should be passed to the remote system in the RegisterAppInterface</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)isMedia":{"name":"isMedia","abstract":"<p>This is an automatically set based on the app type</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appType":{"name":"appType","abstract":"<p>The application type</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)additionalAppTypes":{"name":"additionalAppTypes","abstract":"<p>Additional application types beyond <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appType\">appType</a></code></p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)language":{"name":"language","abstract":"<p>The default language to use</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)languagesSupported":{"name":"languagesSupported","abstract":"<p>An array of all the supported languages</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appIcon":{"name":"appIcon","abstract":"<p>The application icon to be used on an app launching screen</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)shortAppName":{"name":"shortAppName","abstract":"<p>An abbrevited application name that will be used on the app launching screen if the full one would be truncated</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)ttsName":{"name":"ttsName","abstract":"<p>A Text to Speech String for voice recognition of the mobile application name.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"<p>Additional voice recognition commands. May not interfere with any other app name or global commands.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to use when the head unit is in a light / day situation.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to use when the head unit is in a dark / night situation.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumProtocolVersion":{"name":"minimumProtocolVersion","abstract":"<p>The minimum protocol version that will be permitted to connect. This defaults to 1.0.0. If the protocol version of the head unit connected is below this version, the app will disconnect with an EndService protocol message and will not register.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumRPCVersion":{"name":"minimumRPCVersion","abstract":"<p>The minimum RPC version that will be permitted to connect. This defaults to 1.0.0. If the RPC version of the head unit connected is below this version, an UnregisterAppInterface will be sent.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)allowedSecondaryTransports":{"name":"allowedSecondaryTransports","abstract":"<p>Which transports are permitted to be used as secondary transports. A secondary transport is a transport that is connected as an alternate, higher bandwidth transport for situations when a low-bandwidth primary transport (such as Bluetooth) will restrict certain features (such as video streaming navigation).</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:":{"name":"-initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:","abstract":"<p>Create a Keyboard Properties RPC object</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:":{"name":"-initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:","abstract":"<p>Convenience init with all properties.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:":{"name":"-initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)language":{"name":"language","abstract":"<p>The keyboard language</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keyboardLayout":{"name":"keyboardLayout","abstract":"<p>Desired keyboard layout</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keypressMode":{"name":"keypressMode","abstract":"<p>Desired keypress mode.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)limitedCharacterList":{"name":"limitedCharacterList","abstract":"<p>Array of keyboard characters to enable. All omitted characters will be greyed out (disabled) on the keyboard. If omitted, the entire keyboard will be enabled.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)autoCompleteText":{"name":"autoCompleteText","abstract":"<p>Deprecated, use autoCompleteList instead.","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)autoCompleteList":{"name":"autoCompleteList","abstract":"<p>Allows an app to show a list of possible autocomplete suggestions as the user types</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)maskInputCharacters":{"name":"maskInputCharacters","abstract":"<p>Allows an app to mask entered characters on HMI</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)customKeys":{"name":"customKeys","abstract":"<p>Array of special characters to show in customizable keys. If omitted, keyboard will show default special characters","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardLayoutCapability.html#/c:objc(cs)SDLKeyboardLayoutCapability(im)initWithKeyboardLayout:numConfigurableKeys:":{"name":"-initWithKeyboardLayout:numConfigurableKeys:","parent_name":"SDLKeyboardLayoutCapability"},"Classes/SDLKeyboardLayoutCapability.html#/c:objc(cs)SDLKeyboardLayoutCapability(py)keyboardLayout":{"name":"keyboardLayout","abstract":"<p>Undocumented</p>","parent_name":"SDLKeyboardLayoutCapability"},"Classes/SDLKeyboardLayoutCapability.html#/c:objc(cs)SDLKeyboardLayoutCapability(py)numConfigurableKeys":{"name":"numConfigurableKeys","abstract":"<p>Number of keys available for special characters, App can customize as per their needs.","parent_name":"SDLKeyboardLayoutCapability"},"Classes/SDLKeyboardCapabilities.html#/c:objc(cs)SDLKeyboardCapabilities(im)initWithMaskInputCharactersSupported:supportedKeyboards:":{"name":"-initWithMaskInputCharactersSupported:supportedKeyboards:","parent_name":"SDLKeyboardCapabilities"},"Classes/SDLKeyboardCapabilities.html#/c:objc(cs)SDLKeyboardCapabilities(py)maskInputCharactersSupported":{"name":"maskInputCharactersSupported","abstract":"<p>Availability of capability to mask input characters using keyboard. True: Available, False: Not Available</p>","parent_name":"SDLKeyboardCapabilities"},"Classes/SDLKeyboardCapabilities.html#/c:objc(cs)SDLKeyboardCapabilities(py)supportedKeyboards":{"name":"supportedKeyboards","abstract":"<p>Capabilities of supported keyboard layouts by HMI.","parent_name":"SDLKeyboardCapabilities"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionWidth":{"name":"resolutionWidth","abstract":"<p>Resolution width</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionHeight":{"name":"resolutionHeight","abstract":"<p>Resolution height</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(im)initWithWidth:height:":{"name":"-initWithWidth:height:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)name":{"name":"name","abstract":"<p>The name that identifies the field.</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageTypeSupported":{"name":"imageTypeSupported","abstract":"<p>The image types that are supported in this field.</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageResolution":{"name":"imageResolution","abstract":"<p>The image resolution of this field</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(im)initWithName:imageTypeSupported:imageResolution:":{"name":"-initWithName:imageTypeSupported:imageResolution:","abstract":"<p>Convenience initializer for the ImageField RPC struct</p>","parent_name":"SDLImageField"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:ofType:isTemplate:":{"name":"-initWithName:ofType:isTemplate:","abstract":"<p>Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:isTemplate:":{"name":"-initWithName:isTemplate:","abstract":"<p>Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticImageValue:":{"name":"-initWithStaticImageValue:","abstract":"<p>Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image&rsquo;s value.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticIconName:":{"name":"-initWithStaticIconName:","abstract":"<p>Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image&rsquo;s value.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)value":{"name":"value","abstract":"<p>The static hex icon value or the binary image file name identifier (sent by SDLPutFile)</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)imageType":{"name":"imageType","abstract":"<p>Describes whether the image is static or dynamic</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)isTemplate":{"name":"isTemplate","abstract":"<p>Indicates that this image can be (re)colored by the HMI to best fit the current color scheme.</p>","parent_name":"SDLImage"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)lowBeamsOn":{"name":"lowBeamsOn","abstract":"<p>Low beams are on or off.</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)highBeamsOn":{"name":"highBeamsOn","abstract":"<p>High beams are on or off</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)ambientLightSensorStatus":{"name":"ambientLightSensorStatus","abstract":"<p>Status of the ambient light senser</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(im)initWithId:rect:":{"name":"-initWithId:rect:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)id":{"name":"id","abstract":"<p>A user control spatial identifier</p>","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)rect":{"name":"rect","abstract":"<p>The position of the haptic rectangle to be highlighted. The center of this rectangle will be &ldquo;touched&rdquo; when a press occurs.</p>","parent_name":"SDLHapticRect"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(im)initWithDisplaymode:temperatureUnit:distanceUnit:":{"name":"-initWithDisplaymode:temperatureUnit:distanceUnit:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)displayMode":{"name":"displayMode","abstract":"<p>@abstract Display the Display Mode used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)temperatureUnit":{"name":"temperatureUnit","abstract":"<p>@abstract Display the temperature unit used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)distanceUnit":{"name":"distanceUnit","abstract":"<p>@abstract Display the distance unit used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:moduleInfo:":{"name":"-initWithModuleName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with moduleName</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:moduleInfo:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:":{"name":"-initWithModuleName:moduleInfo:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the hmi setting module.","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)distanceUnitAvailable":{"name":"distanceUnitAvailable","abstract":"<p>@abstract Availability of the control of distance unit.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)temperatureUnitAvailable":{"name":"temperatureUnitAvailable","abstract":"<p>@abstract Availability of the control of temperature unit.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)displayModeUnitAvailable":{"name":"displayModeUnitAvailable","abstract":"<p>@abstract Availability of the control of HMI display mode.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)allowed":{"name":"allowed","abstract":"<p>A set of all HMI levels that are permitted for this given RPC</p>","parent_name":"SDLHMIPermissions"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"<p>A set of all HMI levels that are prohibited for this given RPC</p>","parent_name":"SDLHMIPermissions"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(im)initWithNavigation:phoneCall:videoStreaming:remoteControl:appServices:displays:seatLocation:driverDistraction:":{"name":"-initWithNavigation:phoneCall:videoStreaming:remoteControl:appServices:displays:seatLocation:driverDistraction:","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)navigation":{"name":"navigation","abstract":"<p>Availability of built in Nav. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)phoneCall":{"name":"phoneCall","abstract":"<p>Availability of built in phone. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)videoStreaming":{"name":"videoStreaming","abstract":"<p>Availability of built in video streaming. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)remoteControl":{"name":"remoteControl","abstract":"<p>Availability of built in remote control. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)appServices":{"name":"appServices","abstract":"<p>Availability of app services. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)displays":{"name":"displays","abstract":"<p>Availability of displays. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)seatLocation":{"name":"seatLocation","abstract":"<p>Availability of seatLocation. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)driverDistraction":{"name":"driverDistraction","abstract":"<p>Availability of driver distraction capability. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)col":{"name":"col","abstract":"<p>Required, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)row":{"name":"row","abstract":"<p>Required, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)level":{"name":"level","abstract":"<p>Optional, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)colspan":{"name":"colspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)rowspan":{"name":"rowspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)levelspan":{"name":"levelspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGetWayPointsResponse.html#/c:objc(cs)SDLGetWayPointsResponse(py)waypoints":{"name":"waypoints","abstract":"<p>Provides additional human readable info regarding the result.</p>","parent_name":"SDLGetWayPointsResponse"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(im)initWithType:":{"name":"-initWithType:","abstract":"<p>Convenience init to get waypoints.</p>","parent_name":"SDLGetWayPoints"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(py)waypointType":{"name":"waypointType","abstract":"<p>To request for either the destination","parent_name":"SDLGetWayPoints"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for initializing data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for initializing data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The car current GPS coordinates</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The vehicle speed in kilometers per hour</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The number of revolutions per minute of the engine.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The fuel level in the tank (percentage)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The fuel level state</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The instantaneous fuel consumption in microlitres</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)vin":{"name":"vin","abstract":"<p>The Vehicle Identification Number</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The current pressure warnings for the user&rsquo;s vehicle</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>Odometer reading in km</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The status of the seat belts</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The body information including power modes</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The IVI system status including signal and battery strength</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The status of the brake pedal</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>Status of the head lamps</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The estimated percentage (0% - 100%) of remaining oil life of the engine</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>Torque value for engine (in Nm) on non-diesel variants</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>Accelerator pedal position (percentage depressed)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>Current angle of the steering wheel (in deg)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>Emergency Call notification and confirmation data</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The status of the air bags</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>Information related to an emergency event (and if it occurred)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>The status modes of the cluster</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>Information related to the MyKey feature</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The status of the electronic parking brake</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The status of the turn signal</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The cloud app vehicle ID</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>The stability controls status</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data item for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gps":{"name":"gps","abstract":"<p>A boolean value. If true, requests GPS data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)speed":{"name":"speed","abstract":"<p>A boolean value. If true, requests Speed data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)rpm":{"name":"rpm","abstract":"<p>A boolean value. If true, requests RPM data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>A boolean value. If true, requests Fuel Level data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>A boolean value. If true, requests Fuel Level State data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>A boolean value. If true, requests Fuel Range data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>A boolean value. If true, requests Instant Fuel Consumption data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)vin":{"name":"vin","abstract":"<p>A boolean value. If true, requests the Vehicle Identification Number.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>A boolean value. If true, requests Tire Pressure data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)odometer":{"name":"odometer","abstract":"<p>A boolean value. If true, requests Odometer data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>A boolean value. If true, requests Belt Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>A boolean value. If true, requests Body Information data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>A boolean value. If true, requests Device Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>A boolean value. If true, requests Driver Braking data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>A boolean value. If true, requests Wiper Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>A boolean value. If true, requests Head Lamp Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>A boolean value. If true, requests Engine Oil Life data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>A boolean value. If true, requests Engine Torque data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>A boolean value. If true, requests Acc Pedal Position data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>A boolean value. If true, requests Steering Wheel Angle data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>A boolean value. If true, requests Emergency Call Info data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>A boolean value. If true, requests Air Bag Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>A boolean value. If true, requests Emergency Event (if it occurred) data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>A boolean value. If true, requests Cluster Mode Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)myKey":{"name":"myKey","abstract":"<p>A boolean value. If true, requests MyKey data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, requests Electronic Parking Brake status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, requests Turn Signal data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, requests the Cloud App Vehicle ID.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>A boolean value. If true, requests StabilityControlsStatus data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data value for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetSystemCapabilityResponse.html#/c:objc(cs)SDLGetSystemCapabilityResponse(py)systemCapability":{"name":"systemCapability","abstract":"<p>The requested system capability, of the type that was sent in the request</p>","parent_name":"SDLGetSystemCapabilityResponse"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:":{"name":"-initWithType:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:subscribe:":{"name":"-initWithType:subscribe:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"<p>The type of system capability to get more information on</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)subscribe":{"name":"subscribe","abstract":"<p>Flag to subscribe to updates of the supplied service capability type. If true, the requester will be subscribed. If false, the requester will not be subscribed and be removed as a subscriber if it was previously subscribed.</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"<p>The requested data</p>","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)isSubscribed":{"name":"isSubscribed","abstract":"<p>It is a conditional-mandatory parameter: must be returned in case &ldquo;subscribe&rdquo; parameter was present in the related request.</p>","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleDataConsentResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataConsentResponse(py)allowed":{"name":"allowed","abstract":"<p>This array has the same size as &ldquo;moduleIds&rdquo; in the request; each element corresponding to one moduleId","parent_name":"SDLGetInteriorVehicleDataConsentResponse"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(im)initWithModuleType:moduleIds:":{"name":"-initWithModuleType:moduleIds:","abstract":"<p>Convenience init to get consent to control a module</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(py)moduleType":{"name":"moduleType","abstract":"<p>The module type that the app requests to control.</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(py)moduleIds":{"name":"moduleIds","abstract":"<p>Ids of a module of same type, published by System Capability.</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initWithModuleType:moduleId:":{"name":"-initWithModuleType:moduleId:","abstract":"<p>Convenience init to get information of a particular module type with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndSubscribeToModuleType:moduleId:":{"name":"-initAndSubscribeToModuleType:moduleId:","abstract":"<p>Convenience init to get information and subscribe to a particular module type with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndUnsubscribeToModuleType:moduleId:":{"name":"-initAndUnsubscribeToModuleType:moduleId:","abstract":"<p>Convenience init to unsubscribe from particular module with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)moduleType":{"name":"moduleType","abstract":"<p>The type of a RC module to retrieve module data from the vehicle.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)subscribe":{"name":"subscribe","abstract":"<p>If subscribe is true, the head unit will register OnInteriorVehicleData notifications for the requested module (moduleId and moduleType).","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(im)initWithOffset:length:fileType:crc:":{"name":"-initWithOffset:length:fileType:crc:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)fileType":{"name":"fileType","abstract":"<p>File type that is being sent in response.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)crc":{"name":"crc","abstract":"<p>Additional CRC32 checksum to protect data integrity up to 512 Mbits.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:":{"name":"-initWithFileName:appServiceId:fileType:","abstract":"<p>Convenience init for sending a small file.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:offset:length:":{"name":"-initWithFileName:appServiceId:fileType:offset:length:","abstract":"<p>Convenience init for sending a large file in multiple data chunks.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileName":{"name":"fileName","abstract":"<p>File name that should be retrieved.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)appServiceId":{"name":"appServiceId","abstract":"<p>ID of the service that should have uploaded the requested file.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileType":{"name":"fileType","abstract":"<p>Selected file type.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)ecuHeader":{"name":"ecuHeader","abstract":"<p>2 byte ECU Header for DTC response (as defined in VHR_Layout_Specification_DTCs.pdf)</p>","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)dtc":{"name":"dtc","abstract":"<p>Array of all reported DTCs on module (ecuHeader contains information if list is truncated). Each DTC is represented by 4 bytes (3 bytes of data and 1 byte status as defined in VHR_Layout_Specification_DTCs.pdf).</p>","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:":{"name":"-initWithECUName:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:mask:":{"name":"-initWithECUName:mask:","abstract":"<p>Convenience init with all properties</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)ecuName":{"name":"ecuName","abstract":"<p>a name of the module to receive the DTC form","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)dtcMask":{"name":"dtcMask","abstract":"<p>DTC Mask Byte to be sent in diagnostic request to module. NSNumber* dtcMask Minvalue:0; Maxvalue:255</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(py)properties":{"name":"properties","abstract":"<p>The requested cloud application properties.</p>","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(py)appID":{"name":"appID","abstract":"<p>The id of the cloud app.</p>","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(im)initWithAppServiceData:":{"name":"-initWithAppServiceData:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(py)serviceData":{"name":"serviceData","abstract":"<p>Contains all the current data of the app service.</p>","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"<p>Convenience init for service type.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndSubscribeToAppServiceType:":{"name":"-initAndSubscribeToAppServiceType:","abstract":"<p>Convenience init for subscribing to a service type.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndUnsubscribeToAppServiceType:":{"name":"-initAndUnsubscribeToAppServiceType:","abstract":"<p>Convenience init for unsubscribing to a service type</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See <code>AppServiceType</code> for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)subscribe":{"name":"subscribe","abstract":"<p>If true, the consumer is requesting to subscribe to all future updates from the service publisher. If false, the consumer doesn&rsquo;t wish to subscribe and should be unsubscribed if it was previously subscribed.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(im)initWithUserSelectedGear:actualGear:transmissionType:":{"name":"-initWithUserSelectedGear:actualGear:transmissionType:","abstract":"<p>Convenience initializer to assign all object properties</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)userSelectedGear":{"name":"userSelectedGear","abstract":"<p>Gear position selected by the user i.e. Park, Drive, Reverse</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)actualGear":{"name":"actualGear","abstract":"<p>Actual Gear in use by the transmission</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)transmissionType":{"name":"transmissionType","abstract":"<p>Tells the transmission type</p>","parent_name":"SDLGearStatus"},"Classes/SDLGateStatus.html#/c:objc(cs)SDLGateStatus(im)initWithLocation:status:":{"name":"-initWithLocation:status:","parent_name":"SDLGateStatus"},"Classes/SDLGateStatus.html#/c:objc(cs)SDLGateStatus(py)location":{"name":"location","abstract":"<p>Undocumented</p>","parent_name":"SDLGateStatus"},"Classes/SDLGateStatus.html#/c:objc(cs)SDLGateStatus(py)status":{"name":"status","abstract":"<p>Undocumented</p>","parent_name":"SDLGateStatus"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>longitude degrees</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>latitude degrees</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcYear":{"name":"utcYear","abstract":"<p>utc year</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMonth":{"name":"utcMonth","abstract":"<p>utc month</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcDay":{"name":"utcDay","abstract":"<p>utc day</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcHours":{"name":"utcHours","abstract":"<p>utc hours</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMinutes":{"name":"utcMinutes","abstract":"<p>utc minutes</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcSeconds":{"name":"utcSeconds","abstract":"<p>utc seconds</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)compassDirection":{"name":"compassDirection","abstract":"<p>Optional, Potential Compass Directions</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)pdop":{"name":"pdop","abstract":"<p>The 3D positional dilution of precision.</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)hdop":{"name":"hdop","abstract":"<p>The horizontal dilution of precision</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)vdop":{"name":"vdop","abstract":"<p>the vertical dilution of precision</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)actual":{"name":"actual","abstract":"<p>What the coordinates are based on</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)satellites":{"name":"satellites","abstract":"<p>The number of satellites in view</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)dimension":{"name":"dimension","abstract":"<p>The supported dimensions of the GPS</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)altitude":{"name":"altitude","abstract":"<p>Altitude in meters</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)heading":{"name":"heading","abstract":"<p>Heading based on the GPS data.</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)speed":{"name":"speed","abstract":"<p>Speed in KPH</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)shifted":{"name":"shifted","abstract":"<p>True, if GPS lat/long, time, and altitude have been purposefully shifted (requires a proprietary algorithm to unshift).","parent_name":"SDLGPSData"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(cm)sharedInstance":{"name":"+sharedInstance","abstract":"<p>The shared object for pulling function id information</p>","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionNameForId:":{"name":"-functionNameForId:","abstract":"<p>Gets the function name for a given SDL RPC function ID</p>","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionIdForName:":{"name":"-functionIdForName:","abstract":"<p>Gets the function ID for a given SDL RPC function name</p>","parent_name":"SDLFunctionID"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(im)initWithType:range:level:levelState:capacity:capacityUnit:":{"name":"-initWithType:range:level:levelState:capacity:capacityUnit:","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)capacity":{"name":"capacity","abstract":"<p>The absolute capacity of this fuel type.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)capacityUnit":{"name":"capacityUnit","abstract":"<p>The unit of the capacity of this fuel type such as liters for gasoline or kWh for batteries.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)level":{"name":"level","abstract":"<p>The relative remaining capacity of this fuel type (percentage).</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)levelState":{"name":"levelState","abstract":"<p>The fuel level state.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)type":{"name":"type","abstract":"<p>The vehicle&rsquo;s fuel type</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)range":{"name":"range","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)artworkRetryCount":{"name":"artworkRetryCount","abstract":"<p>Defines the number of times the file manager will attempt to reupload <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLArtwork.html\">SDLArtwork</a></code> files in the event of a failed upload to Core.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)fileRetryCount":{"name":"fileRetryCount","abstract":"<p>Defines the number of times the file manager will attempt to reupload general <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLFile.html\">SDLFile</a></code>s in the event of a failed upload to Core.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>Creates a default file manager configuration.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)init":{"name":"-init","abstract":"<p>Use <code>defaultConfiguration</code> instead</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)initWithArtworkRetryCount:fileRetryCount:":{"name":"-initWithArtworkRetryCount:fileRetryCount:","abstract":"<p>Creates a file manager configuration with customized upload retry counts.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)remoteFileNames":{"name":"remoteFileNames","abstract":"<p>A set of all names of files known on the remote head unit. Known files can be used or deleted on the remote system.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)bytesAvailable":{"name":"bytesAvailable","abstract":"<p>The number of bytes still available for files for this app.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)currentState":{"name":"currentState","abstract":"<p>The state of the file manager.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)pendingTransactions":{"name":"pendingTransactions","abstract":"<p>The currently pending transactions (Upload, Delete, and List Files) in the file manager</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)suspended":{"name":"suspended","abstract":"<p>Whether or not the file manager is suspended. If suspended, the file manager can continue to queue uploads and deletes, but will not actually perform any of those until it is no longer suspended. This can be used for throttling down the file manager if other, important operations are taking place over the accessory connection.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)init":{"name":"-init","abstract":"<p>Initialize the class&hellip;or not, since this method is unavailable. Dependencies must be injected using initWithConnectionManager:</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)initWithConnectionManager:configuration:":{"name":"-initWithConnectionManager:configuration:","abstract":"<p>Creates a new file manager with a specified connection manager and configuration</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>The manager stars up and attempts to fetch its initial list and transfer initial files.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)stop":{"name":"-stop","abstract":"<p>Cancels all file manager operations and deletes all associated data.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)hasUploadedFile:":{"name":"-hasUploadedFile:","abstract":"<p>Check if the remote system contains a file</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFileWithName:completionHandler:":{"name":"-deleteRemoteFileWithName:completionHandler:","abstract":"<p>Delete a file stored on the remote system</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFilesWithNames:completionHandler:":{"name":"-deleteRemoteFilesWithNames:completionHandler:","abstract":"<p>Deletes an array of files on the remote file system. The files are deleted in the order in which they are added to the array, with the first file to be deleted at index 0. The delete queue is sequential, meaning that once a delete request is sent to Core, the queue waits until a response is received from Core before the next the next delete request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFile:completionHandler:":{"name":"-uploadFile:completionHandler:","abstract":"<p>Upload a file to the remote file system. If a file with the [SDLFile name] already exists, this will overwrite that file. If you do not want that to happen, check remoteFileNames before uploading, or change allowOverwrite to NO.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:progressHandler:completionHandler:":{"name":"-uploadFiles:progressHandler:completionHandler:","abstract":"<p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:completionHandler:":{"name":"-uploadFiles:completionHandler:","abstract":"<p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)fileNeedsUpload:":{"name":"-fileNeedsUpload:","abstract":"<p>Check if an SDLFile needs to be uploaded to Core or not. This method differs from hasUploadedFile() because it takes the <code>isStaticIcon</code> and <code>overwrite</code> properties into consideration.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtwork:completionHandler:":{"name":"-uploadArtwork:completionHandler:","abstract":"<p>Uploads an artwork file to the remote file system and returns the name of the uploaded artwork once completed. If an artwork with the same name is already on the remote system, the artwork is not uploaded and the artwork name is simply returned.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:completionHandler:":{"name":"-uploadArtworks:completionHandler:","abstract":"<p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:progressHandler:completionHandler:":{"name":"-uploadArtworks:progressHandler:completionHandler:","abstract":"<p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(cm)temporaryFileDirectory":{"name":"+temporaryFileDirectory","abstract":"<p>A URL to the directory where temporary files are stored. When an SDLFile is created with NSData, it writes to a temporary file until the file manager finishes uploading it.</p>","parent_name":"SDLFileManager"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)persistent":{"name":"persistent","abstract":"<p>Whether or not the file should persist on disk between car ignition cycles.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)overwrite":{"name":"overwrite","abstract":"<p>Whether or not the file should overwrite an existing file on the remote disk with the same name.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)name":{"name":"name","abstract":"<p>The name the file should be stored under on the remote disk. This is how the file will be referenced in all later calls.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileURL":{"name":"fileURL","abstract":"<p>The url the local file is stored at while waiting to push it to the remote system. If the data has not been passed to the file URL, this will be nil.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)data":{"name":"data","abstract":"<p>The binary data of the SDLFile. If initialized with data, this will be a relatively quick call, but if initialized with a file URL, this is a rather expensive call the first time. The data will be cached in RAM after the first call.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileSize":{"name":"fileSize","abstract":"<p>The size of the binary data of the SDLFile.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileType":{"name":"fileType","abstract":"<p>The system will attempt to determine the type of file that you have passed in. It will default to BINARY if it does not recognize the file type or the file type is not supported by SDL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)inputStream":{"name":"inputStream","abstract":"<p>A stream to pull binary data from a SDLFile. The stream only pulls required data from the file on disk or in memory. This reduces memory usage while uploading a large file to the remote system as each chunk of data can be released immediately after it is uploaded.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)isStaticIcon":{"name":"isStaticIcon","abstract":"<p>Describes whether or not this file is represented by static icon data. The head unit will present its representation of the static icon concept when sent this data.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithFileURL:name:persistent:":{"name":"-initWithFileURL:name:persistent:","abstract":"<p>The designated initializer for an SDL File. The only major property that is not set using this is &ldquo;overwrite&rdquo;, which defaults to NO.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileAtFileURL:name:":{"name":"+persistentFileAtFileURL:name:","abstract":"<p>Create an SDL file using a local file URL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileAtFileURL:name:":{"name":"+fileAtFileURL:name:","abstract":"<p>Create an SDL file using a local file URL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithData:name:fileExtension:persistent:":{"name":"-initWithData:name:fileExtension:persistent:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileWithData:name:fileExtension:":{"name":"+persistentFileWithData:name:fileExtension:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileWithData:name:fileExtension:":{"name":"+fileWithData:name:fileExtension:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(im)initWithChannelId:channelSetting:":{"name":"-initWithChannelId:channelSetting:","abstract":"<p>Convenience init</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelName":{"name":"channelName","abstract":"<p>@abstract Read-only channel / frequency name","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelSetting":{"name":"channelSetting","abstract":"<p>@abstract Reflects the setting, from 0%-100%.</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelId":{"name":"channelId","abstract":"<p>@abstract id of the channel.</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(py)securityManagers":{"name":"securityManagers","abstract":"<p>A set of security managers used to encrypt traffic data. Each OEM has their own proprietary security manager.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(py)delegate":{"name":"delegate","abstract":"<p>A delegate callback that will tell you when an acknowledgement has occurred for starting as secure service.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>Creates a default encryption configuration.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(im)initWithSecurityManagers:delegate:":{"name":"-initWithSecurityManagers:delegate:","abstract":"<p>Creates a secure configuration for each of the security managers provided.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncodedSyncPData.html#/c:objc(cs)SDLEncodedSyncPData(py)data":{"name":"data","abstract":"<p>Contains base64 encoded string of SyncP packets.</p>","parent_name":"SDLEncodedSyncPData"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)emergencyEventType":{"name":"emergencyEventType","abstract":"<p>References signal &ldquo;VedsEvntType_D_Ltchd&rdquo;. See EmergencyEventType.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)fuelCutoffStatus":{"name":"fuelCutoffStatus","abstract":"<p>References signal &ldquo;RCM_FuelCutoff&rdquo;. See FuelCutoffStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)rolloverEvent":{"name":"rolloverEvent","abstract":"<p>References signal &ldquo;VedsEvntRoll_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)maximumChangeVelocity":{"name":"maximumChangeVelocity","abstract":"<p>References signal &ldquo;VedsMaxDeltaV_D_Ltchd&rdquo;. Change in velocity in KPH.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)multipleEvents":{"name":"multipleEvents","abstract":"<p>References signal &ldquo;VedsMultiEvnt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallNotificationStatus":{"name":"eCallNotificationStatus","abstract":"<p>References signal &ldquo;eCallNotification_4A&rdquo;. See VehicleDataNotificationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)auxECallNotificationStatus":{"name":"auxECallNotificationStatus","abstract":"<p>References signal &ldquo;eCallNotification&rdquo;. See VehicleDataNotificationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallConfirmationStatus":{"name":"eCallConfirmationStatus","abstract":"<p>References signal &ldquo;eCallConfirmation&rdquo;. See ECallConfirmationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(im)initWithSupportedDynamicImageFieldNames:supportsDynamicSubMenus:":{"name":"-initWithSupportedDynamicImageFieldNames:supportsDynamicSubMenus:","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(py)supportedDynamicImageFieldNames":{"name":"supportedDynamicImageFieldNames","abstract":"<p>An array of ImageFieldName values for which the system supports sending OnFileUpdate notifications. If you send an Image struct for that image field with a name without having uploaded the image data using PutFile that matches that name, the system will request that you upload the data with PutFile at a later point when the HMI needs it. The HMI will then display the image in the appropriate field. If not sent, assume false.","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(py)supportsDynamicSubMenus":{"name":"supportsDynamicSubMenus","abstract":"<p>If true, the head unit supports dynamic sub-menus by sending OnUpdateSubMenu notifications. If true, you should not send AddCommands that attach to a parentID for an AddSubMenu until OnUpdateSubMenu is received with the menuID. At that point, you should send all AddCommands with a parentID that match the menuID. If not set, assume false.</p>","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(im)initWithMenuLength:subMenuDepth:":{"name":"-initWithMenuLength:subMenuDepth:","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(py)menuLength":{"name":"menuLength","abstract":"<p>The number of items allowed in a Choice Set or Command menu while the driver is distracted","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(py)subMenuDepth":{"name":"subMenuDepth","abstract":"<p>The depth of submenus allowed when the driver is distracted. e.g. 3 == top level menu -&gt; submenu -&gt; submenu; 1 == top level menu only","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDoorStatus.html#/c:objc(cs)SDLDoorStatus(im)initWithLocation:status:":{"name":"-initWithLocation:status:","parent_name":"SDLDoorStatus"},"Classes/SDLDoorStatus.html#/c:objc(cs)SDLDoorStatus(py)location":{"name":"location","abstract":"<p>Undocumented</p>","parent_name":"SDLDoorStatus"},"Classes/SDLDoorStatus.html#/c:objc(cs)SDLDoorStatus(py)status":{"name":"status","abstract":"<p>Undocumented</p>","parent_name":"SDLDoorStatus"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(im)initWithDisplayName:":{"name":"-initWithDisplayName:","abstract":"<p>Init with required properties</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(im)initWithDisplayName:windowCapabilities:windowTypeSupported:":{"name":"-initWithDisplayName:windowCapabilities:windowTypeSupported:","abstract":"<p>Init with all the properties</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)displayName":{"name":"displayName","abstract":"<p>Name of the display.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)windowTypeSupported":{"name":"windowTypeSupported","abstract":"<p>Informs the application how many windows the app is allowed to create per type.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)windowCapabilities":{"name":"windowCapabilities","abstract":"<p>Contains a list of capabilities of all windows related to the app. Once the app has registered the capabilities of all windows will be provided, but GetSystemCapability still allows requesting window capabilities of all windows.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayType":{"name":"displayType","abstract":"<p>The type of display</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayName":{"name":"displayName","abstract":"<p>The name of the connected display</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)textFields":{"name":"textFields","abstract":"<p>An array of SDLTextField structures, each of which describes a field in the HMI which the application can write to using operations such as <em>SDLShow</em>, <em>SDLSetMediaClockTimer</em>, etc.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)imageFields":{"name":"imageFields","abstract":"<p>An array of SDLImageField elements</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)mediaClockFormats":{"name":"mediaClockFormats","abstract":"<p>An array of SDLMediaClockFormat elements, defining the valid string formats used in specifying the contents of the media clock field</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)graphicSupported":{"name":"graphicSupported","abstract":"<p>The display&rsquo;s persistent screen supports.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)templatesAvailable":{"name":"templatesAvailable","abstract":"<p>An array of all predefined persistent display templates available on the head unit.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)screenParams":{"name":"screenParams","abstract":"<p>A set of all parameters related to a prescribed screen area (e.g. for video / touch input)</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)numCustomPresetsAvailable":{"name":"numCustomPresetsAvailable","abstract":"<p>The number of on-screen custom presets available (if any); otherwise omitted</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(im)initWithNumber:":{"name":"-initWithNumber:","abstract":"<p>Convenience init to initiate a dial number request</p>","parent_name":"SDLDialNumber"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(py)number":{"name":"number","abstract":"<p>Up to 40 character string representing the phone number. All characters stripped except for &lsquo;0&rsquo;-&lsquo;9&rsquo;, &lsquo;*&rsquo;, &lsquo;#&rsquo;, &lsquo;,&rsquo;, &lsquo;;&rsquo;, and &lsquo;+&rsquo;</p>","parent_name":"SDLDialNumber"},"Classes/SDLDiagnosticMessageResponse.html#/c:objc(cs)SDLDiagnosticMessageResponse(py)messageDataResult":{"name":"messageDataResult","abstract":"<p>Array of bytes comprising CAN message result.</p>","parent_name":"SDLDiagnosticMessageResponse"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(im)initWithTargetId:length:data:":{"name":"-initWithTargetId:length:data:","abstract":"<p>Convenience init</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)targetID":{"name":"targetID","abstract":"<p>Name of target ECU</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageLength":{"name":"messageLength","abstract":"<p>Length of message (in bytes)</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageData":{"name":"messageData","abstract":"<p>Array of bytes comprising CAN message.</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)voiceRecOn":{"name":"voiceRecOn","abstract":"<p>Indicates whether the voice recognition is on or off</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)btIconOn":{"name":"btIconOn","abstract":"<p>Indicates whether the bluetooth connection established</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)callActive":{"name":"callActive","abstract":"<p>Indicates whether a call is being active</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)phoneRoaming":{"name":"phoneRoaming","abstract":"<p>Indicates whether the phone is in roaming mode</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)textMsgAvailable":{"name":"textMsgAvailable","abstract":"<p>Indicates whether a textmessage is available</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)battLevelStatus":{"name":"battLevelStatus","abstract":"<p>Battery level status</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)stereoAudioOutputMuted":{"name":"stereoAudioOutputMuted","abstract":"<p>The status of the stereo audio output channel</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)monoAudioOutputMuted":{"name":"monoAudioOutputMuted","abstract":"<p>The status of the mono audio output channel</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)signalLevelStatus":{"name":"signalLevelStatus","abstract":"<p>Signal level status</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)primaryAudioSource":{"name":"primaryAudioSource","abstract":"<p>The current primary audio source of SDL (if selected).</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)eCallEventActive":{"name":"eCallEventActive","abstract":"<p>Indicates if an emergency call is active</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(cm)currentDevice":{"name":"+currentDevice","abstract":"<p>Convenience init. Object will contain all information about the connected device automatically.</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)hardware":{"name":"hardware","abstract":"<p>Device model</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)firmwareRev":{"name":"firmwareRev","abstract":"<p>Device firmware version</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)os":{"name":"os","abstract":"<p>Device OS</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)osVersion":{"name":"osVersion","abstract":"<p>Device OS version</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)carrier":{"name":"carrier","abstract":"<p>Device mobile carrier</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)maxNumberRFCOMMPorts":{"name":"maxNumberRFCOMMPorts","abstract":"<p>Number of bluetooth RFCOMM ports available.</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeleteWindow.html#/c:objc(cs)SDLDeleteWindow(im)initWithId:":{"name":"-initWithId:","parent_name":"SDLDeleteWindow"},"Classes/SDLDeleteWindow.html#/c:objc(cs)SDLDeleteWindow(py)windowID":{"name":"windowID","abstract":"<p>A unique ID to identify the window.</p>","parent_name":"SDLDeleteWindow"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to delete a submenu</p>","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(py)menuID":{"name":"menuID","abstract":"<p>the MenuID that identifies the SDLSubMenu to be delete","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to delete a choice set</p>","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"<p>a unique ID that identifies the Choice Set","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteFileResponse.html#/c:objc(cs)SDLDeleteFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>The remaining available space for your application to store data on the remote system.</p>","parent_name":"SDLDeleteFileResponse"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init to delete a file</p>","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(py)syncFileName":{"name":"syncFileName","abstract":"<p>a file reference name","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to remove a command from the menu</p>","parent_name":"SDLDeleteCommand"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(py)cmdID":{"name":"cmdID","abstract":"<p>the Command ID that identifies the Command to be deleted from Command Menu","parent_name":"SDLDeleteCommand"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:":{"name":"-initWithHour:minute:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:":{"name":"-initWithHour:minute:second:millisecond:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:","abstract":"<p>Convenience init for creating a date with all properties</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)millisecond":{"name":"millisecond","abstract":"<p>Milliseconds part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)second":{"name":"second","abstract":"<p>Seconds part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)minute":{"name":"minute","abstract":"<p>Minutes part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)hour":{"name":"hour","abstract":"<p>Hour part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)day":{"name":"day","abstract":"<p>Day of the month</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)month":{"name":"month","abstract":"<p>Month of the year</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)year":{"name":"year","abstract":"<p>The year in YYYY format</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneMinuteOffset":{"name":"timezoneMinuteOffset","abstract":"<p>Time zone offset in Min with regard to UTC</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneHourOffset":{"name":"timezoneHourOffset","abstract":"<p>Time zone offset in Hours with regard to UTC</p>","parent_name":"SDLDateTime"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)resultCode":{"name":"resultCode","abstract":"<p>Individual DID result code.</p>","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)didLocation":{"name":"didLocation","abstract":"<p>Location of raw data from vehicle data DID</p>","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)data":{"name":"data","abstract":"<p>Raw DID-based data returned for requested element.</p>","parent_name":"SDLDIDResult"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(im)initWithId:windowName:windowType:":{"name":"-initWithId:windowName:windowType:","abstract":"<p>Constructor with the required parameters</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(im)initWithId:windowName:windowType:associatedServiceType:duplicateUpdatesFromWindowID:":{"name":"-initWithId:windowName:windowType:associatedServiceType:duplicateUpdatesFromWindowID:","abstract":"<p>Convinience constructor with all the parameters.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)windowID":{"name":"windowID","abstract":"<p>A unique ID to identify the window.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)windowName":{"name":"windowName","abstract":"<p>The window name to be used by the HMI.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)type":{"name":"type","abstract":"<p>The type of the window to be created. Main window or widget.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)associatedServiceType":{"name":"associatedServiceType","abstract":"<p>Allows an app to create a widget related to a specific service type.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)duplicateUpdatesFromWindowID":{"name":"duplicateUpdatesFromWindowID","abstract":"<p>Optional parameter. Specify whether the content sent to an existing window should be duplicated to the created window. If there isn&rsquo;t a window with the ID, the request will be rejected with <code>INVALID_DATA</code>.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(im)initWithId:choiceSet:":{"name":"-initWithId:choiceSet:","abstract":"<p>Convenience init for creating a choice set RPC</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"<p>A unique ID that identifies the Choice Set</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)choiceSet":{"name":"choiceSet","abstract":"<p>Array of choices, which the user can select by menu or voice recognition</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lifecycleConfig":{"name":"lifecycleConfig","abstract":"<p>The lifecycle configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lockScreenConfig":{"name":"lockScreenConfig","abstract":"<p>The lock screen configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)loggingConfig":{"name":"loggingConfig","abstract":"<p>The log configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)streamingMediaConfig":{"name":"streamingMediaConfig","abstract":"<p>The streaming media configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)fileManagerConfig":{"name":"fileManagerConfig","abstract":"<p>The file manager configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)encryptionConfig":{"name":"encryptionConfig","abstract":"<p>The encryption configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:fileManager:encryption:":{"name":"-initWithLifecycle:lockScreen:logging:fileManager:encryption:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, file manager and encryption configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media, file manager and encryption configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeActive":{"name":"powerModeActive","abstract":"<p>References signal &ldquo;PowerMode_UB&rdquo;.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeQualificationStatus":{"name":"powerModeQualificationStatus","abstract":"<p>References signal &ldquo;PowerModeQF&rdquo;. See PowerModeQualificationStatus.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)carModeStatus":{"name":"carModeStatus","abstract":"<p>References signal &ldquo;CarMode&rdquo;. See CarMode.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeStatus":{"name":"powerModeStatus","abstract":"<p>References signal &ldquo;PowerMode&rdquo;. See PowerMode.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:":{"name":"-initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)nicknames":{"name":"nicknames","abstract":"<p>An array of app names a cloud app is allowed to register with. If included in a <code>SetCloudAppProperties</code> request, this value will overwrite the existing &ldquo;nicknames&rdquo; field in the app policies section of the policy table.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)appID":{"name":"appID","abstract":"<p>The id of the cloud app.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)enabled":{"name":"enabled","abstract":"<p>If true, the cloud app will appear in the HMI&rsquo;s app list; if false, the cloud app will not appear in the HMI&rsquo;s app list.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)authToken":{"name":"authToken","abstract":"<p>Used to authenticate websocket connection on app activation.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)cloudTransportType":{"name":"cloudTransportType","abstract":"<p>Specifies the connection type Core should use. Currently the ones that work in SDL Core are <code>WS</code> or <code>WSS</code>, but an OEM can implement their own transport adapter to handle different values.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)hybridAppPreference":{"name":"hybridAppPreference","abstract":"<p>Specifies the user preference to use the cloud app version or mobile app version when both are available.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)endpoint":{"name":"endpoint","abstract":"<p>The websocket endpoint.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(im)initWithExternalTemperature:cabinTemperature:atmosphericPressure:":{"name":"-initWithExternalTemperature:cabinTemperature:atmosphericPressure:","parent_name":"SDLClimateData"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius</p>","parent_name":"SDLClimateData"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(py)cabinTemperature":{"name":"cabinTemperature","abstract":"<p>Internal ambient cabin temperature in degrees celsius</p>","parent_name":"SDLClimateData"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(py)atmosphericPressure":{"name":"atmosphericPressure","abstract":"<p>Current atmospheric pressure in mBar","parent_name":"SDLClimateData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(im)initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:climateEnable:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:climateEnable:","abstract":"<p>Convenience init for climate control data with all properties.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)fanSpeed":{"name":"fanSpeed","abstract":"<p>Speed of Fan in integer</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)currentTemperature":{"name":"currentTemperature","abstract":"<p>The Current Temperature in SDLTemperature</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)desiredTemperature":{"name":"desiredTemperature","abstract":"<p>Desired Temperature in SDLTemperature</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acEnable":{"name":"acEnable","abstract":"<p>Represents if AC is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)circulateAirEnable":{"name":"circulateAirEnable","abstract":"<p>Represents if circulation of air is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)autoModeEnable":{"name":"autoModeEnable","abstract":"<p>Represents if auto mode is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)defrostZone":{"name":"defrostZone","abstract":"<p>Represents the kind of defrost zone.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)dualModeEnable":{"name":"dualModeEnable","abstract":"<p>Represents if dual mode is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acMaxEnable":{"name":"acMaxEnable","abstract":"<p>Represents if ac max is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)ventilationMode":{"name":"ventilationMode","abstract":"<p>Represents the kind of Ventilation zone.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedSteeringWheelEnable":{"name":"heatedSteeringWheelEnable","abstract":"<p>@abstract value false means disabled/turn off, value true means enabled/turn on.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedWindshieldEnable":{"name":"heatedWindshieldEnable","abstract":"<p>@abstract value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedRearWindowEnable":{"name":"heatedRearWindowEnable","abstract":"<p>@abstract value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedMirrorsEnable":{"name":"heatedMirrorsEnable","abstract":"<p>@abstract Value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)climateEnable":{"name":"climateEnable","abstract":"<p>@abstract Value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:moduleInfo:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:":{"name":"-initWithModuleName:moduleInfo:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:","abstract":"<p>Convenience init to describe the climate control capabilities with all properties.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)moduleName":{"name":"moduleName","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)fanSpeedAvailable":{"name":"fanSpeedAvailable","abstract":"<p>Availability of the control of fan speed.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)desiredTemperatureAvailable":{"name":"desiredTemperatureAvailable","abstract":"<p>Availability of the control of desired temperature.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acEnableAvailable":{"name":"acEnableAvailable","abstract":"<p>Availability of the control of turn on/off AC.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acMaxEnableAvailable":{"name":"acMaxEnableAvailable","abstract":"<p>Availability of the control of enable/disable air conditioning is ON on the maximum level.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)circulateAirEnableAvailable":{"name":"circulateAirEnableAvailable","abstract":"<p>Availability of the control of enable/disable circulate Air mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)autoModeEnableAvailable":{"name":"autoModeEnableAvailable","abstract":"<p>Availability of the control of enable/disable auto mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)dualModeEnableAvailable":{"name":"dualModeEnableAvailable","abstract":"<p>Availability of the control of enable/disable dual mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZoneAvailable":{"name":"defrostZoneAvailable","abstract":"<p>Availability of the control of defrost zones.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZone":{"name":"defrostZone","abstract":"<p>A set of all defrost zones that are controllable.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationModeAvailable":{"name":"ventilationModeAvailable","abstract":"<p>Availability of the control of air ventilation mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationMode":{"name":"ventilationMode","abstract":"<p>A set of all ventilation modes that are controllable.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedSteeringWheelAvailable":{"name":"heatedSteeringWheelAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Steering Wheel.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedWindshieldAvailable":{"name":"heatedWindshieldAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Windshield.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedRearWindowAvailable":{"name":"heatedRearWindowAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Rear Window.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedMirrorsAvailable":{"name":"heatedMirrorsAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Mirrors.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)climateEnableAvailable":{"name":"climateEnableAvailable","abstract":"<p>@abstract Availability of the control of enable/disable climate control.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout":{"name":"defaultTimeout","abstract":"<p>Set this to change the default timeout for all choice sets. If a timeout is not set on an individual choice set object (or if it is set to 0.0), then it will use this timeout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout\">timeout</a></code> for more details. If this is not set by you, it will default to 10 seconds. The minimum is 5 seconds, the maximum is 100 seconds. If this is set below the minimum, it will be capped at 5 seconds. If this is set above the maximum, it will be capped at 100 seconds.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultLayout":{"name":"defaultLayout","abstract":"<p>Set this to change the default layout for all choice sets. If a layout is not set on an individual choice set object, then it will use this layout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)layout\">layout</a></code> for more details. If this is not set by you, it will default to <code>SDLChoiceSetLayoutList</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)title":{"name":"title","abstract":"<p>Maps to PerformInteraction.initialText. The title of the choice set, and/or the initial text on a keyboard prompt.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>Maps to PerformInteraction.initialPrompt. The initial prompt spoken to the user at the start of an interaction.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)layout":{"name":"layout","abstract":"<p>Maps to PerformInteraction.interactionLayout. Whether the presented choices are arranged as a set of tiles or a list.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout":{"name":"timeout","abstract":"<p>Maps to PerformInteraction.timeout. Timeout in seconds. Defaults to 0, which will use <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout\">defaultTimeout</a></code>. If this is set below the minimum, it will be capped at 5 seconds. Minimum 5 seconds, maximum 100 seconds. If this is set above the maximum, it will be capped at 100 seconds. Defaults to 0.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Maps to PerformInteraction.timeoutPrompt. This text is spoken when a VR interaction times out. If this set is presented in a manual (non-voice) only interaction, this will be ignored.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Maps to PerformInteraction.helpPrompt. This is the spoken string when a user speaks &ldquo;help&rdquo; when the interaction is occurring.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpList":{"name":"helpList","abstract":"<p>Maps to PerformInteraction.vrHelp. This is a list of help text presented to the user when they are in a voice recognition interaction from your choice set of options. If this set is presented in a touch only interaction, this will be ignored.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)delegate":{"name":"delegate","abstract":"<p>The delegate of this choice set, called when the user interacts with it.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)choices":{"name":"choices","abstract":"<p>The choices to be displayed to the user within this choice set. These choices could match those already preloaded via <code>SDLScreenManager preloadChoices:withCompletionHandler:</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)init":{"name":"-init","abstract":"<p>Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be <code>nil</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:choices:":{"name":"-initWithTitle:delegate:choices:","abstract":"<p>Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be <code>nil</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:","abstract":"<p>Initializer with all possible properties.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:","abstract":"<p>Initializer with all possible properties.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)cancel":{"name":"-cancel","abstract":"<p>Cancels the choice set. If the choice set has not yet been sent to Core, it will not be sent. If the choice set is already presented on Core, the choice set will be immediately dismissed. Canceling an already presented choice set will only work if connected to Core versions 6.0+. On older versions of Core, the choice set will not be dismissed.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)text":{"name":"text","abstract":"<p>Maps to Choice.menuName. The primary text of the cell. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are not permitted and will result in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> failing to initialize.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryText":{"name":"secondaryText","abstract":"<p>Maps to Choice.secondaryText. Optional secondary text of the cell, if available. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are permitted.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Maps to Choice.tertiaryText. Optional tertitary text of the cell, if available. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are permitted.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>Maps to Choice.vrCommands. Optional voice commands the user can speak to activate the cell. If not set and the head unit requires it, this will be set to the number in the list that this item appears. However, this would be a very poor experience for a user if the choice set is presented as a voice only interaction or both interaction mode. Therefore, consider not setting this only when you know the choice set will be presented as a touch only interaction.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)artwork":{"name":"artwork","abstract":"<p>Maps to Choice.image. Optional image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryArtwork":{"name":"secondaryArtwork","abstract":"<p>Maps to Choice.secondaryImage. Optional secondary image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)uniqueText":{"name":"uniqueText","abstract":"<p>Primary text of the cell to be displayed on the module. Used to distinguish cells with the same <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)text\">text</a></code> but other fields are different. This is autogenerated by the screen manager. Attempting to use cells that are exactly the same (all text and artwork fields are the same) will not cause this to be used. This will not be used when connected to modules supporting RPC 7.1+.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)init":{"name":"-init","abstract":"<p>Initialize the cell with nothing. This is unavailable</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:":{"name":"-initWithText:","abstract":"<p>Initialize the cell with text and nothing else.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:artwork:voiceCommands:":{"name":"-initWithText:artwork:voiceCommands:","abstract":"<p>Initialize the cell with text, optional artwork, and optional voice commands</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:":{"name":"-initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:","abstract":"<p>Initialize the cell with all optional items</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:":{"name":"-initWithId:menuName:vrCommands:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with the required parameters</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:":{"name":"-initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with all parameters</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)choiceID":{"name":"choiceID","abstract":"<p>The application-scoped identifier that uniquely identifies this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)menuName":{"name":"menuName","abstract":"<p>Text which appears in menu, representing this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)vrCommands":{"name":"vrCommands","abstract":"<p>VR synonyms for this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)image":{"name":"image","abstract":"<p>The image of the choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryText":{"name":"secondaryText","abstract":"<p>Secondary text to display; e.g. address of POI in a search result entry</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Tertiary text to display; e.g. distance to POI for a search result entry</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryImage":{"name":"secondaryImage","abstract":"<p>Secondary image for choice</p>","parent_name":"SDLChoice"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:":{"name":"-initWithLanguage:hmiDisplayLanguage:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with required parameters</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:":{"name":"-initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with all parameters</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)language":{"name":"language","abstract":"<p>The language the app wants to change to</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>HMI display language</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)appName":{"name":"appName","abstract":"<p>Request a new app name registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ttsName":{"name":"ttsName","abstract":"<p>Request a new TTSName registration.</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"<p>Request a new app short name registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)vrSynonyms":{"name":"vrSynonyms","abstract":"<p>Request a new VR synonyms registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLCarWindowViewController.html#/c:objc(cs)SDLCarWindowViewController(py)supportedOrientation":{"name":"supportedOrientation","abstract":"<p>The supported interface orientation you wish to use. Defaults to MaskPortrait.</p>","parent_name":"SDLCarWindowViewController"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithFunctionID:":{"name":"-initWithFunctionID:","abstract":"<p>Convenience init for dismissing the currently presented modal view (either an alert, slider, scrollable message, or perform interaction).</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithFunctionID:cancelID:":{"name":"-initWithFunctionID:cancelID:","abstract":"<p>Convenience init for dismissing a specific view.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithAlertCancelID:":{"name":"-initWithAlertCancelID:","abstract":"<p>Convenience init for dismissing an alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithSliderCancelID:":{"name":"-initWithSliderCancelID:","abstract":"<p>Convenience init for dismissing a slider.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithScrollableMessageCancelID:":{"name":"-initWithScrollableMessageCancelID:","abstract":"<p>Convenience init for dismissing a scrollable message.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithPerformInteractionCancelID:":{"name":"-initWithPerformInteractionCancelID:","abstract":"<p>Convenience init for dismissing a perform interaction.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithSubtleAlertCancelID:":{"name":"-initWithSubtleAlertCancelID:","abstract":"<p>Convenience init for dismissing a subtle alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)alert":{"name":"+alert","abstract":"<p>Convenience init for dismissing the currently presented alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)slider":{"name":"+slider","abstract":"<p>Convenience init for dismissing the currently presented slider.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)scrollableMessage":{"name":"+scrollableMessage","abstract":"<p>Convenience init for dismissing the currently presented scrollable message.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)performInteraction":{"name":"+performInteraction","abstract":"<p>Convenience init for dismissing the currently presented perform interaction.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)subtleAlert":{"name":"+subtleAlert","abstract":"<p>Convenience init for dismissing the currently presented subtle alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(py)cancelID":{"name":"cancelID","abstract":"<p>The ID of the specific interaction to dismiss. If not set, the most recent of the RPC type set in functionID will be dismissed.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(py)functionID":{"name":"functionID","abstract":"<p>The ID of the type of interaction to dismiss.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(im)initWithButtonName:moduleType:moduleId:buttonPressMode:":{"name":"-initWithButtonName:moduleType:moduleId:buttonPressMode:","abstract":"<p>Constructs a newly allocated SDLButtonPress object with the given parameters</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)moduleType":{"name":"moduleType","abstract":"<p>The module where the button should be pressed.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonName":{"name":"buttonName","abstract":"<p>The name of supported RC climate or radio button.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press event.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)name":{"name":"name","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"<p>A NSNumber value indicates whether the button supports a SHORT press</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"<p>A NSNumber value indicates whether the button supports a LONG press</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"<p>A NSNumber value indicates whether the button supports &ldquo;button down&rdquo; and &ldquo;button up&rdquo;</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(im)initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:":{"name":"-initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(im)initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:doorStatuses:gateStatuses:roofStatuses:":{"name":"-initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:doorStatuses:gateStatuses:roofStatuses:","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)parkBrakeActive":{"name":"parkBrakeActive","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStableStatus":{"name":"ignitionStableStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStatus":{"name":"ignitionStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)driverDoorAjar":{"name":"driverDoorAjar","abstract":"<p>References signal &ldquo;DrStatDrv_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)passengerDoorAjar":{"name":"passengerDoorAjar","abstract":"<p>References signal &ldquo;DrStatPsngr_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearLeftDoorAjar":{"name":"rearLeftDoorAjar","abstract":"<p>References signal &ldquo;DrStatRl_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearRightDoorAjar":{"name":"rearRightDoorAjar","abstract":"<p>References signal &ldquo;DrStatRr_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)doorStatuses":{"name":"doorStatuses","abstract":"<p>Provides status for doors if Ajar/Closed/Locked","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)gateStatuses":{"name":"gateStatuses","abstract":"<p>Provides status for trunk/hood/etc. if Ajar/Closed/Locked","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)roofStatuses":{"name":"roofStatuses","abstract":"<p>Provides status for roof/convertible roof/sunroof/moonroof etc., if Closed/Ajar/Removed etc.","parent_name":"SDLBodyInformation"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBeltDeployed":{"name":"driverBeltDeployed","abstract":"<p>References signal &ldquo;VedsDrvBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBeltDeployed":{"name":"passengerBeltDeployed","abstract":"<p>References signal &ldquo;VedsPasBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBuckleBelted":{"name":"passengerBuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1PasBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBuckleBelted":{"name":"driverBuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1DrvBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow2BuckleBelted":{"name":"leftRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2lBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerChildDetected":{"name":"passengerChildDetected","abstract":"<p>References signal &ldquo;VedsRw1PasChld_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow2BuckleBelted":{"name":"rightRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2rBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow2BuckleBelted":{"name":"middleRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow3BuckleBelted":{"name":"middleRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow3BuckleBelted":{"name":"leftRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3lBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow3BuckleBelted":{"name":"rightRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3rBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRearInflatableBelted":{"name":"leftRearInflatableBelted","abstract":"<p>References signal &ldquo;VedsRw2lRib_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRearInflatableBelted":{"name":"rightRearInflatableBelted","abstract":"<p>References signal &ldquo;VedsRw2rRib_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BeltDeployed":{"name":"middleRow1BeltDeployed","abstract":"<p>References signal &ldquo;VedsRw1mBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BuckleBelted":{"name":"middleRow1BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)delegate":{"name":"delegate","abstract":"<p>The delegate describing when files are done playing or any errors that occur</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)playing":{"name":"playing","abstract":"<p>Whether or not we are currently playing audio</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)queue":{"name":"queue","abstract":"<p>The queue of audio files that will be played in sequence</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)init":{"name":"-init","abstract":"<p>Init should only occur with dependencies. use <code>initWithManager:</code></p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)initWithManager:":{"name":"-initWithManager:","abstract":"<p>Create an audio stream manager with a reference to the parent stream manager.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithFileURL:":{"name":"-pushWithFileURL:","abstract":"<p>Push a new file URL onto the queue after converting it into the correct PCM format for streaming binary data. Call <code>playNextWhenReady</code> to start playing the next completed pushed file.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithData:":{"name":"-pushWithData:","abstract":"<p>Push a new audio buffer onto the queue. Call <code>playNextWhenReady</code> to start playing the pushed audio buffer.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)playNextWhenReady":{"name":"-playNextWhenReady","abstract":"<p>Play the next item in the queue. If an item is currently playing, it will continue playing and this item will begin playing after it is completed.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)stop":{"name":"-stop","abstract":"<p>Stop playing the queue after the current item completes and clear the queue. If nothing is playing, the queue will be cleared.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)samplingRate":{"name":"samplingRate","abstract":"<p>The sampling rate for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)bitsPerSample":{"name":"bitsPerSample","abstract":"<p>The sample depth in bit for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)audioType":{"name":"audioType","abstract":"<p>The audiotype for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)inputFileURL":{"name":"inputFileURL","abstract":"<p>If initialized with a file URL, the file URL it came from</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)outputFileURL":{"name":"outputFileURL","abstract":"<p>If initialized with a file URL, where the transcoder should produce the transcoded PCM audio file</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)estimatedDuration":{"name":"estimatedDuration","abstract":"<p>In seconds. UINT32_MAX if unknown.</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)data":{"name":"data","abstract":"<p>The PCM audio data to be transferred and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)fileSize":{"name":"fileSize","abstract":"<p>The size of the PCM audio data in bytes</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(im)initWithInputFileURL:outputFileURL:estimatedDuration:":{"name":"-initWithInputFileURL:outputFileURL:estimatedDuration:","abstract":"<p>Initialize an audio file to be queued and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(im)initWithData:":{"name":"-initWithData:","abstract":"<p>Initialize a buffer of PCM audio data to be queued and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(py)audioData":{"name":"audioData","abstract":"<p>The text-to-speech prompts that will used and/or audio files that will be played. The audio prompts and files will be played in the same order they are added.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)initWithAudioFile:":{"name":"-initWithAudioFile:","abstract":"<p>Initialize with an SDLFile holding data or pointing to a file on the file system. When this object is passed to an <code>Alert</code> or <code>Speak</code>, the file will be uploaded if it is not already, then played if the system supports that feature.","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)initWithSpeechSynthesizerString:":{"name":"-initWithSpeechSynthesizerString:","abstract":"<p>Initialize with a string to be spoken by the system speech synthesizer.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)initWithPhoneticSpeechSynthesizerString:phoneticType:":{"name":"-initWithPhoneticSpeechSynthesizerString:phoneticType:","abstract":"<p>Initialize with a string to be spoken by the system speech synthesizer using a phonetic string.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)init":{"name":"-init","abstract":"<p>Undocumented</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)addAudioFiles:":{"name":"-addAudioFiles:","abstract":"<p>Add additional SDLFiles holding data or pointing to a file on the file system. When this object is passed to an <code>Alert</code> or <code>Speak</code>, the file will be uploaded if it is not already, then played if the system supports that feature.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)addSpeechSynthesizerStrings:":{"name":"-addSpeechSynthesizerStrings:","abstract":"<p>Create additional strings to be spoken by the system speech synthesizer.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)addPhoneticSpeechSynthesizerStrings:phoneticType:":{"name":"-addPhoneticSpeechSynthesizerStrings:phoneticType:","abstract":"<p>Create additional strings to be spoken by the system speech synthesizer using a phonetic string.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(im)initWithSource:keepContext:volume:equalizerSettings:":{"name":"-initWithSource:keepContext:volume:equalizerSettings:","abstract":"<p>Constructs a newly allocated SDLAudioControlData object with given parameters</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)source":{"name":"source","abstract":"<p>@abstract In a getter response or a notification,","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)keepContext":{"name":"keepContext","abstract":"<p>@abstract This parameter shall not be present in any getter responses or notifications.","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)volume":{"name":"volume","abstract":"<p>@abstract Reflects the volume of audio, from 0%-100%.</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)equalizerSettings":{"name":"equalizerSettings","abstract":"<p>@abstract Defines the list of supported channels (band) and their current/desired settings on HMI</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:moduleInfo:":{"name":"-initWithModuleName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLAudioControlCapabilities object with audio control module name (max 100 chars)</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:moduleInfo:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:":{"name":"-initWithModuleName:moduleInfo:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:","abstract":"<p>Constructs a newly allocated SDLAudioControlCapabilities object with given parameters</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the audio control module.","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)sourceAvailable":{"name":"sourceAvailable","abstract":"<p>@abstract Availability of the control of audio source.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)keepContextAvailable":{"name":"keepContextAvailable","abstract":"<p>Availability of the keepContext parameter.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)volumeAvailable":{"name":"volumeAvailable","abstract":"<p>@abstract Availability of the control of audio volume.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerAvailable":{"name":"equalizerAvailable","abstract":"<p>@abstract Availability of the control of Equalizer Settings.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerMaxChannelId":{"name":"equalizerMaxChannelId","abstract":"<p>@abstract Must be included if equalizerAvailable=true,","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)isTemplate":{"name":"isTemplate","abstract":"<p>Describes whether or not the image is a template that can be (re)colored by the SDL HMI. To make the artwork a template, set the <code>UIImage</code>s rendering mode to <code>UIImageRenderingModeAlwaysTemplate</code>. In order for templates to work successfully, the icon must be one solid color with a clear background. The artwork should be created using the PNG image format.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)imageRPC":{"name":"imageRPC","abstract":"<p>The Image RPC representing this artwork. Generally for use internally, you should instead pass an artwork to a Screen Manager method.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:name:asImageFormat:":{"name":"+artworkWithImage:name:asImageFormat:","abstract":"<p>Convenience helper to create an ephemeral artwork from an image.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:asImageFormat:":{"name":"+artworkWithImage:asImageFormat:","abstract":"<p>Convenience helper to create an ephemeral artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithStaticIcon:":{"name":"+artworkWithStaticIcon:","abstract":"<p>Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:name:asImageFormat:":{"name":"+persistentArtworkWithImage:name:asImageFormat:","abstract":"<p>Convenience helper to create a persistent artwork from an image.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:asImageFormat:":{"name":"+persistentArtworkWithImage:asImageFormat:","abstract":"<p>Convenience helper to create a persistent artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:name:persistent:asImageFormat:":{"name":"-initWithImage:name:persistent:asImageFormat:","abstract":"<p>Create a file for transmission to the remote system from a UIImage.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:persistent:asImageFormat:":{"name":"-initWithImage:persistent:asImageFormat:","abstract":"<p>Create a file for transmission to the remote system from a UIImage. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithStaticIcon:":{"name":"-initWithStaticIcon:","abstract":"<p>Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.</p>","parent_name":"SDLArtwork"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(im)initWithAppServices:":{"name":"-initWithAppServices:","abstract":"<p>Convenience init.</p>","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(py)appServices":{"name":"appServices","abstract":"<p>An array of currently available services. If this is an update to the capability the affected services will include an update reason in that item.</p>","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(im)initWithServiceID:serviceManifest:servicePublished:serviceActive:":{"name":"-initWithServiceID:serviceManifest:servicePublished:serviceActive:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceID":{"name":"serviceID","abstract":"<p>A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceManifest":{"name":"serviceManifest","abstract":"<p>Manifest for the service that this record is for.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)servicePublished":{"name":"servicePublished","abstract":"<p>If true, the service is published and available. If false, the service has likely just been unpublished, and should be considered unavailable.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceActive":{"name":"serviceActive","abstract":"<p>If true, the service is the active primary service of the supplied service type. It will receive all potential RPCs that are passed through to that service type. If false, it is not the primary service of the supplied type. See servicePublished for its availability.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"<p>Convenience init for serviceType.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithMediaServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:":{"name":"-initWithMediaServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:","abstract":"<p>Convenience init for a media service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithWeatherServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:weatherServiceManifest:":{"name":"-initWithWeatherServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:weatherServiceManifest:","abstract":"<p>Convenience init for a weather service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithNavigationServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:navigationServiceManifest:":{"name":"-initWithNavigationServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:navigationServiceManifest:","abstract":"<p>Convenience init for a navigation service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithServiceName:serviceType:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:":{"name":"-initWithServiceName:serviceType:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceName":{"name":"serviceName","abstract":"<p>Unique name of this service.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See AppServiceType for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceIcon":{"name":"serviceIcon","abstract":"<p>The file name of the icon to be associated with this service. Most likely the same as the appIcon.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)allowAppConsumers":{"name":"allowAppConsumers","abstract":"<p>If true, app service consumers beyond the IVI system will be able to access this service. If false, only the IVI system will be able consume the service. If not provided, it is assumed to be false.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)maxRPCSpecVersion":{"name":"maxRPCSpecVersion","abstract":"<p>This is the max RPC Spec version the app service understands. This is important during the RPC passthrough functionality. If not included, it is assumed the max version of the module is acceptable.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)handledRPCs":{"name":"handledRPCs","abstract":"<p>This field contains the Function IDs for the RPCs that this service intends to handle correctly. This means the service will provide meaningful responses. See FunctionID for enum equivalent values. This parameter is an integer to allow for new function IDs to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)mediaServiceManifest":{"name":"mediaServiceManifest","abstract":"<p>A media service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)weatherServiceManifest":{"name":"weatherServiceManifest","abstract":"<p>A weather service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)navigationServiceManifest":{"name":"navigationServiceManifest","abstract":"<p>A navigation service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:":{"name":"-initWithAppServiceType:serviceId:","abstract":"<p>Convenience init for service type and service id.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithMediaServiceData:serviceId:":{"name":"-initWithMediaServiceData:serviceId:","abstract":"<p>Convenience init for media service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithWeatherServiceData:serviceId:":{"name":"-initWithWeatherServiceData:serviceId:","abstract":"<p>Convenience init for weather service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithNavigationServiceData:serviceId:":{"name":"-initWithNavigationServiceData:serviceId:","abstract":"<p>Convenience init for navigation service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:":{"name":"-initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See <code>AppServiceType</code> for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceId":{"name":"serviceId","abstract":"<p>A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)mediaServiceData":{"name":"mediaServiceData","abstract":"<p>The media service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)weatherServiceData":{"name":"weatherServiceData","abstract":"<p>The weather service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)navigationServiceData":{"name":"navigationServiceData","abstract":"<p>The navigation service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdatedAppServiceRecord:":{"name":"-initWithUpdatedAppServiceRecord:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdateReason:updatedAppServiceRecord:":{"name":"-initWithUpdateReason:updatedAppServiceRecord:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updateReason":{"name":"updateReason","abstract":"<p>Only included in <code>OnSystemCapbilityUpdated</code>. Update reason for this service record.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updatedAppServiceRecord":{"name":"updatedAppServiceRecord","abstract":"<p>Service record for a specific app service provider.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(cm)currentAppInfo":{"name":"+currentAppInfo","abstract":"<p>Convenience init with no parameters</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appDisplayName":{"name":"appDisplayName","abstract":"<p>The name displayed for the mobile application on the mobile device (can differ from the app name set in the initial RAI request).</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appBundleID":{"name":"appBundleID","abstract":"<p>The AppBundleID of an iOS application or package name of the Android application. This supports App Launch strategies for each platform.</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appVersion":{"name":"appVersion","abstract":"<p>Represents the build version number of this particular mobile app.</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(im)initWithAppCapabilityType:":{"name":"-initWithAppCapabilityType:","parent_name":"SDLAppCapability"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(im)initWithAppCapabilityType:videoStreamingCapability:":{"name":"-initWithAppCapabilityType:videoStreamingCapability:","parent_name":"SDLAppCapability"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(py)appCapabilityType":{"name":"appCapabilityType","abstract":"<p>Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other param included.</p>","parent_name":"SDLAppCapability"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>Describes supported capabilities for video streaming</p>","parent_name":"SDLAppCapability"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(cpy)defaultTimeout":{"name":"defaultTimeout","abstract":"<p>Set this to change the default timeout for all alerts. If a timeout is not set on an individual alert object (or if it is set to 0.0), then it will use this timeout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)timeout\">timeout</a></code> for more details. If this is not set by you, it will default to 5 seconds. The minimum is 3 seconds, the maximum is 10 seconds. If this is set below the minimum, it will be capped at 3 seconds. If this is set above the maximum, it will be capped at 10 seconds.","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)text":{"name":"text","abstract":"<p>The primary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)secondaryText":{"name":"secondaryText","abstract":"<p>The secondary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>The tertiary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)timeout":{"name":"timeout","abstract":"<p>Timeout in seconds. Defaults to 0, which will use <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAlertView.html#/c:objc(cs)SDLAlertView(cpy)defaultTimeout\">defaultTimeout</a></code>. If this is set below the minimum, it will be capped at 3 seconds. Minimum 3 seconds, maximum 10 seconds. If this is set above the maximum, it will be capped at 10 seconds. Defaults to 0.","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)audio":{"name":"audio","abstract":"<p>Text spoken, file(s) played, and/or tone played when the alert appears</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)showWaitIndicator":{"name":"showWaitIndicator","abstract":"<p>If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation. Defaults to NO.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)softButtons":{"name":"softButtons","abstract":"<p>Soft buttons the user may select to perform actions. Only one <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonState.html\">SDLSoftButtonState</a></code> per object is supported; if any soft button object contains multiple states, an exception will be thrown.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)icon":{"name":"icon","abstract":"<p>An artwork that will be displayed when the icon appears. This will be uploaded prior to the appearance of the alert if necessary. This will not be uploaded if the head unit does not declare support for alertIcon.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)init":{"name":"-init","abstract":"<p>Undocumented</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)initWithText:buttons:":{"name":"-initWithText:buttons:","abstract":"<p>Initialize a basic alert with a message and buttons</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)initWithText:secondaryText:tertiaryText:timeout:showWaitIndicator:audioIndication:buttons:icon:":{"name":"-initWithText:secondaryText:tertiaryText:timeout:showWaitIndicator:audioIndication:buttons:icon:","abstract":"<p>Initialize a alert with a text, image, buttons and sound</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)cancel":{"name":"-cancel","abstract":"<p>Cancels the alert. If the alert has not yet been sent to the module, it will not be sent. If the alert is already presented on the module, the alert will be immediately dismissed. Canceling an already presented alert will only work if connected to modules supporting RPC Spec v.6.0+. On older versions the alert will not be dismissed.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertResponse.html#/c:objc(cs)SDLAlertResponse(py)tryAgainTime":{"name":"tryAgainTime","abstract":"<p>Amount of time (in seconds) that an app must wait before resending an alert.</p>","parent_name":"SDLAlertResponse"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTS:softButtons:":{"name":"-initWithTTS:softButtons:","abstract":"<p>Convenience init to create an alert maneuver with required parameters</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTSChunks:softButtons:":{"name":"-initWithTTSChunks:softButtons:","abstract":"<p>Convenience init to create an alert maneuver with all parameters</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks.</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)softButtons":{"name":"softButtons","abstract":"<p>An array of soft buttons. If omitted on supported displays, only the system defined &ldquo;Close&rdquo; SoftButton shall be displayed.</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertAudioData.html#/c:objc(cs)SDLAlertAudioData(py)playTone":{"name":"playTone","abstract":"<p>Whether the alert tone should be played before the prompt (if any) is spoken. Defaults to NO.</p>","parent_name":"SDLAlertAudioData"},"Classes/SDLAlertAudioData.html#/c:objc(cs)SDLAlertAudioData(im)init":{"name":"-init","abstract":"<p>Undocumented</p>","parent_name":"SDLAlertAudioData"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText:softButtons:playTone:ttsChunks:alertIcon:cancelID:":{"name":"-initWithAlertText:softButtons:playTone:ttsChunks:alertIcon:cancelID:","abstract":"<p>Convenience init for creating a modal view with text, buttons, and optional sound cues.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:playTone:":{"name":"-initWithTTSChunks:playTone:","abstract":"<p>Convenience init for creating a sound-only alert.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:softButtons:playTone:ttsChunks:duration:progressIndicator:alertIcon:cancelID:":{"name":"-initWithAlertText1:alertText2:alertText3:softButtons:playTone:ttsChunks:duration:progressIndicator:alertIcon:cancelID:","abstract":"<p>Convenience init for setting all alert parameters.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText1":{"name":"alertText1","abstract":"<p>The first line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText2":{"name":"alertText2","abstract":"<p>The second line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText3":{"name":"alertText3","abstract":"<p>The optional third line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks to be spoken or a prerecorded sound file.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)duration":{"name":"duration","abstract":"<p>The duration of the displayed portion of the alert, in milliseconds. Typical timeouts are 3 - 5 seconds. If omitted, the timeout is set to a default of 5 seconds.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)playTone":{"name":"playTone","abstract":"<p>Whether the alert tone should be played before the TTS (if any) is spoken. If omitted or set to false, no tone is played.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)progressIndicator":{"name":"progressIndicator","abstract":"<p>If supported on the given platform, the alert GUI will include some sort of animation indicating that loading of a feature is progressing (e.g. a spinning wheel or hourglass, etc.).</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)softButtons":{"name":"softButtons","abstract":"<p>Buttons for the displayed alert. If omitted on supported displays, the displayed alert shall not have any buttons.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific alert to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertIcon":{"name":"alertIcon","abstract":"<p>Image to be displayed in the alert. If omitted on supported displays, no (or the default if applicable) icon should be displayed.</p>","parent_name":"SDLAlert"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverAirbagDeployed":{"name":"driverAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverSideAirbagDeployed":{"name":"driverSideAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvSideBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverCurtainAirbagDeployed":{"name":"driverCurtainAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvCrtnBag_D_Ltchd&rdquo;. See VehicleDataEventStatus</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerAirbagDeployed":{"name":"passengerAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerCurtainAirbagDeployed":{"name":"passengerCurtainAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasCrtnBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverKneeAirbagDeployed":{"name":"driverKneeAirbagDeployed","abstract":"<p>References signal &ldquo;VedsKneeDrvBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerSideAirbagDeployed":{"name":"passengerSideAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasSideBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerKneeAirbagDeployed":{"name":"passengerKneeAirbagDeployed","abstract":"<p>References signal &ldquo;VedsKneePasBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:":{"name":"-initWithMenuID:menuName:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:":{"name":"-initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:":{"name":"-initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuID":{"name":"menuID","abstract":"<p>a Menu ID that identifies a sub menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)position":{"name":"position","abstract":"<p>a position of menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuName":{"name":"menuName","abstract":"<p>a menuName which is displayed representing this submenu item","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuIcon":{"name":"menuIcon","abstract":"<p>An image that is displayed alongside this submenu item</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuLayout":{"name":"menuLayout","abstract":"<p>The sub-menu layout. See available menu layouts on SDLWindowCapability.menuLayoutsAvailable. Defaults to LIST.</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)parentID":{"name":"parentID","abstract":"<p>Unique ID of the sub menu the command will be added to. If not provided or 0, it will be provided to the top level of the in application menu.","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)secondaryText":{"name":"secondaryText","abstract":"<p>Optional secondary text to display","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Optional tertiary text to display","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)secondaryImage":{"name":"secondaryImage","abstract":"<p>Optional secondary image struct for sub-menu cell</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Constructs a SDLAddCommand with a handler callback when an event occurs.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:handler:":{"name":"-initWithId:vrCommands:handler:","abstract":"<p>Convenience init for creating a voice command menu item.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:handler:":{"name":"-initWithId:vrCommands:menuName:handler:","abstract":"<p>Convenience init for creating a menu item with text.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:","abstract":"<p>Convenience init for creating a menu item with text and a custom icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:icon:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:icon:handler:","abstract":"<p>Convenience init for creating a menu item with text and a custom icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithCmdID:":{"name":"-initWithCmdID:","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage:":{"name":"-initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage:","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)handler":{"name":"handler","abstract":"<p>A handler that will let you know when the button you created is subscribed.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdID":{"name":"cmdID","abstract":"<p>A unique id that identifies the command.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)menuParams":{"name":"menuParams","abstract":"<p>A <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuParams.html\">SDLMenuParams</a></code> pointer which defines the command and how it is added to the command menu.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)vrCommands":{"name":"vrCommands","abstract":"<p>An array of strings to be used as VR synonyms for this command.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdIcon":{"name":"cmdIcon","abstract":"<p>Image struct containing a static or dynamic icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)secondaryImage":{"name":"secondaryImage","abstract":"<p>Optional secondary image struct for menu cell</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html":{"name":"SDLAddCommand","abstract":"<p>This class will add a command to the application&rsquo;s Command Menu</p>"},"Classes.html#/c:objc(cs)SDLAddCommandResponse":{"name":"SDLAddCommandResponse","abstract":"<p>Response to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAddCommand.html\">SDLAddCommand</a></code></p>"},"Classes/SDLAddSubMenu.html":{"name":"SDLAddSubMenu","abstract":"<p>Add a SDLSubMenu to the Command Menu"},"Classes.html#/c:objc(cs)SDLAddSubMenuResponse":{"name":"SDLAddSubMenuResponse","abstract":"<p>Response to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAddSubMenu.html\">SDLAddSubMenu</a></code></p>"},"Classes/SDLAirbagStatus.html":{"name":"SDLAirbagStatus","abstract":"<p>A vehicle data status struct for airbags</p>"},"Classes/SDLAlert.html":{"name":"SDLAlert","abstract":"<p>Shows an alert which typically consists of text-to-speech message and text on the display. Either <code>alertText1</code>, <code>alertText2</code> or <code>TTSChunks</code> needs to be set or the request will be rejected.</p>"},"Classes/SDLAlertAudioData.html":{"name":"SDLAlertAudioData","abstract":"<p>Undocumented</p>"},"Classes/SDLAlertManeuver.html":{"name":"SDLAlertManeuver","abstract":"<p>Shows a SDLShowConstantTBT message with an optional voice command. This message is shown as an overlay over the display&rsquo;s base screen.</p>"},"Classes.html#/c:objc(cs)SDLAlertManeuverResponse":{"name":"SDLAlertManeuverResponse","abstract":"<p>Response to SDLAlertManeuver</p>"},"Classes/SDLAlertResponse.html":{"name":"SDLAlertResponse","abstract":"<p>Response to SDLAlert</p>"},"Classes/SDLAlertView.html":{"name":"SDLAlertView","abstract":"<p>Undocumented</p>"},"Classes/SDLAppCapability.html":{"name":"SDLAppCapability","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes/SDLAppInfo.html":{"name":"SDLAppInfo","abstract":"<p>A struct used in register app interface. Contains detailed information about the registered application.</p>"},"Classes/SDLAppServiceCapability.html":{"name":"SDLAppServiceCapability","abstract":"<p>A currently available service.</p>"},"Classes/SDLAppServiceData.html":{"name":"SDLAppServiceData","abstract":"<p>Contains all the current data of the app service. The serviceType will link to which of the service data objects are included in this object (e.g. if the service type is MEDIA, the mediaServiceData param should be included).</p>"},"Classes/SDLAppServiceManifest.html":{"name":"SDLAppServiceManifest","abstract":"<p>This manifest contains all the information necessary for the service to be published, activated, and allow consumers to interact with it</p>"},"Classes/SDLAppServiceRecord.html":{"name":"SDLAppServiceRecord","abstract":"<p>This is the record of an app service publisher that the module has. It should contain the most up to date information including the service&rsquo;s active state.</p>"},"Classes/SDLAppServicesCapabilities.html":{"name":"SDLAppServicesCapabilities","abstract":"<p>Capabilities of app services including what service types are supported and the current state of services.</p>"},"Classes/SDLArtwork.html":{"name":"SDLArtwork","abstract":"<p>An SDLFile subclass specifically designed for images</p>"},"Classes/SDLAudioControlCapabilities.html":{"name":"SDLAudioControlCapabilities","abstract":"<p>Describes a head unit&rsquo;s audio control capabilities.</p>"},"Classes/SDLAudioControlData.html":{"name":"SDLAudioControlData","abstract":"<p>The audio control data information.</p>"},"Classes/SDLAudioData.html":{"name":"SDLAudioData","abstract":"<p>Undocumented</p>"},"Classes/SDLAudioFile.html":{"name":"SDLAudioFile","abstract":"<p>Includes information about a given audio file</p>"},"Classes/SDLAudioPassThruCapabilities.html":{"name":"SDLAudioPassThruCapabilities","abstract":"<p>Describes different audio type configurations for SDLPerformAudioPassThru, e.g. {8kHz,8-bit,PCM}</p>"},"Classes/SDLAudioStreamManager.html":{"name":"SDLAudioStreamManager","abstract":"<p>The manager to control the audio stream</p>"},"Classes/SDLBeltStatus.html":{"name":"SDLBeltStatus","abstract":"<p>Vehicle data struct for the seat belt status</p>"},"Classes/SDLBodyInformation.html":{"name":"SDLBodyInformation","abstract":"<p>Undocumented</p>"},"Classes/SDLButtonCapabilities.html":{"name":"SDLButtonCapabilities","abstract":"<p>Provides information about the capabilities of a SDL HMI button.</p>"},"Classes/SDLButtonPress.html":{"name":"SDLButtonPress","abstract":"<p>This RPC allows a remote control type mobile application to simulate a hardware button press event.</p>"},"Classes.html#/c:objc(cs)SDLButtonPressResponse":{"name":"SDLButtonPressResponse","abstract":"<p>Response to SDLButtonPress</p>"},"Classes/SDLCancelInteraction.html":{"name":"SDLCancelInteraction","abstract":"<p>Used to dismiss a modal view programmatically without needing to wait for the timeout to complete. Can be used to dismiss alerts, scrollable messages, sliders, and perform interactions (i.e. pop-up menus).</p>"},"Classes.html#/c:objc(cs)SDLCancelInteractionResponse":{"name":"SDLCancelInteractionResponse","abstract":"<p>Response to the request to dismiss a modal view. If no applicable request can be dismissed, the <code>resultCode</code> will be <code>IGNORED</code>.</p>"},"Classes/SDLCarWindowViewController.html":{"name":"SDLCarWindowViewController","abstract":"<p>Note that if this is embedded in a UINavigationController and UITabBarController, it will not lock orientation. You must lock your container controller to a specific orientation.</p>"},"Classes/SDLChangeRegistration.html":{"name":"SDLChangeRegistration","abstract":"<p>If the app recognizes during the app registration that the SDL HMI language (voice/TTS and/or display) does not match the app language, the app will be able (but does not need) to change this registration with changeRegistration prior to app being brought into focus.</p>"},"Classes.html#/c:objc(cs)SDLChangeRegistrationResponse":{"name":"SDLChangeRegistrationResponse","abstract":"<p>Response to SDLChangeRegistrations</p>"},"Classes/SDLChoice.html":{"name":"SDLChoice","abstract":"<p>A choice is an option which a user can select either via the menu or via voice recognition (VR) during an application initiated interaction.</p>"},"Classes/SDLChoiceCell.html":{"name":"SDLChoiceCell","abstract":"<p>A selectable item within an SDLChoiceSet</p>"},"Classes/SDLChoiceSet.html":{"name":"SDLChoiceSet","abstract":"<p>The choice set to be displayed to the user. Contains a list of selectable options.</p>"},"Classes/SDLClimateControlCapabilities.html":{"name":"SDLClimateControlCapabilities","abstract":"<p>Contains information about a climate control module&rsquo;s capabilities.</p>"},"Classes/SDLClimateControlData.html":{"name":"SDLClimateControlData","abstract":"<p>The current information for the Climate Remote Control Module</p>"},"Classes/SDLClimateData.html":{"name":"SDLClimateData","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes.html#/c:objc(cs)SDLCloseApplication":{"name":"SDLCloseApplication","abstract":"<p>Used by an app to set itself to a <code>HMILevel</code> of <code>NONE</code>. The app will close but will still be registered. If the app is a navigation app it will no longer be used as the preferred mobile-navigation application by the module.</p>"},"Classes.html#/c:objc(cs)SDLCloseApplicationResponse":{"name":"SDLCloseApplicationResponse","abstract":"<p>Response to the request to close this app on the module.</p>"},"Classes/SDLCloudAppProperties.html":{"name":"SDLCloudAppProperties","abstract":"<p>The cloud application properties.</p>"},"Classes/SDLClusterModeStatus.html":{"name":"SDLClusterModeStatus","abstract":"<p>A vehicle data struct for the cluster mode and power status</p>"},"Classes/SDLConfiguration.html":{"name":"SDLConfiguration","abstract":"<p>Contains information about the app&rsquo;s configuration, such as lifecycle, lockscreen, encryption, etc.</p>"},"Classes/SDLCreateInteractionChoiceSet.html":{"name":"SDLCreateInteractionChoiceSet","abstract":"<p>Creates a Choice Set which can be used in subsequent <em>SDLPerformInteraction</em> Operations.</p>"},"Classes.html#/c:objc(cs)SDLCreateInteractionChoiceSetResponse":{"name":"SDLCreateInteractionChoiceSetResponse","abstract":"<p>Response to SDLCreateInteractionChoiceSet has been called</p>"},"Classes/SDLCreateWindow.html":{"name":"SDLCreateWindow","abstract":"<p>Create a new window on the display with the specified window type."},"Classes.html#/c:objc(cs)SDLCreateWindowResponse":{"name":"SDLCreateWindowResponse","abstract":"<p>Response to SDLCreateWindow</p>"},"Classes/SDLDIDResult.html":{"name":"SDLDIDResult","abstract":"<p>A vehicle data struct</p>"},"Classes/SDLDateTime.html":{"name":"SDLDateTime","abstract":"<p>A struct referenced in SendLocation for an absolute date</p>"},"Classes/SDLDeleteCommand.html":{"name":"SDLDeleteCommand","abstract":"<p>Removes a command from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteCommandResponse":{"name":"SDLDeleteCommandResponse","abstract":"<p>Response to SDLDeleteCommand</p>"},"Classes/SDLDeleteFile.html":{"name":"SDLDeleteFile","abstract":"<p>Used to delete a file resident on the SDL module in the app&rsquo;s local cache."},"Classes/SDLDeleteFileResponse.html":{"name":"SDLDeleteFileResponse","abstract":"<p>Response to SDLDeleteFile</p>"},"Classes/SDLDeleteInteractionChoiceSet.html":{"name":"SDLDeleteInteractionChoiceSet","abstract":"<p>Deletes an existing Choice Set identified by the parameter"},"Classes.html#/c:objc(cs)SDLDeleteInteractionChoiceSetResponse":{"name":"SDLDeleteInteractionChoiceSetResponse","abstract":"<p>SDLDeleteInteractionChoiceSetResponse is sent, when SDLDeleteInteractionChoiceSet has been called</p>"},"Classes/SDLDeleteSubMenu.html":{"name":"SDLDeleteSubMenu","abstract":"<p>Deletes a submenu from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteSubMenuResponse":{"name":"SDLDeleteSubMenuResponse","abstract":"<p>Response to SDLDeleteSubMenu</p>"},"Classes/SDLDeleteWindow.html":{"name":"SDLDeleteWindow","abstract":"<p>Deletes previously created window of the SDL application.</p>"},"Classes.html#/c:objc(cs)SDLDeleteWindowResponse":{"name":"SDLDeleteWindowResponse","abstract":"<p>Response to DeleteWindow</p>"},"Classes/SDLDeviceInfo.html":{"name":"SDLDeviceInfo","abstract":"<p>Various information about connecting device. Referenced in RegisterAppInterface</p>"},"Classes/SDLDeviceStatus.html":{"name":"SDLDeviceStatus","abstract":"<p>Describes the status related to a connected mobile device or SDL and if or how it is represented in the vehicle.</p>"},"Classes/SDLDiagnosticMessage.html":{"name":"SDLDiagnosticMessage","abstract":"<p>Non periodic vehicle diagnostic request</p>"},"Classes/SDLDiagnosticMessageResponse.html":{"name":"SDLDiagnosticMessageResponse","abstract":"<p>Response to SDLDiagnosticMessage</p>"},"Classes/SDLDialNumber.html":{"name":"SDLDialNumber","abstract":"<p>This RPC is used to tell the head unit to use bluetooth to dial a phone number using the phone.</p>"},"Classes.html#/c:objc(cs)SDLDialNumberResponse":{"name":"SDLDialNumberResponse","abstract":"<p>The response to SDLDialNumber</p>"},"Classes/SDLDisplayCapabilities.html":{"name":"SDLDisplayCapabilities","abstract":"<p>Contains information about the display for the SDL system to which the application is currently connected.</p>"},"Classes/SDLDisplayCapability.html":{"name":"SDLDisplayCapability","abstract":"<p>Contain the display related information and all windows related to that display.</p>"},"Classes/SDLDoorStatus.html":{"name":"SDLDoorStatus","abstract":"<p>Describes the status of a parameter of door.</p>"},"Classes/SDLDriverDistractionCapability.html":{"name":"SDLDriverDistractionCapability","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLDynamicUpdateCapabilities.html":{"name":"SDLDynamicUpdateCapabilities","abstract":"<p>@since SDL 7.0</p>"},"Classes/SDLECallInfo.html":{"name":"SDLECallInfo","abstract":"<p>A vehicle data struct for emergency call information</p>"},"Classes/SDLEmergencyEvent.html":{"name":"SDLEmergencyEvent","abstract":"<p>A vehicle data struct for an emergency event</p>"},"Classes/SDLEncodedSyncPData.html":{"name":"SDLEncodedSyncPData","abstract":"<p>Allows encoded data in the form of SyncP packets to be sent to the SYNC module. Legacy / v1 Protocol implementation; use SyncPData instead.</p>"},"Classes.html#/c:objc(cs)SDLEncodedSyncPDataResponse":{"name":"SDLEncodedSyncPDataResponse","abstract":"<p>The response to SDLEncodedSyncPData</p>"},"Classes/SDLEncryptionConfiguration.html":{"name":"SDLEncryptionConfiguration","abstract":"<p>The encryption configuration data</p>"},"Classes.html#/c:objc(cs)SDLEndAudioPassThru":{"name":"SDLEndAudioPassThru","abstract":"<p>When this request is invoked, the audio capture stops</p>"},"Classes.html#/c:objc(cs)SDLEndAudioPassThruResponse":{"name":"SDLEndAudioPassThruResponse","abstract":"<p>Response to SDLEndAudioPassThru</p>"},"Classes/SDLEqualizerSettings.html":{"name":"SDLEqualizerSettings","abstract":"<p>Defines the each Equalizer channel settings.</p>"},"Classes/SDLFile.html":{"name":"SDLFile","abstract":"<p>Crates an SDLFile from a file</p>"},"Classes/SDLFileManager.html":{"name":"SDLFileManager","abstract":"<p>The SDLFileManager is an RPC manager for the remote file system. After it starts, it will attempt to communicate with the remote file system to get the names of all files. Deleting and Uploading will them queue these changes as transactions. If a delete succeeds, the local list of remote files will remove that file name, and likewise, if an upload succeeds, the local list of remote files will now include that file name.</p>"},"Classes/SDLFileManagerConfiguration.html":{"name":"SDLFileManagerConfiguration","abstract":"<p>File manager configuration information</p>"},"Classes/SDLFuelRange.html":{"name":"SDLFuelRange","abstract":"<p>Describes the distance a vehicle can travel with the current level of fuel.</p>"},"Classes/SDLFunctionID.html":{"name":"SDLFunctionID","abstract":"<p>A function ID for an SDL RPC</p>"},"Classes/SDLGPSData.html":{"name":"SDLGPSData","abstract":"<p>Describes the GPS data. Not all data will be available on all carlines.</p>"},"Classes/SDLGateStatus.html":{"name":"SDLGateStatus","abstract":"<p>Describes the status of a parameter of trunk/hood/etc.</p>"},"Classes/SDLGearStatus.html":{"name":"SDLGearStatus","abstract":"<p>@since SDL 7.0.0</p>"},"Classes.html#/c:objc(cs)SDLGenericResponse":{"name":"SDLGenericResponse","abstract":"<p>Generic Response is sent when the name of a received request is unknown. It is only used in case of an error. It will have an INVALID_DATA result code.</p>"},"Classes/SDLGetAppServiceData.html":{"name":"SDLGetAppServiceData","abstract":"<p>This request asks the module for current data related to the specific service. It also includes an option to subscribe to that service for future updates.</p>"},"Classes/SDLGetAppServiceDataResponse.html":{"name":"SDLGetAppServiceDataResponse","abstract":"<p>This response includes the data that was requested from the specific service.</p>"},"Classes/SDLGetCloudAppProperties.html":{"name":"SDLGetCloudAppProperties","abstract":"<p>RPC used to get the current properties of a cloud application.</p>"},"Classes/SDLGetCloudAppPropertiesResponse.html":{"name":"SDLGetCloudAppPropertiesResponse","abstract":"<p>The response to GetCloudAppProperties</p>"},"Classes/SDLGetDTCs.html":{"name":"SDLGetDTCs","abstract":"<p>This RPC allows to request diagnostic module trouble codes from a certain"},"Classes/SDLGetDTCsResponse.html":{"name":"SDLGetDTCsResponse","abstract":"<p>Response to SDLGetDTCs</p>"},"Classes/SDLGetFile.html":{"name":"SDLGetFile","abstract":"<p>This request is sent to the module to retrieve a file.</p>"},"Classes/SDLGetFileResponse.html":{"name":"SDLGetFileResponse","abstract":"<p>Response to GetFiles</p>"},"Classes/SDLGetInteriorVehicleData.html":{"name":"SDLGetInteriorVehicleData","abstract":"<p>Reads the current status value of specified remote control module (type)."},"Classes/SDLGetInteriorVehicleDataConsent.html":{"name":"SDLGetInteriorVehicleDataConsent","abstract":"<p>This RPC allows you to get consent to control a certain module</p>"},"Classes/SDLGetInteriorVehicleDataConsentResponse.html":{"name":"SDLGetInteriorVehicleDataConsentResponse","abstract":"<p>Response to GetInteriorVehicleDataConsent</p>"},"Classes/SDLGetInteriorVehicleDataResponse.html":{"name":"SDLGetInteriorVehicleDataResponse","abstract":"<p>A response to SDLGetInteriorVehicleData</p>"},"Classes/SDLGetSystemCapability.html":{"name":"SDLGetSystemCapability","abstract":"<p>SDL RPC Request for expanded information about a supported system/HMI capability</p>"},"Classes/SDLGetSystemCapabilityResponse.html":{"name":"SDLGetSystemCapabilityResponse","abstract":"<p>Response to SDLGetSystemCapability</p>"},"Classes/SDLGetVehicleData.html":{"name":"SDLGetVehicleData","abstract":"<p>Requests current values of specific published vehicle data items.</p>"},"Classes/SDLGetVehicleDataResponse.html":{"name":"SDLGetVehicleDataResponse","abstract":"<p>Response to SDLGetVehicleData</p>"},"Classes/SDLGetWayPoints.html":{"name":"SDLGetWayPoints","abstract":"<p>This RPC allows you to get navigation waypoint data</p>"},"Classes/SDLGetWayPointsResponse.html":{"name":"SDLGetWayPointsResponse","abstract":"<p>Response to SDLGetWayPoints</p>"},"Classes/SDLGrid.html":{"name":"SDLGrid","abstract":"<p>Describes a location (origin coordinates and span) of a vehicle component.</p>"},"Classes/SDLHMICapabilities.html":{"name":"SDLHMICapabilities","abstract":"<p>Contains information about the HMI capabilities.</p>"},"Classes/SDLHMIPermissions.html":{"name":"SDLHMIPermissions","abstract":"<p>Defining sets of HMI levels, which are permitted or prohibited for a given RPC.</p>"},"Classes/SDLHMISettingsControlCapabilities.html":{"name":"SDLHMISettingsControlCapabilities","abstract":"<p>HMI data struct for HMI control settings</p>"},"Classes/SDLHMISettingsControlData.html":{"name":"SDLHMISettingsControlData","abstract":"<p>Corresponds to &ldquo;HMI_SETTINGS&rdquo; ModuleType</p>"},"Classes/SDLHapticRect.html":{"name":"SDLHapticRect","abstract":"<p>Defines spatial for each user control object for video streaming application</p>"},"Classes/SDLHeadLampStatus.html":{"name":"SDLHeadLampStatus","abstract":"<p>Vehicle data struct for status of head lamps</p>"},"Classes/SDLImage.html":{"name":"SDLImage","abstract":"<p>Specifies which image shall be used e.g. in SDLAlerts or on SDLSoftbuttons provided the display supports it.</p>"},"Classes/SDLImageField.html":{"name":"SDLImageField","abstract":"<p>A struct used in DisplayCapabilities describing the capability of an image field</p>"},"Classes/SDLImageResolution.html":{"name":"SDLImageResolution","abstract":"<p>The resolution of an image</p>"},"Classes/SDLKeyboardCapabilities.html":{"name":"SDLKeyboardCapabilities","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes/SDLKeyboardLayoutCapability.html":{"name":"SDLKeyboardLayoutCapability","abstract":"<p>Describes the capabilities of a single keyboard layout.</p>"},"Classes/SDLKeyboardProperties.html":{"name":"SDLKeyboardProperties","abstract":"<p>Configuration of on-screen keyboard (if available)</p>"},"Classes/SDLLifecycleConfiguration.html":{"name":"SDLLifecycleConfiguration","abstract":"<p>Configuration options for SDLManager</p>"},"Classes/SDLLifecycleConfigurationUpdate.html":{"name":"SDLLifecycleConfigurationUpdate","abstract":"<p>Configuration update options for SDLManager. This class can be used to update the lifecycle configuration in"},"Classes/SDLLightCapabilities.html":{"name":"SDLLightCapabilities","abstract":"<p>Current Light capabilities.</p>"},"Classes/SDLLightControlCapabilities.html":{"name":"SDLLightControlCapabilities","abstract":"<p>Current light control capabilities.</p>"},"Classes/SDLLightControlData.html":{"name":"SDLLightControlData","abstract":"<p>Data about the current light controls</p>"},"Classes/SDLLightState.html":{"name":"SDLLightState","abstract":"<p>Current light control state</p>"},"Classes.html#/c:objc(cs)SDLListFiles":{"name":"SDLListFiles","abstract":"<p>Requests the current list of resident filenames for the registered app. Not"},"Classes/SDLListFilesResponse.html":{"name":"SDLListFilesResponse","abstract":"<p>Response to SDLListFiles</p>"},"Classes/SDLLocationCoordinate.html":{"name":"SDLLocationCoordinate","abstract":"<p>Describes a coordinate on earth</p>"},"Classes/SDLLocationDetails.html":{"name":"SDLLocationDetails","abstract":"<p>Describes a location, including its coordinate, name, etc. Used in WayPoints.</p>"},"Classes/SDLLockScreenConfiguration.html":{"name":"SDLLockScreenConfiguration","abstract":"<p>A configuration describing how the lock screen should be used by the internal SDL system for your application. This configuration is provided before SDL starts and will govern the entire SDL lifecycle of your application.</p>"},"Classes/SDLLockScreenViewController.html":{"name":"SDLLockScreenViewController","abstract":"<p>The view controller for the lockscreen.</p>"},"Classes/SDLLogConfiguration.html":{"name":"SDLLogConfiguration","abstract":"<p>Information about the current logging configuration</p>"},"Classes/SDLLogFileModule.html":{"name":"SDLLogFileModule","abstract":"<p>A log file module is a collection of source code files that form a cohesive unit and that logs can all use to describe themselves. E.g. a &ldquo;transport&rdquo; module, or a &ldquo;Screen Manager&rdquo; module.</p>"},"Classes/SDLLogFilter.html":{"name":"SDLLogFilter","abstract":"<p>Represents a filter over which SDL logs should be logged</p>"},"Classes/SDLLogManager.html":{"name":"SDLLogManager","abstract":"<p>This is the central manager of logging. A developer should not have to interact with this class, it is exclusively used internally.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetAppleSystemLog":{"name":"SDLLogTargetAppleSystemLog","abstract":"<p>The Apple System Log target is an iOS 2.0+ compatible log target that logs to both the Console and to the System Log.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetFile":{"name":"SDLLogTargetFile","abstract":"<p>The File log will log to a text file on the iPhone in Documents/smartdevicelink/log/#appName##datetime##.log. It will log up to 3 logs which will rollover.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetOSLog":{"name":"SDLLogTargetOSLog","abstract":"<p>OS_LOG is an iOS 10+ only logging system that logs to the Console and the Apple system console. This is an improved replacement for Apple SysLog (SDLLogTargetAppleSystemLog). </p>"},"Classes/SDLManager.html":{"name":"SDLManager","abstract":"<p>The top level manager object for all of SDL&rsquo;s interactions with the app and the head unit</p>"},"Classes/SDLMassageCushionFirmness.html":{"name":"SDLMassageCushionFirmness","abstract":"<p>The intensity or firmness of a cushion.</p>"},"Classes/SDLMassageModeData.html":{"name":"SDLMassageModeData","abstract":"<p>Specify the mode of a massage zone.</p>"},"Classes/SDLMediaServiceData.html":{"name":"SDLMediaServiceData","abstract":"<p>This data is related to what a media service should provide.</p>"},"Classes.html#/c:objc(cs)SDLMediaServiceManifest":{"name":"SDLMediaServiceManifest","abstract":"<p>A media service manifest.</p>"},"Classes/SDLMenuCell.html":{"name":"SDLMenuCell","abstract":"<p>A menu cell item for the main menu or sub-menu.</p>"},"Classes/SDLMenuConfiguration.html":{"name":"SDLMenuConfiguration","abstract":"<p>Defines how the menu is configured</p>"},"Classes/SDLMenuParams.html":{"name":"SDLMenuParams","abstract":"<p>Used when adding a sub menu to an application menu or existing sub menu.</p>"},"Classes/SDLMetadataTags.html":{"name":"SDLMetadataTags","abstract":"<p>Metadata for Show fields</p>"},"Classes/SDLModuleData.html":{"name":"SDLModuleData","abstract":"<p>Describes a remote control module&rsquo;s data</p>"},"Classes/SDLModuleInfo.html":{"name":"SDLModuleInfo","abstract":"<p>Contains information about a RC module.</p>"},"Classes/SDLMsgVersion.html":{"name":"SDLMsgVersion","abstract":"<p>Specifies the version number of the SDL V4 interface. This is used by both the application and SDL to declare what interface version each is using.</p>"},"Classes/SDLMyKey.html":{"name":"SDLMyKey","abstract":"<p>Vehicle Data struct</p>"},"Classes/SDLNavigationCapability.html":{"name":"SDLNavigationCapability","abstract":"<p>Extended capabilities for an onboard navigation system</p>"},"Classes/SDLNavigationInstruction.html":{"name":"SDLNavigationInstruction","abstract":"<p>A navigation instruction.</p>"},"Classes/SDLNavigationServiceData.html":{"name":"SDLNavigationServiceData","abstract":"<p>This data is related to what a navigation service would provide.</p>"},"Classes/SDLNavigationServiceManifest.html":{"name":"SDLNavigationServiceManifest","abstract":"<p>A navigation service manifest.</p>"},"Classes/SDLNotificationConstants.html":{"name":"SDLNotificationConstants","abstract":"<p>This class defines methods for getting groups of notifications</p>"},"Classes/SDLOasisAddress.html":{"name":"SDLOasisAddress","abstract":"<p>Struct used in SendLocation describing an address</p>"},"Classes/SDLOnAppCapabilityUpdated.html":{"name":"SDLOnAppCapabilityUpdated","abstract":"<p>A notification to inform SDL Core that a specific app capability has changed.</p>"},"Classes/SDLOnAppInterfaceUnregistered.html":{"name":"SDLOnAppInterfaceUnregistered","abstract":"<p>Notifies an application that its interface registration has been terminated. This means that all SDL resources associated with the application are discarded, including the Command Menu, Choice Sets, button subscriptions, etc.</p>"},"Classes/SDLOnAppServiceData.html":{"name":"SDLOnAppServiceData","abstract":"<p>This notification includes the data that is updated from the specific service.</p>"},"Classes.html#/c:objc(cs)SDLOnAudioPassThru":{"name":"SDLOnAudioPassThru","abstract":"<p>Binary data is in binary part of hybrid msg.</p>"},"Classes/SDLOnButtonEvent.html":{"name":"SDLOnButtonEvent","abstract":"<p>Notifies application that user has depressed or released a button to which"},"Classes/SDLOnButtonPress.html":{"name":"SDLOnButtonPress","abstract":"<p>Notifies application of button press events for buttons to which the application is subscribed. SDL supports two button press events defined as follows:</p>"},"Classes/SDLOnCommand.html":{"name":"SDLOnCommand","abstract":"<p>This is called when a command was selected via VR after pressing the PTT button, or selected from the menu after pressing the MENU button.</p>"},"Classes/SDLOnDriverDistraction.html":{"name":"SDLOnDriverDistraction","abstract":"<p>Notifies the application of the current driver distraction state (whether driver distraction rules are in effect, or not).</p>"},"Classes/SDLOnEncodedSyncPData.html":{"name":"SDLOnEncodedSyncPData","abstract":"<p>Callback including encoded data of any SyncP packets that SYNC needs to send back to the mobile device. Legacy / v1 Protocol implementation; responds to EncodedSyncPData. *** DEPRECATED ***</p>"},"Classes/SDLOnHMIStatus.html":{"name":"SDLOnHMIStatus"},"Classes/SDLOnHashChange.html":{"name":"SDLOnHashChange","abstract":"<p>Notification containing an updated hashID which can be used over connection cycles (i.e. loss of connection, ignition cycles, etc.). Sent after initial registration and subsequently after any change in the calculated hash of all persisted app data.</p>"},"Classes/SDLOnInteriorVehicleData.html":{"name":"SDLOnInteriorVehicleData","abstract":"<p>Notifications when subscribed vehicle data changes.</p>"},"Classes/SDLOnKeyboardInput.html":{"name":"SDLOnKeyboardInput","abstract":"<p>Sent when a keyboard presented by a PerformInteraction has a keyboard input.</p>"},"Classes/SDLOnLanguageChange.html":{"name":"SDLOnLanguageChange","abstract":"<p>Provides information to what language the SDL HMI language was changed</p>"},"Classes/SDLOnPermissionsChange.html":{"name":"SDLOnPermissionsChange","abstract":"<p>Provides update to app of which sets of functions are available</p>"},"Classes/SDLOnRCStatus.html":{"name":"SDLOnRCStatus","abstract":"<p>OnRCStatus notifications to all registered mobile applications and the HMI whenever"},"Classes.html#/c:objc(cs)SDLOnSubtleAlertPressed":{"name":"SDLOnSubtleAlertPressed","abstract":"<p>Sent when the alert itself is touched (outside of a soft button). Touching (or otherwise selecting) the alert should open the app before sending this notification.</p>"},"Classes/SDLOnSyncPData.html":{"name":"SDLOnSyncPData","abstract":"<p>DEPRECATED</p>"},"Classes/SDLOnSystemCapabilityUpdated.html":{"name":"SDLOnSystemCapabilityUpdated","abstract":"<p>A notification to inform the connected device that a specific system capability has changed.</p>"},"Classes/SDLOnSystemRequest.html":{"name":"SDLOnSystemRequest","abstract":"<p>An asynchronous request from the system for specific data from the device or the cloud or response to a request from the device or cloud Binary data can be included in hybrid part of message for some requests (such as Authentication request responses)</p>"},"Classes/SDLOnTBTClientState.html":{"name":"SDLOnTBTClientState","abstract":"<p>Provides applications with notifications specific to the current TBT client status on the module</p>"},"Classes/SDLOnTouchEvent.html":{"name":"SDLOnTouchEvent","abstract":"<p>Notifies about touch events on the screen&rsquo;s prescribed area during video streaming</p>"},"Classes/SDLOnUpdateFile.html":{"name":"SDLOnUpdateFile","abstract":"<p>This notification tells an app to upload and update a file with a given name.</p>"},"Classes/SDLOnUpdateSubMenu.html":{"name":"SDLOnUpdateSubMenu","abstract":"<p>This notification tells an app to update the AddSubMenu or its &lsquo;sub&rsquo; AddCommand and AddSubMenus with the requested data</p>"},"Classes/SDLOnVehicleData.html":{"name":"SDLOnVehicleData","abstract":"<p>Callback for the periodic and non periodic vehicle data read function.</p>"},"Classes/SDLOnWayPointChange.html":{"name":"SDLOnWayPointChange","abstract":"<p>Notification which provides the entire LocationDetails when there is a change to any waypoints or destination.</p>"},"Classes/SDLParameterPermissions.html":{"name":"SDLParameterPermissions","abstract":"<p>Defining sets of parameters, which are permitted or prohibited for a given RPC.</p>"},"Classes/SDLPerformAppServiceInteraction.html":{"name":"SDLPerformAppServiceInteraction","abstract":"<p>App service providers will likely have different actions exposed to the module and app service consumers. It will be difficult to standardize these actions by RPC versions and can easily become stale. Therefore, we introduce a best-effort attempt to take actions on a service.</p>"},"Classes/SDLPerformAppServiceInteractionResponse.html":{"name":"SDLPerformAppServiceInteractionResponse","abstract":"<p>Response to the request to request an app service.</p>"},"Classes/SDLPerformAudioPassThru.html":{"name":"SDLPerformAudioPassThru","abstract":"<p>This will open an audio pass thru session. By doing so the app can receive"},"Classes.html#/c:objc(cs)SDLPerformAudioPassThruResponse":{"name":"SDLPerformAudioPassThruResponse","abstract":"<p>Response to SDLPerformAudioPassThru</p>"},"Classes/SDLPerformInteraction.html":{"name":"SDLPerformInteraction","abstract":"<p>Performs an application-initiated interaction in which the user can select a choice from the passed choice set.</p>"},"Classes/SDLPerformInteractionResponse.html":{"name":"SDLPerformInteractionResponse","abstract":"<p>PerformInteraction Response is sent, when SDLPerformInteraction has been called</p>"},"Classes/SDLPermissionElement.html":{"name":"SDLPermissionElement","abstract":"<p>An object containing the RPC name and its parameter names that should be checked when checking permissions</p>"},"Classes/SDLPermissionItem.html":{"name":"SDLPermissionItem","abstract":"<p>Permissions for a given set of RPCs</p>"},"Classes/SDLPermissionManager.html":{"name":"SDLPermissionManager","abstract":"<p>The permission manager monitoring RPC permissions.</p>"},"Classes/SDLPhoneCapability.html":{"name":"SDLPhoneCapability","abstract":"<p>Extended capabilities of the module&rsquo;s phone feature</p>"},"Classes/SDLPinchGesture.html":{"name":"SDLPinchGesture","abstract":"<p>Pinch Gesture information</p>"},"Classes/SDLPresetBankCapabilities.html":{"name":"SDLPresetBankCapabilities","abstract":"<p>Contains information about on-screen preset capabilities.</p>"},"Classes/SDLPublishAppService.html":{"name":"SDLPublishAppService","abstract":"<p>Registers a service offered by this app on the module."},"Classes/SDLPublishAppServiceResponse.html":{"name":"SDLPublishAppServiceResponse","abstract":"<p>Response to the request to register a service offered by this app on the module.</p>"},"Classes/SDLPutFile.html":{"name":"SDLPutFile","abstract":"<p>Used to push a binary data onto the SDL module from a mobile device, such as icons and album art.</p>"},"Classes/SDLPutFileResponse.html":{"name":"SDLPutFileResponse","abstract":"<p>Response to SDLPutFile</p>"},"Classes/SDLRDSData.html":{"name":"SDLRDSData","abstract":"<p>Include the data defined in Radio Data System, which is a communications protocol standard for embedding small amounts of digital information in conventional FM radio broadcasts.</p>"},"Classes/SDLRGBColor.html":{"name":"SDLRGBColor","abstract":"<p>Represents an RGB color</p>"},"Classes/SDLRPCMessage.html":{"name":"SDLRPCMessage","abstract":"<p>Parent class of all RPC messages.</p>"},"Classes.html#/c:objc(cs)SDLRPCNotification":{"name":"SDLRPCNotification","abstract":"<p>An RPC sent from the head unit to the app about some data change, such as a button was pressed</p>"},"Classes/SDLRPCNotificationNotification.html":{"name":"SDLRPCNotificationNotification","abstract":"<p>An NSNotification object that makes retrieving internal SDLRPCNotification data easier</p>"},"Classes/SDLRPCPermissionStatus.html":{"name":"SDLRPCPermissionStatus","abstract":"<p>An object containing the result status of a permission element request</p>"},"Classes/SDLRPCRequest.html":{"name":"SDLRPCRequest","abstract":"<p>Superclass of RPC requests</p>"},"Classes/SDLRPCRequestNotification.html":{"name":"SDLRPCRequestNotification","abstract":"<p>A NSNotification object that makes retrieving internal SDLRPCRequest data easier</p>"},"Classes/SDLRPCResponse.html":{"name":"SDLRPCResponse","abstract":"<p>Superclass of RPC responses</p>"},"Classes/SDLRPCResponseNotification.html":{"name":"SDLRPCResponseNotification","abstract":"<p>A NSNotification object that makes retrieving internal SDLRPCResponse data easier</p>"},"Classes/SDLRPCStruct.html":{"name":"SDLRPCStruct","abstract":"<p>Superclass of all RPC-related structs and messages</p>"},"Classes/SDLRadioControlCapabilities.html":{"name":"SDLRadioControlCapabilities","abstract":"<p>Contains information about a radio control module&rsquo;s capabilities.</p>"},"Classes/SDLRadioControlData.html":{"name":"SDLRadioControlData","abstract":"<p>Include information (both read-only and changeable data) about a remote control radio module.</p>"},"Classes/SDLReadDID.html":{"name":"SDLReadDID","abstract":"<p>Non periodic vehicle data read request. This is an RPC to get diagnostics"},"Classes/SDLReadDIDResponse.html":{"name":"SDLReadDIDResponse","abstract":"<p>A response to ReadDID</p>"},"Classes/SDLRectangle.html":{"name":"SDLRectangle","abstract":"<p>A struct describing a rectangle</p>"},"Classes/SDLRegisterAppInterface.html":{"name":"SDLRegisterAppInterface","abstract":"<p>Registers the application&rsquo;s interface with SDL. The <code>RegisterAppInterface</code> RPC declares the properties of the app, including the messaging interface version, the app name, etc. The mobile application must establish its interface registration with SDL before any other interaction with SDL can take place. The registration lasts until it is terminated either by the application calling the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses.html#/c:objc(cs)SDLUnregisterAppInterface\">SDLUnregisterAppInterface</a></code> method, or by SDL sending an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnAppInterfaceUnregistered.html\">SDLOnAppInterfaceUnregistered</a></code> notification, or by loss of the underlying transport connection, or closing of the underlying message transmission protocol RPC session.</p>"},"Classes/SDLRegisterAppInterfaceResponse.html":{"name":"SDLRegisterAppInterfaceResponse","abstract":"<p>Response to SDLRegisterAppInterface</p>"},"Classes/SDLReleaseInteriorVehicleDataModule.html":{"name":"SDLReleaseInteriorVehicleDataModule","abstract":"<p>Releases a controlled remote control module so others can take control</p>"},"Classes.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModuleResponse":{"name":"SDLReleaseInteriorVehicleDataModuleResponse","abstract":"<p>Response to ReleaseInteriorVehicleDataModule</p>"},"Classes/SDLRemoteControlCapabilities.html":{"name":"SDLRemoteControlCapabilities","abstract":"<p>Capabilities of the remote control feature</p>"},"Classes/SDLResetGlobalProperties.html":{"name":"SDLResetGlobalProperties","abstract":"<p>Resets the passed global properties to their default values as defined by"},"Classes.html#/c:objc(cs)SDLResetGlobalPropertiesResponse":{"name":"SDLResetGlobalPropertiesResponse","abstract":"<p>Response to ResetGlobalProperties</p>"},"Classes/SDLRoofStatus.html":{"name":"SDLRoofStatus","abstract":"<p>Describes the status of a parameter of roof/convertible roof/sunroof/moonroof etc. If roof is open (AJAR), state will determine percentage of roof open.</p>"},"Classes/SDLSISData.html":{"name":"SDLSISData","abstract":"<p>HD radio Station Information Service (SIS) data.</p>"},"Classes/SDLScreenManager.html":{"name":"SDLScreenManager","abstract":"<p>The SDLScreenManager is a manager to control SDL UI features. Use the screen manager for setting up the UI of the template, creating a menu for your users, creating softbuttons, setting textfields, etc..</p>"},"Classes/SDLScreenParams.html":{"name":"SDLScreenParams","abstract":"<p>A struct in DisplayCapabilities describing parameters related to a video / touch input area</p>"},"Classes/SDLScrollableMessage.html":{"name":"SDLScrollableMessage","abstract":"<p>Creates a full screen overlay containing a large block of formatted text that can be scrolled with buttons available.</p>"},"Classes.html#/c:objc(cs)SDLScrollableMessageResponse":{"name":"SDLScrollableMessageResponse","abstract":"<p>Response to SDLScrollableMessage</p>"},"Classes/SDLSeatControlCapabilities.html":{"name":"SDLSeatControlCapabilities","abstract":"<p>Include information about a seat control capabilities.</p>"},"Classes/SDLSeatControlData.html":{"name":"SDLSeatControlData","abstract":"<p>Seat control data corresponds to &ldquo;SEAT&rdquo; ModuleType.</p>"},"Classes/SDLSeatLocation.html":{"name":"SDLSeatLocation","abstract":"<p>Describes the location of a seat</p>"},"Classes/SDLSeatLocationCapability.html":{"name":"SDLSeatLocationCapability","abstract":"<p>Contains information about the locations of each seat.</p>"},"Classes/SDLSeatMemoryAction.html":{"name":"SDLSeatMemoryAction","abstract":"<p>Specify the action to be performed.</p>"},"Classes/SDLSeatOccupancy.html":{"name":"SDLSeatOccupancy","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes/SDLSeatStatus.html":{"name":"SDLSeatStatus","abstract":"<p>Describes the status of a parameter of seat.</p>"},"Classes/SDLSeekStreamingIndicator.html":{"name":"SDLSeekStreamingIndicator","abstract":"<p>The seek next / skip previous subscription buttons&rsquo; content</p>"},"Classes/SDLSendHapticData.html":{"name":"SDLSendHapticData","abstract":"<p>Sends the spatial data gathered from SDLCarWindow or VirtualDisplayEncoder to the HMI. This data will be utilized by the HMI to determine how and when haptic events should occur.</p>"},"Classes.html#/c:objc(cs)SDLSendHapticDataResponse":{"name":"SDLSendHapticDataResponse","abstract":"<p>Response to SDLSendHapticData</p>"},"Classes/SDLSendLocation.html":{"name":"SDLSendLocation","abstract":"<p>SendLocation is used to send a location to the navigation system for navigation</p>"},"Classes.html#/c:objc(cs)SDLSendLocationResponse":{"name":"SDLSendLocationResponse","abstract":"<p>Response to SDLSendLocation</p>"},"Classes/SDLSetAppIcon.html":{"name":"SDLSetAppIcon","abstract":"<p>Used to set existing local file on SDL as the app&rsquo;s icon. Not supported on"},"Classes.html#/c:objc(cs)SDLSetAppIconResponse":{"name":"SDLSetAppIconResponse","abstract":"<p>Response to SDLSetAppIcon</p>"},"Classes/SDLSetCloudAppProperties.html":{"name":"SDLSetCloudAppProperties","abstract":"<p>RPC used to enable/disable a cloud application and set authentication data</p>"},"Classes.html#/c:objc(cs)SDLSetCloudAppPropertiesResponse":{"name":"SDLSetCloudAppPropertiesResponse","abstract":"<p>The response to SetCloudAppProperties</p>"},"Classes/SDLSetDisplayLayout.html":{"name":"SDLSetDisplayLayout","abstract":"<p>Used to set an alternate display layout. If not sent, default screen for"},"Classes/SDLSetDisplayLayoutResponse.html":{"name":"SDLSetDisplayLayoutResponse","abstract":"<p>Response to SDLSetDisplayLayout</p>"},"Classes/SDLSetGlobalProperties.html":{"name":"SDLSetGlobalProperties","abstract":"<p>Sets global property values</p>"},"Classes.html#/c:objc(cs)SDLSetGlobalPropertiesResponse":{"name":"SDLSetGlobalPropertiesResponse","abstract":"<p>Response to SDLSetGlobalProperties</p>"},"Classes/SDLSetInteriorVehicleData.html":{"name":"SDLSetInteriorVehicleData","abstract":"<p>This RPC allows a remote control type mobile application to"},"Classes/SDLSetInteriorVehicleDataResponse.html":{"name":"SDLSetInteriorVehicleDataResponse","abstract":"<p>Response to SDLSetInteriorVehicleData</p>"},"Classes/SDLSetMediaClockTimer.html":{"name":"SDLSetMediaClockTimer","abstract":"<p>Sets the media clock/timer value and the update method (e.g.count-up,"},"Classes.html#/c:objc(cs)SDLSetMediaClockTimerResponse":{"name":"SDLSetMediaClockTimerResponse","abstract":"<p>Response to SDLSetMediaClockTimer</p>"},"Classes/SDLShow.html":{"name":"SDLShow","abstract":"<p>Updates the application&rsquo;s display text area, regardless of whether or not"},"Classes/SDLShowAppMenu.html":{"name":"SDLShowAppMenu","abstract":"<p>Used by an app to show the app&rsquo;s menu, typically this is used by a navigation app if the menu button is hidden.</p>"},"Classes.html#/c:objc(cs)SDLShowAppMenuResponse":{"name":"SDLShowAppMenuResponse","abstract":"<p>Response to the request to show the app menu.</p>"},"Classes/SDLShowConstantTBT.html":{"name":"SDLShowConstantTBT","abstract":"<p>This RPC is used to update the user with navigation information for the constantly shown screen (base screen), but also for the alert maneuver screen.</p>"},"Classes.html#/c:objc(cs)SDLShowConstantTBTResponse":{"name":"SDLShowConstantTBTResponse","abstract":"<p>Response to SDLShowConstantTBT</p>"},"Classes.html#/c:objc(cs)SDLShowResponse":{"name":"SDLShowResponse","abstract":"<p>Response to SDLShow</p>"},"Classes/SDLSingleTireStatus.html":{"name":"SDLSingleTireStatus","abstract":"<p>Tire pressure status of a single tire.</p>"},"Classes/SDLSlider.html":{"name":"SDLSlider","abstract":"<p>Creates a full screen or pop-up overlay (depending on platform) with a single user controlled slider.</p>"},"Classes/SDLSliderResponse.html":{"name":"SDLSliderResponse","abstract":"<p>Response to SDLSlider</p>"},"Classes/SDLSoftButton.html":{"name":"SDLSoftButton","abstract":"<p>Describes an on-screen button which may be presented in various contexts, e.g. templates or alerts</p>"},"Classes/SDLSoftButtonCapabilities.html":{"name":"SDLSoftButtonCapabilities","abstract":"<p>Contains information about a SoftButton&rsquo;s capabilities.</p>"},"Classes/SDLSoftButtonObject.html":{"name":"SDLSoftButtonObject","abstract":"<p>A soft button wrapper object that is capable of storing and switching between states</p>"},"Classes/SDLSoftButtonState.html":{"name":"SDLSoftButtonState","abstract":"<p>A soft button state including data such as text, name and artwork</p>"},"Classes/SDLSpeak.html":{"name":"SDLSpeak","abstract":"<p>Speaks a phrase over the vehicle audio system using SDL&rsquo;s TTS (text-to-speech) engine. The provided text to be spoken can be simply a text phrase, or it can consist of phoneme specifications to direct SDL&rsquo;s TTS engine to speak a &ldquo;speech-sculpted&rdquo; phrase.</p>"},"Classes.html#/c:objc(cs)SDLSpeakResponse":{"name":"SDLSpeakResponse","abstract":"<p>Response to SDLSpeak</p>"},"Classes/SDLStabilityControlsStatus.html":{"name":"SDLStabilityControlsStatus","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLStartTime.html":{"name":"SDLStartTime","abstract":"<p>Describes the hour, minute and second values used to set the media clock.</p>"},"Classes/SDLStationIDNumber.html":{"name":"SDLStationIDNumber","abstract":"<p>Describes the hour, minute and second values used to set the media clock.</p>"},"Classes/SDLStreamingMediaConfiguration.html":{"name":"SDLStreamingMediaConfiguration","abstract":"<p>The streaming media configuration. Use this class to configure streaming media information.</p>"},"Classes/SDLStreamingMediaManager.html":{"name":"SDLStreamingMediaManager","abstract":"<p>Manager to help control streaming (video and audio) media services.</p>"},"Classes/SDLStreamingVideoScaleManager.html":{"name":"SDLStreamingVideoScaleManager","abstract":"<p>This class consolidates the logic of scaling between the view controller&rsquo;s coordinate system and the display&rsquo;s coordinate system.</p>"},"Classes/SDLSubscribeButton.html":{"name":"SDLSubscribeButton","abstract":"<p>Establishes a subscription to button notifications for HMI buttons. Buttons"},"Classes.html#/c:objc(cs)SDLSubscribeButtonResponse":{"name":"SDLSubscribeButtonResponse","abstract":"<p>Response to SDLSubscribeButton</p>"},"Classes/SDLSubscribeVehicleData.html":{"name":"SDLSubscribeVehicleData","abstract":"<p>Subscribes to specific published vehicle data items. The data will be only sent if it has changed. The application will be notified by the <code>onVehicleData</code> notification whenever new data is available. The update rate is dependent on sensors, vehicle architecture and vehicle type.</p>"},"Classes/SDLSubscribeVehicleDataResponse.html":{"name":"SDLSubscribeVehicleDataResponse","abstract":"<p>Response to SDLSubscribeVehicleData</p>"},"Classes.html#/c:objc(cs)SDLSubscribeWayPoints":{"name":"SDLSubscribeWayPoints","abstract":"<p>A SDLSubscribeWaypoints can be sent to subscribe"},"Classes.html#/c:objc(cs)SDLSubscribeWayPointsResponse":{"name":"SDLSubscribeWayPointsResponse","abstract":"<p>Response to SubscribeWayPoints</p>"},"Classes/SDLSubtleAlert.html":{"name":"SDLSubtleAlert","abstract":"<p>Shows an alert which typically consists of text-to-speech message and text on the display. At least either alertText1, alertText2 or TTSChunks need to be provided.</p>"},"Classes/SDLSubtleAlertResponse.html":{"name":"SDLSubtleAlertResponse","abstract":"<p>@since SDL 7.0.0</p>"},"Classes.html#/c:objc(cs)SDLSyncPData":{"name":"SDLSyncPData","abstract":"<p>Allows binary data in the form of SyncP packets to be sent to the SYNC module. Binary data is in binary part of hybrid msg.</p>"},"Classes.html#/c:objc(cs)SDLSyncPDataResponse":{"name":"SDLSyncPDataResponse","abstract":"<p>Response to SyncPData</p>"},"Classes/SDLSystemCapability.html":{"name":"SDLSystemCapability","abstract":"<p>The systemCapabilityType indicates which type of data should be changed and identifies which data object exists in this struct. For example, if the SystemCapability Type is NAVIGATION then a &ldquo;navigationCapability&rdquo; should exist.</p>"},"Classes/SDLSystemCapabilityManager.html":{"name":"SDLSystemCapabilityManager","abstract":"<p>A manager that handles updating and subscribing to SDL capabilities.</p>"},"Classes/SDLSystemInfo.html":{"name":"SDLSystemInfo","abstract":"<p>Undocumented</p>"},"Classes/SDLSystemRequest.html":{"name":"SDLSystemRequest","abstract":"<p>An asynchronous request from the device; binary data can be included in hybrid part of message for some requests (such as HTTP, Proprietary, or Authentication requests)</p>"},"Classes.html#/c:objc(cs)SDLSystemRequestResponse":{"name":"SDLSystemRequestResponse","abstract":"<p>Response to SystemRequest</p>"},"Classes/SDLTTSChunk.html":{"name":"SDLTTSChunk","abstract":"<p>Specifies what is to be spoken. This can be simply a text phrase, which SDL will speak according to its own rules. It can also be phonemes from either the Microsoft SAPI phoneme set, or from the LHPLUS phoneme set. It can also be a pre-recorded sound in WAV format (either developer-defined, or provided by the SDL platform).</p>"},"Classes/SDLTemperature.html":{"name":"SDLTemperature","abstract":"<p>Struct representing a temperature.</p>"},"Classes/SDLTemplateColorScheme.html":{"name":"SDLTemplateColorScheme","abstract":"<p>A color scheme for all display layout templates.</p>"},"Classes/SDLTemplateConfiguration.html":{"name":"SDLTemplateConfiguration","abstract":"<p>Used to set an alternate template layout to a window.</p>"},"Classes/SDLTextField.html":{"name":"SDLTextField","abstract":"<p>Struct defining the characteristics of a displayed field on the HMI.</p>"},"Classes/SDLTireStatus.html":{"name":"SDLTireStatus","abstract":"<p>Struct used in Vehicle Data; the status and pressure of the tires.</p>"},"Classes/SDLTouch.html":{"name":"SDLTouch","abstract":"<p>Describes a touch location</p>"},"Classes/SDLTouchCoord.html":{"name":"SDLTouchCoord","abstract":"<p>The coordinate of a touch, used in a touch event</p>"},"Classes/SDLTouchEvent.html":{"name":"SDLTouchEvent","abstract":"<p>A touch which occurred on the IVI system during projection</p>"},"Classes/SDLTouchEventCapabilities.html":{"name":"SDLTouchEventCapabilities","abstract":"<p>The capabilities of touches during projection applications</p>"},"Classes/SDLTouchManager.html":{"name":"SDLTouchManager","abstract":"<p>Touch Manager responsible for processing touch event notifications.</p>"},"Classes/SDLTurn.html":{"name":"SDLTurn","abstract":"<p>A struct used in UpdateTurnList for Turn-by-Turn navigation applications</p>"},"Classes/SDLUnpublishAppService.html":{"name":"SDLUnpublishAppService","abstract":"<p>Unpublish an existing service published by this application.</p>"},"Classes.html#/c:objc(cs)SDLUnpublishAppServiceResponse":{"name":"SDLUnpublishAppServiceResponse","abstract":"<p>The response to UnpublishAppService</p>"},"Classes.html#/c:objc(cs)SDLUnregisterAppInterface":{"name":"SDLUnregisterAppInterface","abstract":"<p>Terminates an application&rsquo;s interface registration. This causes SDL&reg; to"},"Classes.html#/c:objc(cs)SDLUnregisterAppInterfaceResponse":{"name":"SDLUnregisterAppInterfaceResponse","abstract":"<p>Response to UnregisterAppInterface</p>"},"Classes/SDLUnsubscribeButton.html":{"name":"SDLUnsubscribeButton","abstract":"<p>Deletes a subscription to button notifications for the specified button. For"},"Classes.html#/c:objc(cs)SDLUnsubscribeButtonResponse":{"name":"SDLUnsubscribeButtonResponse","abstract":"<p>Response to UnsubscribeButton</p>"},"Classes/SDLUnsubscribeVehicleData.html":{"name":"SDLUnsubscribeVehicleData","abstract":"<p>This function is used to unsubscribe the notifications from the"},"Classes/SDLUnsubscribeVehicleDataResponse.html":{"name":"SDLUnsubscribeVehicleDataResponse","abstract":"<p>Response to UnsubscribeVehicleData</p>"},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPoints":{"name":"SDLUnsubscribeWayPoints","abstract":"<p>Request to unsubscribe from navigation WayPoints and Destination</p>"},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPointsResponse":{"name":"SDLUnsubscribeWayPointsResponse","abstract":"<p>Response to UnsubscribeWayPoints</p>"},"Classes/SDLUpdateTurnList.html":{"name":"SDLUpdateTurnList","abstract":"<p>Updates the list of next maneuvers, which can be requested by the user pressing the softbutton<br></p>"},"Classes.html#/c:objc(cs)SDLUpdateTurnListResponse":{"name":"SDLUpdateTurnListResponse","abstract":"<p>Response to UpdateTurnList</p>"},"Classes/SDLVehicleDataResult.html":{"name":"SDLVehicleDataResult","abstract":"<p>Individual published data request result</p>"},"Classes/SDLVehicleType.html":{"name":"SDLVehicleType","abstract":"<p>Describes the type of vehicle the mobile phone is connected with.</p>"},"Classes/SDLVersion.html":{"name":"SDLVersion","abstract":"<p>Specifies a major / minor / patch version number for semantic versioning purposes and comparisons</p>"},"Classes/SDLVideoStreamingCapability.html":{"name":"SDLVideoStreamingCapability","abstract":"<p>Contains information about this system&rsquo;s video streaming capabilities</p>"},"Classes/SDLVideoStreamingFormat.html":{"name":"SDLVideoStreamingFormat","abstract":"<p>An available format for video streaming in projection applications</p>"},"Classes/SDLVideoStreamingRange.html":{"name":"SDLVideoStreamingRange","abstract":"<p>Undocumented</p>"},"Classes/SDLVoiceCommand.html":{"name":"SDLVoiceCommand","abstract":"<p>Voice commands available for the user to speak and be recognized by the IVI&rsquo;s voice recognition engine.</p>"},"Classes/SDLVRHelpItem.html":{"name":"SDLVRHelpItem","abstract":"<p>A help item for voice commands, used locally in interaction lists and globally</p>"},"Classes/SDLWeatherAlert.html":{"name":"SDLWeatherAlert","abstract":"<p>Contains information about a weather alert</p>"},"Classes/SDLWeatherData.html":{"name":"SDLWeatherData","abstract":"<p>Contains information about the current weather</p>"},"Classes/SDLWeatherServiceData.html":{"name":"SDLWeatherServiceData","abstract":"<p>This data is related to what a weather service would provide.</p>"},"Classes/SDLWeatherServiceManifest.html":{"name":"SDLWeatherServiceManifest","abstract":"<p>A weather service manifest.</p>"},"Classes/SDLWindowCapability.html":{"name":"SDLWindowCapability","abstract":"<p>Reflects content of DisplayCapabilities, ButtonCapabilities and SoftButtonCapabilities</p>"},"Classes/SDLWindowState.html":{"name":"SDLWindowState","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLWindowStatus.html":{"name":"SDLWindowStatus","abstract":"<p>Describes the status of a window of a door/liftgate etc.</p>"},"Classes/SDLWindowTypeCapabilities.html":{"name":"SDLWindowTypeCapabilities","abstract":"<p>Used to inform an app how many window instances per type that can be created.</p>"},"Categories/NSString%28SDLEnum%29.html#/c:objc(cs)NSString(im)isEqualToEnum:":{"name":"-isEqualToEnum:","abstract":"<p>Returns whether or not two enums are equal.</p>","parent_name":"NSString(SDLEnum)"},"Categories/NSString%28SDLEnum%29.html":{"name":"NSString(SDLEnum)","abstract":"<p>Extensions to NSString specifically for SDL string enums</p>"},"Categories.html":{"name":"Categories","abstract":"<p>The following categories are available globally.</p>"},"Classes.html":{"name":"Classes","abstract":"<p>The following classes are available globally.</p>"},"Constants.html":{"name":"Constants","abstract":"<p>The following constants are available globally.</p>"},"Enums.html":{"name":"Enumerations","abstract":"<p>The following enumerations are available globally.</p>"},"Protocols.html":{"name":"Protocols","abstract":"<p>The following protocols are available globally.</p>"},"Type%20Definitions.html":{"name":"Type Definitions","abstract":"<p>The following type definitions are available globally.</p>"}} \ No newline at end of file
+{"Type%20Definitions.html#/c:SDLAlertView.h@T@SDLAlertCanceledHandler":{"name":"SDLAlertCanceledHandler","abstract":"<p>Notifies the subscriber that the alert should be cancelled.</p>"},"Type%20Definitions.html#/c:SDLAmbientLightStatus.h@T@SDLAmbientLightStatus":{"name":"SDLAmbientLightStatus","abstract":"<p>Reflects the status of the ambient light sensor for headlamps</p>"},"Type%20Definitions.html#/c:SDLAppCapabilityType.h@T@SDLAppCapabilityType":{"name":"SDLAppCapabilityType","abstract":"<p>Enumerations of all available app capability types</p>"},"Type%20Definitions.html#/c:SDLAppHMIType.h@T@SDLAppHMIType":{"name":"SDLAppHMIType","abstract":"<p>Enumeration listing possible app hmi types.</p>"},"Type%20Definitions.html#/c:SDLAppInterfaceUnregisteredReason.h@T@SDLAppInterfaceUnregisteredReason":{"name":"SDLAppInterfaceUnregisteredReason","abstract":"<p>Indicates reason why app interface was unregistered. The application is being disconnected by SDL.</p>"},"Type%20Definitions.html#/c:SDLAppServiceType.h@T@SDLAppServiceType":{"name":"SDLAppServiceType","abstract":"<p>Enumeration listing possible app service types.</p>"},"Type%20Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator":{"name":"SDLAudioStreamingIndicator","abstract":"<p>Enumeration listing possible indicators of audio streaming changes</p>"},"Type%20Definitions.html#/c:SDLAudioStreamingState.h@T@SDLAudioStreamingState":{"name":"SDLAudioStreamingState","abstract":"<p>Describes whether or not streaming audio is currently audible to the user. Though provided in every OnHMIStatus notification, this information is only relevant for applications that declare themselves as media apps in RegisterAppInterface</p>"},"Type%20Definitions.html#/c:SDLAudioType.h@T@SDLAudioType":{"name":"SDLAudioType","abstract":"<p>Describes different audio type options for PerformAudioPassThru</p>"},"Type%20Definitions.html#/c:SDLBitsPerSample.h@T@SDLBitsPerSample":{"name":"SDLBitsPerSample","abstract":"<p>Describes different bit depth options for PerformAudioPassThru</p>"},"Type%20Definitions.html#/c:SDLButtonEventMode.h@T@SDLButtonEventMode":{"name":"SDLButtonEventMode","abstract":"<p>Indicates whether the button was depressed or released. A BUTTONUP event will always be preceded by a BUTTONDOWN event.</p>"},"Type%20Definitions.html#/c:SDLButtonName.h@T@SDLButtonName":{"name":"SDLButtonName","abstract":"<p>Defines logical buttons which, on a given SDL unit, would correspond to either physical or soft (touchscreen) buttons. These logical buttons present a standard functional abstraction which the developer can rely upon, independent of the SDL unit. For example, the developer can rely upon the OK button having the same meaning to the user across SDL platforms.</p>"},"Type%20Definitions.html#/c:SDLButtonPressMode.h@T@SDLButtonPressMode":{"name":"SDLButtonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press</p>"},"Type%20Definitions.html#/c:SDLCapacityUnit.h@T@SDLCapacityUnit":{"name":"SDLCapacityUnit","abstract":"<p>@since SDL 7.0.0</p>"},"Type%20Definitions.html#/c:SDLCarModeStatus.h@T@SDLCarModeStatus":{"name":"SDLCarModeStatus","abstract":"<p>Describes the carmode the vehicle is in. Used in ClusterModeStatus</p>"},"Type%20Definitions.html#/c:SDLCharacterSet.h@T@SDLCharacterSet":{"name":"SDLCharacterSet","abstract":"<p>The list of potential character sets</p>"},"Type%20Definitions.html#/c:SDLChoiceSet.h@T@SDLChoiceSetCanceledHandler":{"name":"SDLChoiceSetCanceledHandler","abstract":"<p>Notifies the subscriber that the choice set should be cancelled.</p>"},"Type%20Definitions.html#/c:SDLCompassDirection.h@T@SDLCompassDirection":{"name":"SDLCompassDirection","abstract":"<p>The list of potential compass directions. Used in GPS data</p>"},"Type%20Definitions.html#/c:SDLComponentVolumeStatus.h@T@SDLComponentVolumeStatus":{"name":"SDLComponentVolumeStatus","abstract":"<p>The volume status of a vehicle component. Used in SingleTireStatus and VehicleData Fuel Level</p>"},"Type%20Definitions.html#/c:SDLDefrostZone.h@T@SDLDefrostZone":{"name":"SDLDefrostZone","abstract":"<p>Enumeration listing possible defrost zones. Used in ClimateControlCapabilities and Data.</p>"},"Type%20Definitions.html#/c:SDLDeliveryMode.h@T@SDLDeliveryMode":{"name":"SDLDeliveryMode","abstract":"<p>Specifies the mode in which the sendLocation request is sent. Used in SendLocation.</p>"},"Type%20Definitions.html#/c:SDLDeviceLevelStatus.h@T@SDLDeviceLevelStatus":{"name":"SDLDeviceLevelStatus","abstract":"<p>Reflects the reported battery status of the connected device, if reported. Used in DeviceStatus.</p>"},"Type%20Definitions.html#/c:SDLDimension.h@T@SDLDimension":{"name":"SDLDimension","abstract":"<p>The supported dimensions of the GPS. Used in GPSData</p>"},"Type%20Definitions.html#/c:SDLDirection.h@T@SDLDirection":{"name":"SDLDirection","abstract":"<p>A navigation direction.</p>"},"Type%20Definitions.html#/c:SDLDisplayMode.h@T@SDLDisplayMode":{"name":"SDLDisplayMode","abstract":"<p>Identifies the various display types used by SDL.</p>"},"Type%20Definitions.html#/c:SDLDisplayType.h@T@SDLDisplayType":{"name":"SDLDisplayType","abstract":"<p>Identifies the various display types used by SDL. Used in DisplayCapabilities.</p>"},"Type%20Definitions.html#/c:SDLDistanceUnit.h@T@SDLDistanceUnit":{"name":"SDLDistanceUnit","abstract":"<p>Wiper Status</p>"},"Type%20Definitions.html#/c:SDLDoorStatusType.h@T@SDLDoorStatusType":{"name":"SDLDoorStatusType","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Type%20Definitions.html#/c:SDLDriverDistractionState.h@T@SDLDriverDistractionState":{"name":"SDLDriverDistractionState","abstract":"<p>Enumeration that describes possible states of driver distraction. Used in OnDriverDistraction.</p>"},"Type%20Definitions.html#/c:SDLECallConfirmationStatus.h@T@SDLECallConfirmationStatus":{"name":"SDLECallConfirmationStatus","abstract":"<p>Reflects the status of the eCall Notification. Used in ECallInfo</p>"},"Type%20Definitions.html#/c:SDLElectronicParkBrakeStatus.h@T@SDLElectronicParkBrakeStatus":{"name":"SDLElectronicParkBrakeStatus","abstract":"<p>Reflects the status of the Electronic Parking Brake. A Vehicle Data Type.</p>"},"Type%20Definitions.html#/c:SDLEmergencyEventType.h@T@SDLEmergencyEventType":{"name":"SDLEmergencyEventType","abstract":"<p>Reflects the emergency event status of the vehicle. Used in EmergencyEvent</p>"},"Type%20Definitions.html#/c:SDLEnum.h@T@SDLEnum":{"name":"SDLEnum","abstract":"<p>NSString SDLEnum typedef</p>"},"Type%20Definitions.html#/c:SDLErrorConstants.h@T@SDLErrorDomain":{"name":"SDLErrorDomain","abstract":"<p>A typedef declaration of the SDL error domain</p>"},"Type%20Definitions.html#/c:SDLFileManager.h@T@SDLFileManagerStartupCompletionHandler":{"name":"SDLFileManagerStartupCompletionHandler","abstract":"<p>The handler that is called when the manager is set up or failed to set up with an error."},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileName":{"name":"SDLFileName","abstract":"<p>Typedef SDLFileName</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadCompletionHandler":{"name":"SDLFileManagerUploadCompletionHandler","abstract":"<p>A completion handler called after a response from Core to an upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadCompletionHandler":{"name":"SDLFileManagerMultiUploadCompletionHandler","abstract":"<p>A completion handler called after a set of upload requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadProgressHandler":{"name":"SDLFileManagerMultiUploadProgressHandler","abstract":"<p>In a multiple request send, a handler called after each response from Core to a upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerDeleteCompletionHandler":{"name":"SDLFileManagerDeleteCompletionHandler","abstract":"<p>A completion handler called after a response from Core to a delete request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiDeleteCompletionHandler":{"name":"SDLFileManagerMultiDeleteCompletionHandler","abstract":"<p>A completion handler called after a set of delete requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerListFilesCompletionHandler":{"name":"SDLFileManagerListFilesCompletionHandler","abstract":"<p>A completion handler called after response from Core to a list files request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadArtworkCompletionHandler":{"name":"SDLFileManagerUploadArtworkCompletionHandler","abstract":"<p>A completion handler called after a response from Core to an artwork upload request.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkCompletionHandler":{"name":"SDLFileManagerMultiUploadArtworkCompletionHandler","abstract":"<p>A completion handler called after a set of upload artwork requests has completed.</p>"},"Type%20Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkProgressHandler":{"name":"SDLFileManagerMultiUploadArtworkProgressHandler","abstract":"<p>In a multiple request send, a handler called after each response from Core to an artwork upload request.</p>"},"Type%20Definitions.html#/c:SDLFileType.h@T@SDLFileType":{"name":"SDLFileType","abstract":"<p>Enumeration listing possible file types. Used in SDLFile, PutFile, ImageField, OnSystemRequest</p>"},"Type%20Definitions.html#/c:SDLFuelCutoffStatus.h@T@SDLFuelCutoffStatus":{"name":"SDLFuelCutoffStatus","abstract":"<p>Reflects the status of the Restraints Control Module fuel pump cutoff. The fuel pump is cut off typically after the vehicle has had a collision. Used in EmergencyEvent.</p>"},"Type%20Definitions.html#/c:SDLFuelType.h@T@SDLFuelType":{"name":"SDLFuelType","abstract":"<p>Enumeration listing possible fuel types.</p>"},"Type%20Definitions.html#/c:SDLGlobalProperty.h@T@SDLGlobalProperty":{"name":"SDLGlobalProperty","abstract":"<p>Properties of a user-initiated VR interaction (i.e. interactions started by the user pressing the PTT button). Used in RPCs related to ResetGlobalProperties</p>"},"Type%20Definitions.html#/c:SDLHMILevel.h@T@SDLHMILevel":{"name":"SDLHMILevel","abstract":"<p>Specifies current level of the HMI. An HMI level indicates the degree of user interaction possible through the HMI (e.g. TTS only, display only, VR, etc.). The HMI level varies for an application based on the type of display (i.e. Nav or non-Nav) and the user directing &ldquo;focus&rdquo; to other applications (e.g. phone, other mobile applications, etc.). Used in OnHMIStatus</p>"},"Type%20Definitions.html#/c:SDLHMIZoneCapabilities.h@T@SDLHMIZoneCapabilities":{"name":"SDLHMIZoneCapabilities","abstract":"<p>Specifies HMI Zones in the vehicle. Used in RegisterAppInterfaceResponse</p>"},"Type%20Definitions.html#/c:SDLHybridAppPreference.h@T@SDLHybridAppPreference":{"name":"SDLHybridAppPreference","abstract":"<p>Enumeration for the user&rsquo;s preference of which app type to use when both are available.</p>"},"Type%20Definitions.html#/c:SDLIgnitionStableStatus.h@T@SDLIgnitionStableStatus":{"name":"SDLIgnitionStableStatus","abstract":"<p>Reflects the ignition switch stability. Used in BodyInformation</p>"},"Type%20Definitions.html#/c:SDLIgnitionStatus.h@T@SDLIgnitionStatus":{"name":"SDLIgnitionStatus","abstract":"<p>Reflects the status of ignition. Used in BodyInformation.</p>"},"Type%20Definitions.html#/c:SDLImageFieldName.h@T@SDLImageFieldName":{"name":"SDLImageFieldName","abstract":"<p>The name that identifies the field. Used in DisplayCapabilities.</p>"},"Type%20Definitions.html#/c:SDLImageType.h@T@SDLImageType":{"name":"SDLImageType","abstract":"<p>Contains information about the type of image. Used in Image.</p>"},"Type%20Definitions.html#/c:SDLInteractionMode.h@T@SDLInteractionMode":{"name":"SDLInteractionMode","abstract":"<p>For application-initiated interactions (SDLPerformInteraction), this specifies the mode by which the user is prompted and by which the user&rsquo;s selection is indicated. Used in PerformInteraction.</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardAutocompleteCompletionHandler":{"name":"SDLKeyboardAutocompleteCompletionHandler","abstract":"<p>This handler is called when you wish to update your autocomplete text in response to the user&rsquo;s input</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardAutoCompleteResultsHandler":{"name":"SDLKeyboardAutoCompleteResultsHandler","abstract":"<p>This handler is called when you wish to update your autocomplete text in response to the user&rsquo;s input.</p>"},"Type%20Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardCharacterSetCompletionHandler":{"name":"SDLKeyboardCharacterSetCompletionHandler","abstract":"<p>This handler is called when you wish to update your keyboard&rsquo;s limitedCharacterSet in response to the user&rsquo;s input</p>"},"Type%20Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent":{"name":"SDLKeyboardEvent","abstract":"<p>Enumeration listing possible keyboard events. Used in OnKeyboardInput.</p>"},"Type%20Definitions.html#/c:SDLKeyboardInputMask.h@T@SDLKeyboardInputMask":{"name":"SDLKeyboardInputMask","abstract":"<p>Enumeration listing possible input character masking.</p>"},"Type%20Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout":{"name":"SDLKeyboardLayout","abstract":"<p>Enumeration listing possible keyboard layouts. Used in KeyboardProperties.</p>"},"Type%20Definitions.html#/c:SDLKeypressMode.h@T@SDLKeypressMode":{"name":"SDLKeypressMode","abstract":"<p>Enumeration listing possible keyboard events.</p>"},"Type%20Definitions.html#/c:SDLLanguage.h@T@SDLLanguage":{"name":"SDLLanguage","abstract":"<p>Specifies the language to be used for TTS, VR, displayed messages/menus. Used in ChangeRegistration and RegisterAppInterface.</p>"},"Type%20Definitions.html#/c:SDLLayoutMode.h@T@SDLLayoutMode":{"name":"SDLLayoutMode","abstract":"<p>For touchscreen interactions, the mode of how the choices are presented. Used in PerformInteraction.</p>"},"Type%20Definitions.html#/c:SDLLightName.h@T@SDLLightName":{"name":"SDLLightName","abstract":"<p>The name that identifies the Light</p>"},"Type%20Definitions.html#/c:SDLLightStatus.h@T@SDLLightStatus":{"name":"SDLLightStatus","abstract":"<p>Reflects the status of Light.</p>"},"Type%20Definitions.html#/c:SDLLockScreenViewController.h@T@SwipeGestureCallbackBlock":{"name":"SwipeGestureCallbackBlock","abstract":"<p>A block that can be used to close the lockscreen when the user swipes on the lockscreen. Override this in your own custom view controllers if you build a custom lock screen.</p>"},"Type%20Definitions.html#/c:SDLLogConstants.h@T@SDLLogFilterBlock":{"name":"SDLLogFilterBlock","abstract":"<p>A block that takes in a log model and returns whether or not the log passes the filter and should therefore be logged.</p>"},"Type%20Definitions.html#/c:SDLMaintenanceModeStatus.h@T@SDLMaintenanceModeStatus":{"name":"SDLMaintenanceModeStatus","abstract":"<p>Describes the maintenance mode. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLManager.h@T@SDLManagerReadyBlock":{"name":"SDLManagerReadyBlock","abstract":"<p>The block called when the manager is ready to be used or an error occurs while attempting to become ready.</p>"},"Type%20Definitions.html#/c:SDLManager.h@T@SDLRPCUpdatedBlock":{"name":"SDLRPCUpdatedBlock","abstract":"<p>The block that will be called every time an RPC is received when subscribed to an RPC.</p>"},"Type%20Definitions.html#/c:SDLMassageCushion.h@T@SDLMassageCushion":{"name":"SDLMassageCushion","abstract":"<p>The List possible cushions of a multi-contour massage seat.</p>"},"Type%20Definitions.html#/c:SDLMassageMode.h@T@SDLMassageMode":{"name":"SDLMassageMode","abstract":"<p>The List possible modes of a massage zone.</p>"},"Type%20Definitions.html#/c:SDLMassageZone.h@T@SDLMassageZone":{"name":"SDLMassageZone","abstract":"<p>List possible zones of a multi-contour massage seat.</p>"},"Type%20Definitions.html#/c:SDLMediaClockFormat.h@T@SDLMediaClockFormat":{"name":"SDLMediaClockFormat","abstract":"<p>Indicates the format of the time displayed on the connected SDL unit.</p>"},"Type%20Definitions.html#/c:SDLMediaType.h@T@SDLMediaType":{"name":"SDLMediaType","abstract":"<p>Enumeration listing possible media types.</p>"},"Type%20Definitions.html#/c:SDLMenuCell.h@T@SDLMenuCellSelectionHandler":{"name":"SDLMenuCellSelectionHandler","abstract":"<p>The handler to run when a menu item is selected.</p>"},"Type%20Definitions.html#/c:SDLMenuLayout.h@T@SDLMenuLayout":{"name":"SDLMenuLayout","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLMetadataType.h@T@SDLMetadataType":{"name":"SDLMetadataType","abstract":"<p>Text Field metadata types. Used in Show.</p>"},"Type%20Definitions.html#/c:SDLModuleType.h@T@SDLModuleType":{"name":"SDLModuleType","abstract":"<p>The type of remote control data. Used in ButtonPress, GetInteriorVehicleData, and ModuleData</p>"},"Type%20Definitions.html#/c:SDLNavigationAction.h@T@SDLNavigationAction":{"name":"SDLNavigationAction","abstract":"<p>A navigation action.</p>"},"Type%20Definitions.html#/c:SDLNavigationJunction.h@T@SDLNavigationJunction":{"name":"SDLNavigationJunction","abstract":"<p>A navigation junction type.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationName":{"name":"SDLNotificationName","abstract":"<p>NSNotification names specific to incoming SDL RPC</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationUserInfoKey":{"name":"SDLNotificationUserInfoKey","abstract":"<p>The key used in all SDL NSNotifications to extract the response or notification from the userInfo dictionary.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLAudioPassThruHandler":{"name":"SDLAudioPassThruHandler","abstract":"<p>A handler used on SDLPerformAudioPassThru.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLResponseHandler":{"name":"SDLResponseHandler","abstract":"<p>A handler used on all RPC requests which fires when the response is received.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleRequestCompletionHandler":{"name":"SDLMultipleRequestCompletionHandler","abstract":"<p>A completion handler called after a sequential or simultaneous set of requests have completed sending.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleSequentialRequestProgressHandler":{"name":"SDLMultipleSequentialRequestProgressHandler","abstract":"<p>A handler called after each response to a request comes in in a multiple request send.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleAsyncRequestProgressHandler":{"name":"SDLMultipleAsyncRequestProgressHandler","abstract":"<p>A handler called after each response to a request comes in in a multiple request send.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCButtonNotificationHandler":{"name":"SDLRPCButtonNotificationHandler","abstract":"<p>A handler that may optionally be run when an SDLSubscribeButton or SDLSoftButton has a corresponding notification occur.</p>"},"Type%20Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCCommandNotificationHandler":{"name":"SDLRPCCommandNotificationHandler","abstract":"<p>A handler that may optionally be run when an SDLAddCommand has a corresponding notification occur.</p>"},"Type%20Definitions.html#/c:SDLPRNDL.h@T@SDLPRNDL":{"name":"SDLPRNDL","abstract":"<p>The selected gear the car is in. Used in retrieving vehicle data.</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName":{"name":"SDLPermissionRPCName","abstract":"<p>NSString typedef</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionObserverIdentifier":{"name":"SDLPermissionObserverIdentifier","abstract":"<p>NSUUID typedef</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionsChangedHandler":{"name":"SDLPermissionsChangedHandler","abstract":"<p>This is a block that is passed in to some methods that will be stored and called when specified permissions change.</p>"},"Type%20Definitions.html#/c:SDLPermissionConstants.h@T@SDLRPCPermissionStatusChangedHandler":{"name":"SDLRPCPermissionStatusChangedHandler","abstract":"<p>A block that will be called when specified permissions change. It will return whether each RPC and its parameters are allowed as well as the permission group status of all the RPCs.</p>"},"Type%20Definitions.html#/c:SDLPermissionStatus.h@T@SDLPermissionStatus":{"name":"SDLPermissionStatus","abstract":"<p>Enumeration that describes possible permission states of a policy table entry. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLPowerModeQualificationStatus.h@T@SDLPowerModeQualificationStatus":{"name":"SDLPowerModeQualificationStatus","abstract":"<p>Describes the power mode qualification status. Used in ClusterModeStatus.</p>"},"Type%20Definitions.html#/c:SDLPowerModeStatus.h@T@SDLPowerModeStatus":{"name":"SDLPowerModeStatus","abstract":"<p>The status of the car&rsquo;s power. Used in ClusterModeStatus.</p>"},"Type%20Definitions.html#/c:SDLPredefinedLayout.h@T@SDLPredefinedLayout":{"name":"SDLPredefinedLayout","abstract":"<p>A template layout an app uses to display information. The broad details of the layout are defined, but the details depend on the IVI system. Used in SetDisplayLayout.</p>"},"Type%20Definitions.html#/c:SDLPrerecordedSpeech.h@T@SDLPrerecordedSpeech":{"name":"SDLPrerecordedSpeech","abstract":"<p>Contains information about the speech capabilities on the SDL platform. Used in RegisterAppInterfaceResponse to indicate capability.</p>"},"Type%20Definitions.html#/c:SDLPrimaryAudioSource.h@T@SDLPrimaryAudioSource":{"name":"SDLPrimaryAudioSource","abstract":"<p>Reflects the current primary audio source of SDL (if selected). Used in DeviceStatus.</p>"},"Type%20Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName":{"name":"SDLRPCFunctionName","abstract":"<p>All RPC request / response / notification names</p>"},"Type%20Definitions.html#/c:SDLRPCMessageType.h@T@SDLRPCMessageTypeName":{"name":"SDLRPCMessageTypeName","abstract":"<p>A type of RPC message</p>"},"Type%20Definitions.html#/c:SDLRadioBand.h@T@SDLRadioBand":{"name":"SDLRadioBand","abstract":"<p>Radio bands, such as AM and FM, used in RadioControlData</p>"},"Type%20Definitions.html#/c:SDLRadioState.h@T@SDLRadioState":{"name":"SDLRadioState","abstract":"<p>List possible states of a remote control radio module. Used in RadioControlData.</p>"},"Type%20Definitions.html#/c:SDLRequestType.h@T@SDLRequestType":{"name":"SDLRequestType","abstract":"<p>A type of system request. Used in SystemRequest.</p>"},"Type%20Definitions.html#/c:SDLResult.h@T@SDLResult":{"name":"SDLResult","abstract":"<p>Defines the possible result codes returned by SDL to the application in a response to a requested operation. Used in RPC responses</p>"},"Type%20Definitions.html#/c:SDLSamplingRate.h@T@SDLSamplingRate":{"name":"SDLSamplingRate","abstract":"<p>Describes different sampling rates for PerformAudioPassThru and AudioPassThruCapabilities</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler":{"name":"SDLScreenManagerUpdateCompletionHandler","abstract":"<p>The handler run when the update has completed</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLPreloadChoiceCompletionHandler":{"name":"SDLPreloadChoiceCompletionHandler","abstract":"<p>Return an error with userinfo [key: SDLChoiceCell, value: NSError] if choices failed to upload</p>"},"Type%20Definitions.html#/c:SDLScreenManager.h@T@SDLSubscribeButtonHandler":{"name":"SDLSubscribeButtonHandler","abstract":"<p>A handler run when the subscribe button has been selected</p>"},"Type%20Definitions.html#/c:SDLSeatMemoryActionType.h@T@SDLSeatMemoryActionType":{"name":"SDLSeatMemoryActionType","abstract":"<p>List of possible actions on Seat Meomry</p>"},"Type%20Definitions.html#/c:SDLSeekIndicatorType.h@T@SDLSeekIndicatorType":{"name":"SDLSeekIndicatorType","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Type%20Definitions.html#/c:SDLServiceUpdateReason.h@T@SDLServiceUpdateReason":{"name":"SDLServiceUpdateReason","abstract":"<p>Enumeration listing possible service update reasons.</p>"},"Type%20Definitions.html#/c:SDLSoftButtonType.h@T@SDLSoftButtonType":{"name":"SDLSoftButtonType","abstract":"<p>SoftButtonType (TEXT / IMAGE / BOTH). Used by SoftButton.</p>"},"Type%20Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities":{"name":"SDLSpeechCapabilities","abstract":"<p>Contains information about TTS capabilities on the SDL platform. Used in RegisterAppInterfaceResponse, and TTSChunk.</p>"},"Type%20Definitions.html#/c:SDLStaticIconName.h@T@SDLStaticIconName":{"name":"SDLStaticIconName","abstract":"<p>Static icon names</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLVideoStreamManagerState":{"name":"SDLVideoStreamManagerState","abstract":"<p>The current state of the video stream manager</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAudioStreamManagerState":{"name":"SDLAudioStreamManagerState","abstract":"<p>The current state of the audio stream manager</p>"},"Type%20Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAppState":{"name":"SDLAppState","abstract":"<p>Typedef SDLAppState</p>"},"Type%20Definitions.html#/c:SDLSupportedSeat.h@T@SDLSupportedSeat":{"name":"SDLSupportedSeat","abstract":"<p>List possible seats that is a remote controllable seat.</p>"},"Type%20Definitions.html#/c:SDLSystemAction.h@T@SDLSystemAction":{"name":"SDLSystemAction","abstract":"<p>Enumeration that describes system actions that can be triggered. Used in SoftButton.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLUpdateCapabilityHandler":{"name":"SDLUpdateCapabilityHandler","abstract":"<p>A completion handler called after a request for the capability type is returned from the remote system.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLCapabilityUpdateHandler":{"name":"SDLCapabilityUpdateHandler","abstract":"<p>An observer block for whenever a subscription is called.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLCapabilityUpdateWithErrorHandler":{"name":"SDLCapabilityUpdateWithErrorHandler","abstract":"<p>An observer block for whenever a subscription or value is retrieved.</p>"},"Type%20Definitions.html#/c:SDLSystemCapabilityType.h@T@SDLSystemCapabilityType":{"name":"SDLSystemCapabilityType","abstract":"<p>The type of system capability to get more information on. Used in GetSystemCapability.</p>"},"Type%20Definitions.html#/c:SDLSystemContext.h@T@SDLSystemContext":{"name":"SDLSystemContext","abstract":"<p>Indicates whether or not a user-initiated interaction is in progress, and if so, in what mode (i.e. MENU or VR). Used in OnHMIStatus</p>"},"Type%20Definitions.html#/c:SDLTBTState.h@T@SDLTBTState":{"name":"SDLTBTState","abstract":"<p>The turn-by-turn state, used in OnTBTClientState.</p>"},"Type%20Definitions.html#/c:SDLTPMS.h@T@SDLTPMS":{"name":"SDLTPMS","abstract":"<p>An enum representing values of the tire pressure monitoring system</p>"},"Type%20Definitions.html#/c:SDLTemperatureUnit.h@T@SDLTemperatureUnit":{"name":"SDLTemperatureUnit","abstract":"<p>The unit of temperature to display. Used in Temperature.</p>"},"Type%20Definitions.html#/c:SDLTextAlignment.h@T@SDLTextAlignment":{"name":"SDLTextAlignment","abstract":"<p>The list of possible alignments of text in a field. May only work on some display types. used in Show.</p>"},"Type%20Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName":{"name":"SDLTextFieldName","abstract":"<p>Names of the text fields that can appear on a SDL display. Used in TextFieldName.</p>"},"Type%20Definitions.html#/c:SDLTimerMode.h@T@SDLTimerMode":{"name":"SDLTimerMode","abstract":"<p>The direction of a timer. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLTouchManager.h@T@SDLTouchEventHandler":{"name":"SDLTouchEventHandler","abstract":"<p>Handler for touch events</p>"},"Type%20Definitions.html#/c:SDLTouchType.h@T@SDLTouchType":{"name":"SDLTouchType","abstract":"<p>The type of a touch in a projection application. Used in OnTouchEvent.</p>"},"Type%20Definitions.html#/c:SDLTransmissionType.h@T@SDLTransmissionType":{"name":"SDLTransmissionType","abstract":"<p>Type of transmission used in the vehicle.</p>"},"Type%20Definitions.html#/c:SDLTriggerSource.h@T@SDLTriggerSource":{"name":"SDLTriggerSource","abstract":"<p>Indicates whether choice/command was selected via VR or via a menu selection (using SEEKRIGHT/SEEKLEFT, TUNEUP, TUNEDOWN, OK buttons). Used in PerformInteractionResponse and OnCommand.</p>"},"Type%20Definitions.html#/c:SDLTurnSignal.h@T@SDLTurnSignal":{"name":"SDLTurnSignal","abstract":"<p>Enumeration that describes the status of the turn light indicator.</p>"},"Type%20Definitions.html#/c:SDLUpdateMode.h@T@SDLUpdateMode":{"name":"SDLUpdateMode","abstract":"<p>Specifies what function should be performed on the media clock/counter. Used in SetMediaClockTimer.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataActiveStatus.h@T@SDLVehicleDataActiveStatus":{"name":"SDLVehicleDataActiveStatus","abstract":"<p>Vehicle Data Activity Status. Used in nothing.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataEventStatus.h@T@SDLVehicleDataEventStatus":{"name":"SDLVehicleDataEventStatus","abstract":"<p>Reflects the status of a vehicle data event; e.g. a seat belt event status. Used in retrieving vehicle data.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataNotificationStatus.h@T@SDLVehicleDataNotificationStatus":{"name":"SDLVehicleDataNotificationStatus","abstract":"<p>Reflects the status of a vehicle data notification. Used in ECallInfo</p>"},"Type%20Definitions.html#/c:SDLVehicleDataResultCode.h@T@SDLVehicleDataResultCode":{"name":"SDLVehicleDataResultCode","abstract":"<p>Vehicle Data Result Code. Used in DIDResult.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataStatus.h@T@SDLVehicleDataStatus":{"name":"SDLVehicleDataStatus","abstract":"<p>Reflects the status of a binary vehicle data item. Used in MyKey.</p>"},"Type%20Definitions.html#/c:SDLVehicleDataType.h@T@SDLVehicleDataType":{"name":"SDLVehicleDataType","abstract":"<p>Defines the vehicle data types that can be published and/or subscribed to using SDLSubscribeVehicleData. Used in VehicleDataResult</p>"},"Type%20Definitions.html#/c:SDLVentilationMode.h@T@SDLVentilationMode":{"name":"SDLVentilationMode","abstract":"<p>The ventilation mode. Used in ClimateControlCapabilities</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingCodec.h@T@SDLVideoStreamingCodec":{"name":"SDLVideoStreamingCodec","abstract":"<p>Enum for each type of video streaming codec. Used in VideoStreamingFormat.</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingProtocol.h@T@SDLVideoStreamingProtocol":{"name":"SDLVideoStreamingProtocol","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLVideoStreamingState.h@T@SDLVideoStreamingState":{"name":"SDLVideoStreamingState","abstract":"<p>Enum for each type of video streaming protocol, used in VideoStreamingFormat</p>"},"Type%20Definitions.html#/c:SDLVoiceCommand.h@T@SDLVoiceCommandSelectionHandler":{"name":"SDLVoiceCommandSelectionHandler","abstract":"<p>The handler that will be called when the command is activated</p>"},"Type%20Definitions.html#/c:SDLVrCapabilities.h@T@SDLVRCapabilities":{"name":"SDLVRCapabilities","abstract":"<p>The VR capabilities of the connected SDL platform. Used in RegisterAppInterfaceResponse.</p>"},"Type%20Definitions.html#/c:SDLWarningLightStatus.h@T@SDLWarningLightStatus":{"name":"SDLWarningLightStatus","abstract":"<p>Reflects the status of a cluster instrument warning light. Used in TireStatus</p>"},"Type%20Definitions.html#/c:SDLWayPointType.h@T@SDLWayPointType":{"name":"SDLWayPointType","abstract":"<p>The type of a navigation waypoint. Used in GetWayPoints.</p>"},"Type%20Definitions.html#/c:SDLWindowType.h@T@SDLWindowType":{"name":"SDLWindowType","abstract":"<p>The type of the window to be created. Main window or widget.</p>"},"Type%20Definitions.html#/c:SDLWiperStatus.h@T@SDLWiperStatus":{"name":"SDLWiperStatus","abstract":"<p>The status of the windshield wipers. Used in retrieving vehicle data.</p>"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveSingleTapForView:atPoint:":{"name":"-touchManager:didReceiveSingleTapForView:atPoint:","abstract":"<p>A single tap was received</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveDoubleTapForView:atPoint:":{"name":"-touchManager:didReceiveDoubleTapForView:atPoint:","abstract":"<p>A double tap was received</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidStartInView:atPoint:":{"name":"-touchManager:panningDidStartInView:atPoint:","abstract":"<p>Panning started</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePanningFromPoint:toPoint:":{"name":"-touchManager:didReceivePanningFromPoint:toPoint:","abstract":"<p>Panning moved between points</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidEndInView:atPoint:":{"name":"-touchManager:panningDidEndInView:atPoint:","abstract":"<p>Panning ended</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningCanceledAtPoint:":{"name":"-touchManager:panningCanceledAtPoint:","abstract":"<p>Panning canceled</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidStartInView:atCenterPoint:":{"name":"-touchManager:pinchDidStartInView:atCenterPoint:","abstract":"<p>Pinch did start</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchAtCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchAtCenterPoint:withScale:","abstract":"<p>@abstract","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchInView:atCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchInView:atCenterPoint:withScale:","abstract":"<p>Pinch moved and changed scale</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidEndInView:atCenterPoint:":{"name":"-touchManager:pinchDidEndInView:atCenterPoint:","abstract":"<p>Pinch did end</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchCanceledAtCenterPoint:":{"name":"-touchManager:pinchCanceledAtCenterPoint:","abstract":"<p>Pinch canceled</p>","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLStreamingVideoDelegate.html#/c:objc(pl)SDLStreamingVideoDelegate(im)videoStreamingSizeDidUpdate:":{"name":"-videoStreamingSizeDidUpdate:","abstract":"<p>Callback notifying of a size update for the video streaming window on the module UI</p>","parent_name":"SDLStreamingVideoDelegate"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)preferredVideoFormatOrderFromHeadUnitPreferredOrder:":{"name":"-preferredVideoFormatOrderFromHeadUnitPreferredOrder:","abstract":"<p>Implement to return a different preferred order of attempted format usage than the head unit&rsquo;s preferred order. In nearly all cases, it&rsquo;s best to simply return the head unit&rsquo;s preferred order, or not implement this method (which does the same thing).</p>","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)resolutionFromHeadUnitPreferredResolution:":{"name":"-resolutionFromHeadUnitPreferredResolution:","abstract":"<p>Implement to return a different resolution to use for video streaming than the head unit&rsquo;s requested resolution. If you return a resolution that the head unit does not like, the manager will fail to start up. In nearly all cases, it&rsquo;s best to simply return the head unit&rsquo;s preferred order, or not implement this method (which does the same thing), and adapt your UI to the head unit&rsquo;s preferred resolution instead.</p>","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(py)audioConnected":{"name":"audioConnected","abstract":"<p>Whether or not the audio byte stream is currently connected</p>","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"<p>Send audio data bytes over the audio byte stream</p>","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLServiceEncryptionDelegate.html#/c:objc(pl)SDLServiceEncryptionDelegate(im)serviceEncryptionUpdatedOnService:encrypted:error:":{"name":"-serviceEncryptionUpdatedOnService:encrypted:error:","abstract":"<p>Called when the encryption service has been.</p>","parent_name":"SDLServiceEncryptionDelegate"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(py)appId":{"name":"appId","abstract":"<p>The app id of the app</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)initializeWithAppId:completionHandler:":{"name":"-initializeWithAppId:completionHandler:","abstract":"<p>Initialize the SDL security library with the app&rsquo;s id and a completion handler</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)stop":{"name":"-stop","abstract":"<p>Stop the security library</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)runHandshakeWithClientData:error:":{"name":"-runHandshakeWithClientData:error:","abstract":"<p>Run the SSL/TLS handshake</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)encryptData:withError:":{"name":"-encryptData:withError:","abstract":"<p>Encrypt data using SSL/TLS</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)decryptData:withError:":{"name":"-decryptData:withError:","abstract":"<p>Decrypt data using SSL/TLS</p>","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(cm)availableMakes":{"name":"+availableMakes","abstract":"<p>The vehicle makes this security library covers</p>","parent_name":"SDLSecurityType"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerDidDisconnect":{"name":"-managerDidDisconnect","abstract":"<p>Called upon a disconnection from the remote system.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)hmiLevel:didChangeToLevel:":{"name":"-hmiLevel:didChangeToLevel:","abstract":"<p>Called when the HMI level state of this application changes on the remote system. This is equivalent to the application&rsquo;s state changes in iOS such as foreground, background, or closed.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)audioStreamingState:didChangeToState:":{"name":"-audioStreamingState:didChangeToState:","abstract":"<p>Called when the audio streaming state of this application changes on the remote system. This refers to when streaming audio is audible to the user.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)videoStreamingState:didChangetoState:":{"name":"-videoStreamingState:didChangetoState:","abstract":"<p>Called when the video streaming state of this application changes. This refers to streaming video for navigation purposes. If you are &ldquo;autostreaming&rdquo; via CarWindow, you should not do anything with this method. Everything should be handled for you automatically.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)systemContext:didChangeToContext:":{"name":"-systemContext:didChangeToContext:","abstract":"<p>Called when the system context of this application changes on the remote system. This refers to whether or not a user-initiated interaction is in progress, and if so, what it is.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerShouldUpdateLifecycleToLanguage:hmiLanguage:":{"name":"-managerShouldUpdateLifecycleToLanguage:hmiLanguage:","abstract":"<p>Called when the lifecycle manager detected a language mismatch. In case of a language mismatch the manager should change the apps registration by updating the lifecycle configuration to the specified language. If the app can support the specified language it should return an Object of SDLLifecycleConfigurationUpdate, otherwise it should return nil to indicate that the language is not supported.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)didReceiveSystemInfo:":{"name":"-didReceiveSystemInfo:","abstract":"<p>A way to determine if this SDL session should continue to be active while connected to the determined system information of the vehicle.</p>","parent_name":"SDLManagerDelegate"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(cm)logger":{"name":"+logger","abstract":"<p>A simple convenience initializer to create the object. This <em>should not</em> start up the logger.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)setupLogger":{"name":"-setupLogger","abstract":"<p>A call to setup the logger in whatever manner it needs to do so.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)logWithLog:formattedLog:":{"name":"-logWithLog:formattedLog:","abstract":"<p>Log a particular log using the model and the formatted log message to the target.</p>","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)teardownLogger":{"name":"-teardownLogger","abstract":"<p>The log target should be torn down. e.g. file handles should be closed</p>","parent_name":"SDLLogTarget"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)userDidSubmitInput:withEvent:":{"name":"-userDidSubmitInput:withEvent:","abstract":"<p>The keyboard session completed with some input.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidAbortWithReason:":{"name":"-keyboardDidAbortWithReason:","abstract":"<p>The keyboard session aborted.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)customKeyboardConfiguration":{"name":"-customKeyboardConfiguration","abstract":"<p>Implement this in order to provide a custom keyboard configuration to just this keyboard. To apply default settings to all keyboards, see SDLScreenManager.keyboardConfiguration</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateAutocompleteWithInput:autoCompleteResultsHandler:":{"name":"-updateAutocompleteWithInput:autoCompleteResultsHandler:","abstract":"<p>Implement this if you wish to updated the KeyboardProperties.autoCompleteList as the user updates their input. This is called upon a KEYPRESS event.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateCharacterSetWithInput:completionHandler:":{"name":"-updateCharacterSetWithInput:completionHandler:","abstract":"<p>Implement this if you wish to update the limitedCharacterSet as the user updates their input. This is called upon a KEYPRESS event.</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidSendEvent:text:":{"name":"-keyboardDidSendEvent:text:","abstract":"<p>Implement this to be notified of all events occurring on the keyboard</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidUpdateInputMask:":{"name":"-keyboardDidUpdateInputMask:","abstract":"<p>Implement this to be notified of input key mask update (whether or not the user has changed the input to be hidden, like passwords)</p>","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didSelectChoice:withSource:atRowIndex:":{"name":"-choiceSet:didSelectChoice:withSource:atRowIndex:","abstract":"<p>Delegate method called after a choice set item is selected</p>","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didReceiveError:":{"name":"-choiceSet:didReceiveError:","abstract":"<p>Delegate method called on an error</p>","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:fileDidFinishPlaying:successfully:":{"name":"-audioStreamManager:fileDidFinishPlaying:successfully:","abstract":"<p>Called when a file from the SDLAudioStreamManager finishes playing</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForFile:error:":{"name":"-audioStreamManager:errorDidOccurForFile:error:","abstract":"<p>Called when a file from the SDLAudioStreamManager could not play</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:dataBufferDidFinishPlayingSuccessfully:":{"name":"-audioStreamManager:dataBufferDidFinishPlayingSuccessfully:","abstract":"<p>Called when a data buffer from the SDLAudioStreamManager finishes playing</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForDataBuffer:":{"name":"-audioStreamManager:errorDidOccurForDataBuffer:","abstract":"<p>Called when a data buffer from the SDLAudioStreamManager could not play</p>","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols.html#/c:objc(pl)SDLInt":{"name":"SDLInt","abstract":"<p>A declaration that this NSNumber contains an NSInteger.</p>"},"Protocols.html#/c:objc(pl)SDLUInt":{"name":"SDLUInt","abstract":"<p>A declaration that this NSNumber contains an NSUInteger.</p>"},"Protocols.html#/c:objc(pl)SDLBool":{"name":"SDLBool","abstract":"<p>A declaration that this NSNumber contains a BOOL.</p>"},"Protocols.html#/c:objc(pl)SDLFloat":{"name":"SDLFloat","abstract":"<p>A declaration that this NSNumber contains a float.</p>"},"Protocols/SDLAudioStreamManagerDelegate.html":{"name":"SDLAudioStreamManagerDelegate","abstract":"<p>Delegate for the AudioStreamManager</p>"},"Protocols/SDLChoiceSetDelegate.html":{"name":"SDLChoiceSetDelegate","abstract":"<p>Delegate for the SDLChoiceSet. Contains methods that get called when an action is taken on a choice cell.</p>"},"Protocols/SDLKeyboardDelegate.html":{"name":"SDLKeyboardDelegate","abstract":"<p>They delegate of a keyboard popup allowing customization at runtime of the keyboard.</p>"},"Protocols/SDLLogTarget.html":{"name":"SDLLogTarget","abstract":"<p>A protocol describing a place logs from SDLLogManager are logged to</p>"},"Protocols/SDLManagerDelegate.html":{"name":"SDLManagerDelegate","abstract":"<p>The manager&rsquo;s delegate</p>"},"Protocols/SDLSecurityType.html":{"name":"SDLSecurityType","abstract":"<p>A protocol used by SDL Security libraries.</p>"},"Protocols/SDLServiceEncryptionDelegate.html":{"name":"SDLServiceEncryptionDelegate","abstract":"<p>Delegate for the encryption service.</p>"},"Protocols/SDLStreamingAudioManagerType.html":{"name":"SDLStreamingAudioManagerType","abstract":"<p>Streaming audio manager</p>"},"Protocols/SDLStreamingMediaManagerDataSource.html":{"name":"SDLStreamingMediaManagerDataSource","abstract":"<p>A data source for the streaming manager&rsquo;s preferred resolutions and preferred formats.</p>"},"Protocols/SDLStreamingVideoDelegate.html":{"name":"SDLStreamingVideoDelegate","abstract":"<p>A delegate method about changes to streaming video for streaming video apps</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/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeForceOn":{"name":"SDLDynamicMenuUpdatesModeForceOn","abstract":"<p>Forces on compatibility mode. This will force the menu manager to delete and re-add each menu item for every menu update. This mode is generally not advised due to performance issues.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeForceOff":{"name":"SDLDynamicMenuUpdatesModeForceOff","abstract":"<p>This mode forces the menu manager to always dynamically update menu items for each menu update. This will provide the best performance but may cause ordering issues on some SYNC Gen 3 head units.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeOnWithCompatibility":{"name":"SDLDynamicMenuUpdatesModeOnWithCompatibility","abstract":"<p>This mode checks whether the phone is connected to a SYNC Gen 3 head unit, which has known menu ordering issues. If it is, it will always delete and re-add every menu item, if not, it will dynamically update the menus.</p>","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeSimple":{"name":"SDLLogFormatTypeSimple","abstract":"<p>A bare-bones log format: <code>09:52:07:324 🔹 (SDL)Protocol – a random test i guess</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDefault":{"name":"SDLLogFormatTypeDefault","abstract":"<p>A middle detail default log format: <code>09:52:07:324 🔹 (SDL)Protocol:SDLV2ProtocolHeader:25 – Some log message</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDetailed":{"name":"SDLLogFormatTypeDetailed","abstract":"<p>A very detailed log format: <code>09:52:07:324 🔹 DEBUG com.apple.main-thread:(SDL)Protocol:[SDLV2ProtocolHeader parse:]:74 – Some log message</code></p>","parent_name":"SDLLogFormatType"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDefault":{"name":"SDLLogLevelDefault","abstract":"<p>This is used to describe that a &ldquo;specific&rdquo; logging will instead use the global log level, for example, a module may use the global log level instead of its own by specifying this level.</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelOff":{"name":"SDLLogLevelOff","abstract":"<p>This is used to describe a level that involves absolutely no logs being output.</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelError":{"name":"SDLLogLevelError","abstract":"<p>Only error level logs will be output</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelWarning":{"name":"SDLLogLevelWarning","abstract":"<p>Both error and warning level logs will be output</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDebug":{"name":"SDLLogLevelDebug","abstract":"<p>Error, warning, and debug level logs will be output. This level will never be output in RELEASE environments</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelVerbose":{"name":"SDLLogLevelVerbose","abstract":"<p>All level logs will be output. This level will never be output in RELEASE environments</p>","parent_name":"SDLLogLevel"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagError":{"name":"SDLLogFlagError","abstract":"<p>Error level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagWarning":{"name":"SDLLogFlagWarning","abstract":"<p>Warning level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagDebug":{"name":"SDLLogFlagDebug","abstract":"<p>Debug level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagVerbose":{"name":"SDLLogFlagVerbose","abstract":"<p>Verbose level logging</p>","parent_name":"SDLLogFlag"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionTransmit":{"name":"SDLLogBytesDirectionTransmit","abstract":"<p>Transmit from the app</p>","parent_name":"SDLLogBytesDirection"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionReceive":{"name":"SDLLogBytesDirectionReceive","abstract":"<p>Receive from the module</p>","parent_name":"SDLLogBytesDirection"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeNever":{"name":"SDLLockScreenConfigurationDisplayModeNever","abstract":"<p>The lock screen should never be shown. This should almost always mean that you will build your own lock screen.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeRequiredOnly":{"name":"SDLLockScreenConfigurationDisplayModeRequiredOnly","abstract":"<p>The lock screen should only be shown when it is required by the head unit.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeOptionalOrRequired":{"name":"SDLLockScreenConfigurationDisplayModeOptionalOrRequired","abstract":"<p>The lock screen should be shown when required by the head unit or when the head unit says that its optional, but <em>not</em> in other cases, such as before the user has interacted with your app on the head unit.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLLockScreenConfigurationDisplayMode.html#/c:@E@SDLLockScreenConfigurationDisplayMode@SDLLockScreenConfigurationDisplayModeAlways":{"name":"SDLLockScreenConfigurationDisplayModeAlways","abstract":"<p>The lock screen should always be shown after connection.</p>","parent_name":"SDLLockScreenConfigurationDisplayMode"},"Enums/SDLSecondaryTransports.html#/c:@E@SDLSecondaryTransports@SDLSecondaryTransportsNone":{"name":"SDLSecondaryTransportsNone","abstract":"<p>No secondary transport</p>","parent_name":"SDLSecondaryTransports"},"Enums/SDLSecondaryTransports.html#/c:@E@SDLSecondaryTransports@SDLSecondaryTransportsTCP":{"name":"SDLSecondaryTransportsTCP","abstract":"<p>TCP as secondary transport</p>","parent_name":"SDLSecondaryTransports"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNotConnected":{"name":"SDLAudioStreamManagerErrorNotConnected","abstract":"<p>The audio stream is not currently connected</p>","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNoQueuedAudio":{"name":"SDLAudioStreamManagerErrorNoQueuedAudio","abstract":"<p>Attempted to play but there&rsquo;s no audio in the queue</p>","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLCacheFileManagerError.html#/c:@E@SDLCacheFileManagerError@SDLCacheManagerErrorUpdateIconArchiveFileFailure":{"name":"SDLCacheManagerErrorUpdateIconArchiveFileFailure","abstract":"<p>Failed to update archive file</p>","parent_name":"SDLCacheFileManagerError"},"Enums/SDLRPCStoreError.html#/c:@E@SDLRPCStoreError@SDLRPCStoreErrorGetInvalidObject":{"name":"SDLRPCStoreErrorGetInvalidObject","abstract":"<p>In dictionary stored value with unexpected type</p>","parent_name":"SDLRPCStoreError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorUnknown":{"name":"SDLTransportErrorUnknown","abstract":"<p>Connection cannot be established due to a reason not listed here.</p>","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionRefused":{"name":"SDLTransportErrorConnectionRefused","abstract":"<p>TCP connection is refused.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionTimedOut":{"name":"SDLTransportErrorConnectionTimedOut","abstract":"<p>TCP connection cannot be established within given time.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorNetworkDown":{"name":"SDLTransportErrorNetworkDown","abstract":"<p>TCP connection cannot be established since network is down.","parent_name":"SDLTransportError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities":{"name":"SDLSystemCapabilityManagerErrorModuleDoesNotSupportSystemCapabilities","abstract":"<p>The connected head unit does not support any system capabilities</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorHMINone":{"name":"SDLSystemCapabilityManagerErrorHMINone","abstract":"<p>You must be in an HMI Level other than NONE to request or subscribe to capabilities other than DISPLAYS</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays":{"name":"SDLSystemCapabilityManagerErrorCannotUpdateTypeDisplays","abstract":"<p>You may not update the system capability type DISPLAYS because it is always subscribed</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLSystemCapabilityManagerError.html#/c:@E@SDLSystemCapabilityManagerError@SDLSystemCapabilityManagerErrorUnknownType":{"name":"SDLSystemCapabilityManagerErrorUnknownType","abstract":"<p>The module sent an unknown system capability type</p>","parent_name":"SDLSystemCapabilityManagerError"},"Enums/SDLAlertManagerError.html#/c:@E@SDLAlertManagerError@SDLAlertManagerPresentationError":{"name":"SDLAlertManagerPresentationError","abstract":"<p>There was an error presenting the alert</p>","parent_name":"SDLAlertManagerError"},"Enums/SDLAlertManagerError.html#/c:@E@SDLAlertManagerError@SDLAlertManagerInvalidDataError":{"name":"SDLAlertManagerInvalidDataError","abstract":"<p>The alert data is invalid</p>","parent_name":"SDLAlertManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorNeededChoicesUnavailable":{"name":"SDLChoiceSetManagerErrorNeededChoicesUnavailable","abstract":"<p>Some needed choices for presentation are not available</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/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorCancelled":{"name":"SDLChoiceSetManagerErrorCancelled","abstract":"<p>An operation was cancelled and may or may not have succeeded</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorNoIdsAvailable":{"name":"SDLChoiceSetManagerErrorNoIdsAvailable","abstract":"<p>No new choices could be loaded because the maximum number of choices are loaded (65535)</p>","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorRPCsFailed":{"name":"SDLMenuManagerErrorRPCsFailed","abstract":"<p>Sending menu-related RPCs returned an error from the remote system</p>","parent_name":"SDLMenuManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorPendingUpdateSuperseded":{"name":"SDLMenuManagerErrorPendingUpdateSuperseded","abstract":"<p>A pending menu update was superseded by a later update and did not run</p>","parent_name":"SDLMenuManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorOperationCancelled":{"name":"SDLMenuManagerErrorOperationCancelled","abstract":"<p>A pending or in-progress menu update was cancelled</p>","parent_name":"SDLMenuManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorConfigurationUpdateLayoutNotSupported":{"name":"SDLMenuManagerErrorConfigurationUpdateLayoutNotSupported","abstract":"<p>A configuration update failed because the configuration is not supported</p>","parent_name":"SDLMenuManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorConfigurationUpdateFailed":{"name":"SDLMenuManagerErrorConfigurationUpdateFailed","abstract":"<p>A configuration update failed</p>","parent_name":"SDLMenuManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorOpenMenuFailed":{"name":"SDLMenuManagerErrorOpenMenuFailed","abstract":"<p>An open menu operation failed</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/SDLTextAndGraphicManagerError.html#/c:@E@SDLTextAndGraphicManagerError@SDLTextAndGraphicManagerErrorCurrentlyBatching":{"name":"SDLTextAndGraphicManagerErrorCurrentlyBatching","abstract":"<p>The manager is currently batching updates so the update will not yet be sent and the handler will not be called</p>","parent_name":"SDLTextAndGraphicManagerError"},"Enums/SDLTextAndGraphicManagerError.html#/c:@E@SDLTextAndGraphicManagerError@SDLTextAndGraphicManagerErrorNothingToUpdate":{"name":"SDLTextAndGraphicManagerErrorNothingToUpdate","abstract":"<p>The manager could find nothing to update</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/SDLEncryptionLifecycleManagerError.html#/c:@E@SDLEncryptionLifecycleManagerError@SDLEncryptionLifecycleManagerErrorUnknown":{"name":"SDLEncryptionLifecycleManagerErrorUnknown","abstract":"<p>An unknown error occurred</p>","parent_name":"SDLEncryptionLifecycleManagerError"},"Enums/SDLSystemError.html#/c:@E@SDLSystemError@SDLSystemErrorFailedToCreateObject":{"name":"SDLSystemErrorFailedToCreateObject","abstract":"<p>iOS failed to create an object</p>","parent_name":"SDLSystemError"},"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/SDLSystemError.html":{"name":"SDLSystemError","abstract":"<p>Error associated with the underlying operating system</p>"},"Enums/SDLEncryptionLifecycleManagerError.html":{"name":"SDLEncryptionLifecycleManagerError","abstract":"<p>Errors associated with the SDLManager class.</p>"},"Enums/SDLManagerError.html":{"name":"SDLManagerError","abstract":"<p>Errors associated with the SDLManager class.</p>"},"Enums/SDLFileManagerError.html":{"name":"SDLFileManagerError","abstract":"<p>Errors associated with the SDLFileManager class.</p>"},"Enums/SDLTextAndGraphicManagerError.html":{"name":"SDLTextAndGraphicManagerError","abstract":"<p>Errors associated with the ScreenManager class</p>"},"Enums/SDLSoftButtonManagerError.html":{"name":"SDLSoftButtonManagerError","abstract":"<p>Errors associated with the Soft Button Manager class</p>"},"Enums/SDLSubscribeButtonManagerError.html":{"name":"SDLSubscribeButtonManagerError","abstract":"<p>Errors associated with the Subscribe Button Manager class</p>"},"Enums/SDLMenuManagerError.html":{"name":"SDLMenuManagerError","abstract":"<p>Errors associated with the Menu Manager class</p>"},"Enums/SDLChoiceSetManagerError.html":{"name":"SDLChoiceSetManagerError","abstract":"<p>Errors associated with Choice Set Manager class</p>"},"Enums/SDLAlertManagerError.html":{"name":"SDLAlertManagerError","abstract":"<p>Errors associated with Alert Manager class</p>"},"Enums/SDLSystemCapabilityManagerError.html":{"name":"SDLSystemCapabilityManagerError","abstract":"<p>Errors associated with the system capability manager</p>"},"Enums/SDLTransportError.html":{"name":"SDLTransportError","abstract":"<p>Errors associated with transport.</p>"},"Enums/SDLRPCStoreError.html":{"name":"SDLRPCStoreError","abstract":"<p>Errors associated with store.</p>"},"Enums/SDLCacheFileManagerError.html":{"name":"SDLCacheFileManagerError","abstract":"<p>Errors related to the cache file manager</p>"},"Enums/SDLAudioStreamManagerError.html":{"name":"SDLAudioStreamManagerError","abstract":"<p>Errors related to the audio stream manager</p>"},"Enums/SDLSecondaryTransports.html":{"name":"SDLSecondaryTransports","abstract":"<p>List of secondary transports</p>"},"Enums/SDLLockScreenConfigurationDisplayMode.html":{"name":"SDLLockScreenConfigurationDisplayMode","abstract":"<p>Describes when the lock screen should be shown.</p>"},"Enums/SDLLogBytesDirection.html":{"name":"SDLLogBytesDirection","abstract":"<p>An enum describing log bytes direction</p>"},"Enums/SDLLogFlag.html":{"name":"SDLLogFlag","abstract":"<p>Flags used for SDLLogLevel to provide correct enum values. This is purely for internal use.</p>"},"Enums/SDLLogLevel.html":{"name":"SDLLogLevel","abstract":"<p>An enum describing a level of logging.</p>"},"Enums/SDLLogFormatType.html":{"name":"SDLLogFormatType","abstract":"<p>The output format of logs; how they will appear when printed out into a string.</p>"},"Enums/SDLDynamicMenuUpdatesMode.html":{"name":"SDLDynamicMenuUpdatesMode","abstract":"<p>Dynamic Menu Manager Mode</p>"},"Enums/SDLPermissionGroupType.html":{"name":"SDLPermissionGroupType","abstract":"<p>A permission group type which will be used to tell the system what type of changes you want to be notified about for the group.</p>"},"Enums/SDLPermissionGroupStatus.html":{"name":"SDLPermissionGroupStatus","abstract":"<p>The status of the group of RPCs permissions.</p>"},"Enums/SDLPredefinedWindows.html":{"name":"SDLPredefinedWindows","abstract":"<p>Specifies which windows and IDs are predefined and pre-created on behalf of the app. The default window is always available and represents the app window on the main display. It&rsquo;s an equivalent to today&rsquo;s app window. For backward compatibility, this will ensure the app always has at least the default window on the main display. The app can choose to use this predefined enum element to specifically address app&rsquo;s main window or to duplicate window content. It is not possible to duplicate another window to the default window. The primary widget is a special widget, that can be associated with a service type, which is used by the HMI whenever a single widget needs to represent the whole app. The primary widget should be named as the app and can be pre-created by the HMI.</p>"},"Enums/SDLFrameType.html":{"name":"SDLFrameType","abstract":"<p>The data packet&rsquo;s header and payload combination.</p>"},"Enums/SDLServiceType.html":{"name":"SDLServiceType","abstract":"<p>The data packet&rsquo;s format and priority.</p>"},"Enums/SDLFrameInfo.html":{"name":"SDLFrameInfo","abstract":"<p>The data packet&rsquo;s available data.</p>"},"Enums/SDLRPCMessageType.html":{"name":"SDLRPCMessageType","abstract":"<p>The type of RPC message</p>"},"Enums/SDLCarWindowRenderingType.html":{"name":"SDLCarWindowRenderingType","abstract":"<p>The type of rendering that CarWindow will perform. Depending on your app, you may need to try different ones for best performance</p>"},"Enums/SDLStreamingEncryptionFlag.html":{"name":"SDLStreamingEncryptionFlag","abstract":"<p>A flag determining how video and audio streaming should be encrypted</p>"},"Enums/SDLTouchIdentifier.html":{"name":"SDLTouchIdentifier","abstract":"<p>Identifies finger touch</p>"},"Constants.html#/c:@SDLAmbientLightStatusNight":{"name":"SDLAmbientLightStatusNight","abstract":"<p>Represents a &ldquo;night&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight1":{"name":"SDLAmbientLightStatusTwilight1","abstract":"<p>Represents a &ldquo;twilight 1&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight2":{"name":"SDLAmbientLightStatusTwilight2","abstract":"<p>Represents a &ldquo;twilight 2&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight3":{"name":"SDLAmbientLightStatusTwilight3","abstract":"<p>Represents a &ldquo;twilight 3&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusTwilight4":{"name":"SDLAmbientLightStatusTwilight4","abstract":"<p>Represents a &ldquo;twilight 4&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusDay":{"name":"SDLAmbientLightStatusDay","abstract":"<p>Represents a &ldquo;day&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusUnknown":{"name":"SDLAmbientLightStatusUnknown","abstract":"<p>Represents an &ldquo;unknown&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAmbientLightStatusInvalid":{"name":"SDLAmbientLightStatusInvalid","abstract":"<p>Represents a &ldquo;invalid&rdquo; ambient light status</p>"},"Constants.html#/c:@SDLAppCapabilityTypeVideoStreaming":{"name":"SDLAppCapabilityTypeVideoStreaming","abstract":"<p>Video streaming app capability. Used internally.</p>"},"Constants.html#/c:@SDLAppHMITypeDefault":{"name":"SDLAppHMITypeDefault","abstract":"<p>The App will have default rights.</p>"},"Constants.html#/c:@SDLAppHMITypeCommunication":{"name":"SDLAppHMITypeCommunication","abstract":"<p>Communication type of App</p>"},"Constants.html#/c:@SDLAppHMITypeMedia":{"name":"SDLAppHMITypeMedia","abstract":"<p>App dealing with Media</p>"},"Constants.html#/c:@SDLAppHMITypeMessaging":{"name":"SDLAppHMITypeMessaging","abstract":"<p>Messaging App</p>"},"Constants.html#/c:@SDLAppHMITypeNavigation":{"name":"SDLAppHMITypeNavigation","abstract":"<p>Navigation App</p>"},"Constants.html#/c:@SDLAppHMITypeInformation":{"name":"SDLAppHMITypeInformation","abstract":"<p>Information App</p>"},"Constants.html#/c:@SDLAppHMITypeSocial":{"name":"SDLAppHMITypeSocial","abstract":"<p>App dealing with social media</p>"},"Constants.html#/c:@SDLAppHMITypeProjection":{"name":"SDLAppHMITypeProjection","abstract":"<p>App dealing with Mobile Projection applications</p>"},"Constants.html#/c:@SDLAppHMITypeBackgroundProcess":{"name":"SDLAppHMITypeBackgroundProcess","abstract":"<p>App designed for use in the background</p>"},"Constants.html#/c:@SDLAppHMITypeTesting":{"name":"SDLAppHMITypeTesting","abstract":"<p>App only for Testing purposes</p>"},"Constants.html#/c:@SDLAppHMITypeSystem":{"name":"SDLAppHMITypeSystem","abstract":"<p>System App</p>"},"Constants.html#/c:@SDLAppHMITypeRemoteControl":{"name":"SDLAppHMITypeRemoteControl","abstract":"<p>Remote control</p>"},"Constants.html#/c:@SDLAppHMITypeWebView":{"name":"SDLAppHMITypeWebView","abstract":"<p>WebEngine Projection mode</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonIgnitionOff":{"name":"SDLAppInterfaceUnregisteredReasonIgnitionOff","abstract":"<p>Vehicle ignition turned off.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonBluetoothOff":{"name":"SDLAppInterfaceUnregisteredReasonBluetoothOff","abstract":"<p>Bluetooth was turned off, causing termination of a necessary Bluetooth connection.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUSBDisconnected":{"name":"SDLAppInterfaceUnregisteredReasonUSBDisconnected","abstract":"<p>USB was disconnected, causing termination of a necessary iAP connection.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel":{"name":"SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel","abstract":"<p>Application attempted SmartDeviceLink RPC request while HMILevel = NONE. App must have HMILevel other than NONE to issue RPC requests or get notifications or RPC responses.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonTooManyRequests":{"name":"SDLAppInterfaceUnregisteredReasonTooManyRequests","abstract":"<p>Either too many &ndash; or too many per unit of time &ndash; requests were made by the application.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonDriverDistractionViolation":{"name":"SDLAppInterfaceUnregisteredReasonDriverDistractionViolation","abstract":"<p>The application has issued requests which cause driver distraction rules to be violated.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonLanguageChange":{"name":"SDLAppInterfaceUnregisteredReasonLanguageChange","abstract":"<p>The user performed a language change on the SDL platform, causing the application to need to be reregistered for the new language.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonMasterReset":{"name":"SDLAppInterfaceUnregisteredReasonMasterReset","abstract":"<p>The user performed a MASTER RESET on the SDL platform, causing removal of a necessary Bluetooth pairing.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonFactoryDefaults":{"name":"SDLAppInterfaceUnregisteredReasonFactoryDefaults","abstract":"<p>The user restored settings to FACTORY DEFAULTS on the SDL platform.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonAppUnauthorized":{"name":"SDLAppInterfaceUnregisteredReasonAppUnauthorized","abstract":"<p>The app is not being authorized to be connected to SDL.</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonProtocolViolation":{"name":"SDLAppInterfaceUnregisteredReasonProtocolViolation","abstract":"<p>The app could not register due to a protocol violation</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource":{"name":"SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource","abstract":"<p>The HMI resource is unsupported</p>"},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonResourceConstraint":{"name":"SDLAppInterfaceUnregisteredReasonResourceConstraint","abstract":"<p>The application is unregistered due to hardware resource constraints. The system will shortly close the application to free up hardware resources.</p>"},"Constants.html#/c:@SDLAppServiceTypeMedia":{"name":"SDLAppServiceTypeMedia","abstract":"<p>The app will have a service type of media.</p>"},"Constants.html#/c:@SDLAppServiceTypeWeather":{"name":"SDLAppServiceTypeWeather","abstract":"<p>The app will have a service type of weather.</p>"},"Constants.html#/c:@SDLAppServiceTypeNavigation":{"name":"SDLAppServiceTypeNavigation","abstract":"<p>The app will have a service type of navigation.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorPlayPause":{"name":"SDLAudioStreamingIndicatorPlayPause","abstract":"<p>Default playback indicator."},"Constants.html#/c:@SDLAudioStreamingIndicatorPlay":{"name":"SDLAudioStreamingIndicatorPlay","abstract":"<p>Indicates that a button press of the Play/Pause button starts the audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorPause":{"name":"SDLAudioStreamingIndicatorPause","abstract":"<p>Indicates that a button press of the Play/Pause button pauses the current audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingIndicatorStop":{"name":"SDLAudioStreamingIndicatorStop","abstract":"<p>Indicates that a button press of the Play/Pause button stops the current audio playback.</p>"},"Constants.html#/c:@SDLAudioStreamingStateAudible":{"name":"SDLAudioStreamingStateAudible","abstract":"<p>Currently streaming audio, if any, is audible to user.</p>"},"Constants.html#/c:@SDLAudioStreamingStateAttenuated":{"name":"SDLAudioStreamingStateAttenuated","abstract":"<p>Some kind of audio mixing is taking place. Currently streaming audio, if any, is audible to the user at a lowered volume.</p>"},"Constants.html#/c:@SDLAudioStreamingStateNotAudible":{"name":"SDLAudioStreamingStateNotAudible","abstract":"<p>Currently streaming audio, if any, is not audible to user. made via VR session.</p>"},"Constants.html#/c:@SDLAudioTypePCM":{"name":"SDLAudioTypePCM","abstract":"<p>PCM raw audio</p>"},"Constants.html#/c:@SDLBitsPerSample8Bit":{"name":"SDLBitsPerSample8Bit","abstract":"<p>8 bits per sample</p>"},"Constants.html#/c:@SDLBitsPerSample16Bit":{"name":"SDLBitsPerSample16Bit","abstract":"<p>16 bits per sample</p>"},"Constants.html#/c:@SDLButtonEventModeButtonUp":{"name":"SDLButtonEventModeButtonUp","abstract":"<p>The button was released</p>"},"Constants.html#/c:@SDLButtonEventModeButtonDown":{"name":"SDLButtonEventModeButtonDown","abstract":"<p>The button was depressed</p>"},"Constants.html#/c:@SDLButtonNameOk":{"name":"SDLButtonNameOk","abstract":"<p>Represents the button usually labeled &ldquo;OK&rdquo;. A typical use of this button is for the user to press it to make a selection. Prior to SDL Core 5.0 (iOS Proxy v.6.1), Ok was used for both &ldquo;OK&rdquo; buttons <em>AND</em> PlayPause. In 5.0, PlayPause was introduced to reduce confusion, and you should use the one you intend for your use case (usually PlayPause). Until the next proxy breaking change, however, subscribing to this button name will continue to subscribe you to PlayPause so that your code does not break. That means that if you subscribe to both Ok and PlayPause, you will receive duplicate notifications.</p>"},"Constants.html#/c:@SDLButtonNamePlayPause":{"name":"SDLButtonNamePlayPause","abstract":"<p>Represents the play/pause button for media apps. Replaces &ldquo;OK&rdquo; on sub-5.0 head units, compliments it on 5.0 head units and later.</p>"},"Constants.html#/c:@SDLButtonNameSeekLeft":{"name":"SDLButtonNameSeekLeft","abstract":"<p>Represents the seek-left button. A typical use of this button is for the user to scroll to the left through menu choices one menu item per press.</p>"},"Constants.html#/c:@SDLButtonNameSeekRight":{"name":"SDLButtonNameSeekRight","abstract":"<p>Represents the seek-right button. A typical use of this button is for the user to scroll to the right through menu choices one menu item per press.</p>"},"Constants.html#/c:@SDLButtonNameTuneUp":{"name":"SDLButtonNameTuneUp","abstract":"<p>Represents a turn of the tuner knob in the clockwise direction one tick.</p>"},"Constants.html#/c:@SDLButtonNameTuneDown":{"name":"SDLButtonNameTuneDown","abstract":"<p>Represents a turn of the tuner knob in the counter-clockwise direction one tick.</p>"},"Constants.html#/c:@SDLButtonNamePreset0":{"name":"SDLButtonNamePreset0","abstract":"<p>Represents the preset 0 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset1":{"name":"SDLButtonNamePreset1","abstract":"<p>Represents the preset 1 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset2":{"name":"SDLButtonNamePreset2","abstract":"<p>Represents the preset 2 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset3":{"name":"SDLButtonNamePreset3","abstract":"<p>Represents the preset 3 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset4":{"name":"SDLButtonNamePreset4","abstract":"<p>Represents the preset 4 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset5":{"name":"SDLButtonNamePreset5","abstract":"<p>Represents the preset 5 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset6":{"name":"SDLButtonNamePreset6","abstract":"<p>Represents the preset 6 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset7":{"name":"SDLButtonNamePreset7","abstract":"<p>Represents the preset 7 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset8":{"name":"SDLButtonNamePreset8","abstract":"<p>Represents the preset 8 button.</p>"},"Constants.html#/c:@SDLButtonNamePreset9":{"name":"SDLButtonNamePreset9","abstract":"<p>Represents the preset 9 button.</p>"},"Constants.html#/c:@SDLButtonNameCustomButton":{"name":"SDLButtonNameCustomButton","abstract":"<p>Represents the Custom button.</p>"},"Constants.html#/c:@SDLButtonNameSearch":{"name":"SDLButtonNameSearch","abstract":"<p>Represents the SEARCH button.</p>"},"Constants.html#/c:@SDLButtonNameACMax":{"name":"SDLButtonNameACMax","abstract":"<p>Represents AC max button *</p>"},"Constants.html#/c:@SDLButtonNameAC":{"name":"SDLButtonNameAC","abstract":"<p>Represents AC button *</p>"},"Constants.html#/c:@SDLButtonNameRecirculate":{"name":"SDLButtonNameRecirculate","abstract":"<p>Represents a Recirculate button</p>"},"Constants.html#/c:@SDLButtonNameFanUp":{"name":"SDLButtonNameFanUp","abstract":"<p>Represents a Fan up button</p>"},"Constants.html#/c:@SDLButtonNameFanDown":{"name":"SDLButtonNameFanDown","abstract":"<p>Represents a fan down button</p>"},"Constants.html#/c:@SDLButtonNameTempUp":{"name":"SDLButtonNameTempUp","abstract":"<p>Represents a temperature up button</p>"},"Constants.html#/c:@SDLButtonNameTempDown":{"name":"SDLButtonNameTempDown","abstract":"<p>Represents a temperature down button</p>"},"Constants.html#/c:@SDLButtonNameDefrostMax":{"name":"SDLButtonNameDefrostMax","abstract":"<p>Represents a Defrost max button.</p>"},"Constants.html#/c:@SDLButtonNameDefrost":{"name":"SDLButtonNameDefrost","abstract":"<p>Represents a Defrost button.</p>"},"Constants.html#/c:@SDLButtonNameDefrostRear":{"name":"SDLButtonNameDefrostRear","abstract":"<p>Represents a Defrost rear button.</p>"},"Constants.html#/c:@SDLButtonNameUpperVent":{"name":"SDLButtonNameUpperVent","abstract":"<p>Represents a Upper Vent button.</p>"},"Constants.html#/c:@SDLButtonNameLowerVent":{"name":"SDLButtonNameLowerVent","abstract":"<p>Represents a Lower vent button.</p>"},"Constants.html#/c:@SDLButtonNameVolumeUp":{"name":"SDLButtonNameVolumeUp","abstract":"<p>Represents a volume up button.</p>"},"Constants.html#/c:@SDLButtonNameVolumeDown":{"name":"SDLButtonNameVolumeDown","abstract":"<p>Represents a volume down button.</p>"},"Constants.html#/c:@SDLButtonNameEject":{"name":"SDLButtonNameEject","abstract":"<p>Represents a Eject Button.</p>"},"Constants.html#/c:@SDLButtonNameSource":{"name":"SDLButtonNameSource","abstract":"<p>Represents a Source button.</p>"},"Constants.html#/c:@SDLButtonNameShuffle":{"name":"SDLButtonNameShuffle","abstract":"<p>Represents a SHUFFLE button.</p>"},"Constants.html#/c:@SDLButtonNameRepeat":{"name":"SDLButtonNameRepeat","abstract":"<p>Represents a Repeat button.</p>"},"Constants.html#/c:@SDLButtonNameNavCenterLocation":{"name":"SDLButtonNameNavCenterLocation","abstract":"<p>Represents a Navigate to center button.</p>"},"Constants.html#/c:@SDLButtonNameNavZoomIn":{"name":"SDLButtonNameNavZoomIn","abstract":"<p>Represents a Zoom in button.</p>"},"Constants.html#/c:@SDLButtonNameNavZoomOut":{"name":"SDLButtonNameNavZoomOut","abstract":"<p>Represents a Zoom out button.</p>"},"Constants.html#/c:@SDLButtonNameNavPanUp":{"name":"SDLButtonNameNavPanUp","abstract":"<p>Represents a Pan up button</p>"},"Constants.html#/c:@SDLButtonNameNavPanUpRight":{"name":"SDLButtonNameNavPanUpRight","abstract":"<p>Represents a Pan up/right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanRight":{"name":"SDLButtonNameNavPanRight","abstract":"<p>Represents a Pan right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDownRight":{"name":"SDLButtonNameNavPanDownRight","abstract":"<p>Represents a Pan down/right button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDown":{"name":"SDLButtonNameNavPanDown","abstract":"<p>Represents a Pan down button</p>"},"Constants.html#/c:@SDLButtonNameNavPanDownLeft":{"name":"SDLButtonNameNavPanDownLeft","abstract":"<p>Represents a Pan down left button</p>"},"Constants.html#/c:@SDLButtonNameNavPanLeft":{"name":"SDLButtonNameNavPanLeft","abstract":"<p>Represents a Pan left button</p>"},"Constants.html#/c:@SDLButtonNameNavPanUpLeft":{"name":"SDLButtonNameNavPanUpLeft","abstract":"<p>Represents a Pan up left button</p>"},"Constants.html#/c:@SDLButtonNameNavTiltToggle":{"name":"SDLButtonNameNavTiltToggle","abstract":"<p>Represents a Tilt button. If supported, this toggles between a top-down view and an angled/3D view. If your app supports different, but substantially similar options, then you may implement those. If you don&rsquo;t implement these or similar options, do not subscribe to this button.</p>"},"Constants.html#/c:@SDLButtonNameNavRotateClockwise":{"name":"SDLButtonNameNavRotateClockwise","abstract":"<p>Represents a Rotate clockwise button</p>"},"Constants.html#/c:@SDLButtonNameNavRotateCounterClockwise":{"name":"SDLButtonNameNavRotateCounterClockwise","abstract":"<p>Represents a Rotate counterclockwise button</p>"},"Constants.html#/c:@SDLButtonNameNavHeadingToggle":{"name":"SDLButtonNameNavHeadingToggle","abstract":"<p>Represents a Heading toggle button. If supported, this toggles between locking the orientation to north or to the vehicle&rsquo;s heading. If your app supports different, but substantially similar options, then you may implement those. If you don&rsquo;t implement these or similar options, do not subscribe to this button.</p>"},"Constants.html#/c:@SDLButtonPressModeLong":{"name":"SDLButtonPressModeLong","abstract":"<p>A button was released, after it was pressed for a long time. Actual timing is defined by the head unit and may vary.</p>"},"Constants.html#/c:@SDLButtonPressModeShort":{"name":"SDLButtonPressModeShort","abstract":"<p>A button was released, after it was pressed for a short time. Actual timing is defined by the head unit and may vary.</p>"},"Constants.html#/c:@SDLCapacityUnitKilograms":{"name":"SDLCapacityUnitKilograms","abstract":"<p>A capacity in kilogram units</p>"},"Constants.html#/c:@SDLCapacityUnitKilowatthours":{"name":"SDLCapacityUnitKilowatthours","abstract":"<p>A capacity in Kilowatt Hour units</p>"},"Constants.html#/c:@SDLCapacityUnitLiters":{"name":"SDLCapacityUnitLiters","abstract":"<p>A capacity in Liter units</p>"},"Constants.html#/c:@SDLCarModeStatusNormal":{"name":"SDLCarModeStatusNormal","abstract":"<p>Provides carmode NORMAL to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusFactory":{"name":"SDLCarModeStatusFactory","abstract":"<p>Provides carmode FACTORY to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusTransport":{"name":"SDLCarModeStatusTransport","abstract":"<p>Provides carmode TRANSPORT to each module.</p>"},"Constants.html#/c:@SDLCarModeStatusCrash":{"name":"SDLCarModeStatusCrash","abstract":"<p>Provides carmode CRASH to each module.</p>"},"Constants.html#/c:@SDLCharacterSetType2":{"name":"SDLCharacterSetType2","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetType5":{"name":"SDLCharacterSetType5","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetCID1":{"name":"SDLCharacterSetCID1","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetCID2":{"name":"SDLCharacterSetCID2","abstract":"<p>@deprecated"},"Constants.html#/c:@SDLCharacterSetAscii":{"name":"SDLCharacterSetAscii","abstract":"<p>ASCII as defined in <a href=\"https://en.wikipedia.org/wiki/ASCII\">https://en.wikipedia.org/wiki/ASCII</a> as defined in codes 0-127. Non-printable characters such as tabs and back spaces are ignored.</p>"},"Constants.html#/c:@SDLCharacterSetIso88591":{"name":"SDLCharacterSetIso88591","abstract":"<p>Latin-1, as defined in <a href=\"https://en.wikipedia.org/wiki/ISO/IEC_8859-1\">https://en.wikipedia.org/wiki/ISO/IEC_8859-1</a></p>"},"Constants.html#/c:@SDLCharacterSetUtf8":{"name":"SDLCharacterSetUtf8","abstract":"<p>The UTF-8 character set that uses variable bytes per code point. See <a href=\"https://en.wikipedia.org/wiki/UTF-8\">https://en.wikipedia.org/wiki/UTF-8</a> for more details. This is the preferred character set.</p>"},"Constants.html#/c:@SDLCompassDirectionNorth":{"name":"SDLCompassDirectionNorth","abstract":"<p>Direction North</p>"},"Constants.html#/c:@SDLCompassDirectionNorthwest":{"name":"SDLCompassDirectionNorthwest","abstract":"<p>Direction Northwest</p>"},"Constants.html#/c:@SDLCompassDirectionWest":{"name":"SDLCompassDirectionWest","abstract":"<p>Direction West</p>"},"Constants.html#/c:@SDLCompassDirectionSouthwest":{"name":"SDLCompassDirectionSouthwest","abstract":"<p>Direction Southwest</p>"},"Constants.html#/c:@SDLCompassDirectionSouth":{"name":"SDLCompassDirectionSouth","abstract":"<p>Direction South</p>"},"Constants.html#/c:@SDLCompassDirectionSoutheast":{"name":"SDLCompassDirectionSoutheast","abstract":"<p>Direction Southeast</p>"},"Constants.html#/c:@SDLCompassDirectionEast":{"name":"SDLCompassDirectionEast","abstract":"<p>Direction East</p>"},"Constants.html#/c:@SDLCompassDirectionNortheast":{"name":"SDLCompassDirectionNortheast","abstract":"<p>Direction Northeast</p>"},"Constants.html#/c:@SDLComponentVolumeStatusUnknown":{"name":"SDLComponentVolumeStatusUnknown","abstract":"<p>Unknown SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusNormal":{"name":"SDLComponentVolumeStatusNormal","abstract":"<p>Normal SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusLow":{"name":"SDLComponentVolumeStatusLow","abstract":"<p>Low SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusFault":{"name":"SDLComponentVolumeStatusFault","abstract":"<p>Fault SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusAlert":{"name":"SDLComponentVolumeStatusAlert","abstract":"<p>Alert SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLComponentVolumeStatusNotSupported":{"name":"SDLComponentVolumeStatusNotSupported","abstract":"<p>Not supported SDLComponentVolumeStatus</p>"},"Constants.html#/c:@SDLDefrostZoneFront":{"name":"SDLDefrostZoneFront","abstract":"<p>A SDLDefrostZone with the value of <em>FRONT</em></p>"},"Constants.html#/c:@SDLDefrostZoneRear":{"name":"SDLDefrostZoneRear","abstract":"<p>A SDLDefrostZone with the value of <em>REAR</em></p>"},"Constants.html#/c:@SDLDefrostZoneAll":{"name":"SDLDefrostZoneAll","abstract":"<p>A SDLDefrostZone with the value of <em>All</em></p>"},"Constants.html#/c:@SDLDefrostZoneNone":{"name":"SDLDefrostZoneNone","abstract":"<p>A SDLDefrostZone with the value of <em>None</em></p>"},"Constants.html#/c:@SDLDeliveryModePrompt":{"name":"SDLDeliveryModePrompt","abstract":"<p>User is prompted on HMI</p>"},"Constants.html#/c:@SDLDeliveryModeDestination":{"name":"SDLDeliveryModeDestination","abstract":"<p>Set the location as destination without prompting the user</p>"},"Constants.html#/c:@SDLDeliveryModeQueue":{"name":"SDLDeliveryModeQueue","abstract":"<p>Adds the current location to navigation queue</p>"},"Constants.html#/c:@SDLDeviceLevelStatusZeroBars":{"name":"SDLDeviceLevelStatusZeroBars","abstract":"<p>Device battery level is zero bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusOneBar":{"name":"SDLDeviceLevelStatusOneBar","abstract":"<p>Device battery level is one bar</p>"},"Constants.html#/c:@SDLDeviceLevelStatusTwoBars":{"name":"SDLDeviceLevelStatusTwoBars","abstract":"<p>Device battery level is two bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusThreeBars":{"name":"SDLDeviceLevelStatusThreeBars","abstract":"<p>Device battery level is three bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusFourBars":{"name":"SDLDeviceLevelStatusFourBars","abstract":"<p>Device battery level is four bars</p>"},"Constants.html#/c:@SDLDeviceLevelStatusNotProvided":{"name":"SDLDeviceLevelStatusNotProvided","abstract":"<p>Device battery level is unknown</p>"},"Constants.html#/c:@SDLDimensionNoFix":{"name":"SDLDimensionNoFix","abstract":"<p>No GPS at all</p>"},"Constants.html#/c:@SDLDimension2D":{"name":"SDLDimension2D","abstract":"<p>Longitude and latitude of the GPS</p>"},"Constants.html#/c:@SDLDimension3D":{"name":"SDLDimension3D","abstract":"<p>Longitude and latitude and altitude of the GPS</p>"},"Constants.html#/c:@SDLDirectionLeft":{"name":"SDLDirectionLeft","abstract":"<p>Direction left</p>"},"Constants.html#/c:@SDLDirectionRight":{"name":"SDLDirectionRight","abstract":"<p>Direction right</p>"},"Constants.html#/c:@SDLDisplayModeDay":{"name":"SDLDisplayModeDay","abstract":"<p>@abstract Display Mode : DAY</p>"},"Constants.html#/c:@SDLDisplayModeNight":{"name":"SDLDisplayModeNight","abstract":"<p>@abstract Display Mode : NIGHT.</p>"},"Constants.html#/c:@SDLDisplayModeAuto":{"name":"SDLDisplayModeAuto","abstract":"<p>@abstract Display Mode : AUTO.</p>"},"Constants.html#/c:@SDLDisplayTypeCID":{"name":"SDLDisplayTypeCID","abstract":"<p>This display type provides a 2-line x 20 character &ldquo;dot matrix&rdquo; display.</p>"},"Constants.html#/c:@SDLDisplayTypeType2":{"name":"SDLDisplayTypeType2","abstract":"<p>Display type 2</p>"},"Constants.html#/c:@SDLDisplayTypeType5":{"name":"SDLDisplayTypeType5","abstract":"<p>Display type 5</p>"},"Constants.html#/c:@SDLDisplayTypeNGN":{"name":"SDLDisplayTypeNGN","abstract":"<p>This display type provides an 8 inch touchscreen display.</p>"},"Constants.html#/c:@SDLDisplayTypeGen28DMA":{"name":"SDLDisplayTypeGen28DMA","abstract":"<p>Display type Gen 28 DMA</p>"},"Constants.html#/c:@SDLDisplayTypeGen26DMA":{"name":"SDLDisplayTypeGen26DMA","abstract":"<p>Display type Gen 26 DMA</p>"},"Constants.html#/c:@SDLDisplayTypeMFD3":{"name":"SDLDisplayTypeMFD3","abstract":"<p>Display type MFD3</p>"},"Constants.html#/c:@SDLDisplayTypeMFD4":{"name":"SDLDisplayTypeMFD4","abstract":"<p>Display type MFD4</p>"},"Constants.html#/c:@SDLDisplayTypeMFD5":{"name":"SDLDisplayTypeMFD5","abstract":"<p>Display type MFD5</p>"},"Constants.html#/c:@SDLDisplayTypeGen38Inch":{"name":"SDLDisplayTypeGen38Inch","abstract":"<p>Display type Gen 3 8-inch</p>"},"Constants.html#/c:@SDLDisplayTypeGeneric":{"name":"SDLDisplayTypeGeneric","abstract":"<p>Display type Generic</p>"},"Constants.html#/c:@SDLDistanceUnitMiles":{"name":"SDLDistanceUnitMiles","abstract":"<p>@abstract SDLDistanceUnit: <em>MILES</em></p>"},"Constants.html#/c:@SDLDistanceUnitKilometers":{"name":"SDLDistanceUnitKilometers","abstract":"<p>@abstract SDLDistanceUnit: <em>KILOMETERS</em></p>"},"Constants.html#/c:@SDLDoorStatusTypeClosed":{"name":"SDLDoorStatusTypeClosed","abstract":"<p>Door is closed and unlocked</p>"},"Constants.html#/c:@SDLDoorStatusTypeLocked":{"name":"SDLDoorStatusTypeLocked","abstract":"<p>Door is closed and locked</p>"},"Constants.html#/c:@SDLDoorStatusTypeAjar":{"name":"SDLDoorStatusTypeAjar","abstract":"<p>Door is open</p>"},"Constants.html#/c:@SDLDoorStatusTypeRemoved":{"name":"SDLDoorStatusTypeRemoved","abstract":"<p>Door is removed from the vehicle</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:@SDLErrorDomainSystem":{"name":"SDLErrorDomainSystem","abstract":"<p>An error with the iOS system</p>"},"Constants.html#/c:@SDLErrorDomainAudioStreamManager":{"name":"SDLErrorDomainAudioStreamManager","abstract":"<p>An error in the SDLAudioStreamManager</p>"},"Constants.html#/c:@SDLErrorDomainCacheFileManager":{"name":"SDLErrorDomainCacheFileManager","abstract":"<p>An error in the SDLCacheFileManager private class</p>"},"Constants.html#/c:@SDLErrorDomainChoiceSetManager":{"name":"SDLErrorDomainChoiceSetManager","abstract":"<p>An error in the SDLChoiceSetManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainAlertManager":{"name":"SDLErrorDomainAlertManager","abstract":"<p>An error in the SDLAlertManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainEncryptionLifecycleManager":{"name":"SDLErrorDomainEncryptionLifecycleManager","abstract":"<p>An error in the SDLEncryptionLifecycleManager private class</p>"},"Constants.html#/c:@SDLErrorDomainFileManager":{"name":"SDLErrorDomainFileManager","abstract":"<p>An error in the SDLFileManager</p>"},"Constants.html#/c:@SDLErrorDomainLifecycleManager":{"name":"SDLErrorDomainLifecycleManager","abstract":"<p>An error in the SDLLifecycleManager private class</p>"},"Constants.html#/c:@SDLErrorDomainMenuManager":{"name":"SDLErrorDomainMenuManager","abstract":"<p>An error in the SDLMenuManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainRPCStore":{"name":"SDLErrorDomainRPCStore","abstract":"<p>An error in an SDL RPC class</p>"},"Constants.html#/c:@SDLErrorDomainSoftButtonManager":{"name":"SDLErrorDomainSoftButtonManager","abstract":"<p>An error in the SDLSoftButtonManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainSubscribeButtonManager":{"name":"SDLErrorDomainSubscribeButtonManager","abstract":"<p>An error in the SDLSubscribeButtonManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainSystemCapabilityManager":{"name":"SDLErrorDomainSystemCapabilityManager","abstract":"<p>An error in the SDLSystemCapabilityManager</p>"},"Constants.html#/c:@SDLErrorDomainTextAndGraphicManager":{"name":"SDLErrorDomainTextAndGraphicManager","abstract":"<p>An error in the SDLTextAndGraphicManager subset of SDLScreenManager</p>"},"Constants.html#/c:@SDLErrorDomainTransport":{"name":"SDLErrorDomainTransport","abstract":"<p>An error in a SDL transport private class</p>"},"Constants.html#/c:@SDLFileTypeBMP":{"name":"SDLFileTypeBMP","abstract":"<p>file type: Bitmap (BMP)</p>"},"Constants.html#/c:@SDLFileTypeJPEG":{"name":"SDLFileTypeJPEG","abstract":"<p>file type: JPEG</p>"},"Constants.html#/c:@SDLFileTypePNG":{"name":"SDLFileTypePNG","abstract":"<p>file type: PNG</p>"},"Constants.html#/c:@SDLFileTypeWAV":{"name":"SDLFileTypeWAV","abstract":"<p>file type: WAVE (WAV)</p>"},"Constants.html#/c:@SDLFileTypeMP3":{"name":"SDLFileTypeMP3","abstract":"<p>file type: MP3</p>"},"Constants.html#/c:@SDLFileTypeAAC":{"name":"SDLFileTypeAAC","abstract":"<p>file type: AAC</p>"},"Constants.html#/c:@SDLFileTypeBinary":{"name":"SDLFileTypeBinary","abstract":"<p>file type: BINARY</p>"},"Constants.html#/c:@SDLFileTypeJSON":{"name":"SDLFileTypeJSON","abstract":"<p>file type: JSON</p>"},"Constants.html#/c:@SDLFuelCutoffStatusTerminateFuel":{"name":"SDLFuelCutoffStatusTerminateFuel","abstract":"<p>Fuel is cut off</p>"},"Constants.html#/c:@SDLFuelCutoffStatusNormalOperation":{"name":"SDLFuelCutoffStatusNormalOperation","abstract":"<p>Fuel is not cut off</p>"},"Constants.html#/c:@SDLFuelCutoffStatusFault":{"name":"SDLFuelCutoffStatusFault","abstract":"<p>Status of the fuel pump cannot be determined</p>"},"Constants.html#/c:@SDLFuelTypeGasoline":{"name":"SDLFuelTypeGasoline","abstract":"<p>Fuel type: Gasoline</p>"},"Constants.html#/c:@SDLFuelTypeDiesel":{"name":"SDLFuelTypeDiesel","abstract":"<p>Fuel type: Diesel</p>"},"Constants.html#/c:@SDLFuelTypeCNG":{"name":"SDLFuelTypeCNG","abstract":"<p>Fuel type: CNG</p>"},"Constants.html#/c:@SDLFuelTypeLPG":{"name":"SDLFuelTypeLPG","abstract":"<p>Fuel type: LPG</p>"},"Constants.html#/c:@SDLFuelTypeHydrogen":{"name":"SDLFuelTypeHydrogen","abstract":"<p>Fuel type: Hydrogen</p>"},"Constants.html#/c:@SDLFuelTypeBattery":{"name":"SDLFuelTypeBattery","abstract":"<p>Fuel type: Battery</p>"},"Constants.html#/c:@SDLGlobalPropertyHelpPrompt":{"name":"SDLGlobalPropertyHelpPrompt","abstract":"<p>The help prompt to be spoken if the user needs assistance during a user-initiated interaction.</p>"},"Constants.html#/c:@SDLGlobalPropertyTimeoutPrompt":{"name":"SDLGlobalPropertyTimeoutPrompt","abstract":"<p>The prompt to be spoken if the user-initiated interaction times out waiting for the user&rsquo;s verbal input.</p>"},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpTitle":{"name":"SDLGlobalPropertyVoiceRecognitionHelpTitle","abstract":"<p>The title of the menu displayed when the user requests help via voice recognition.</p>"},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpItems":{"name":"SDLGlobalPropertyVoiceRecognitionHelpItems","abstract":"<p>Items of the menu displayed when the user requests help via voice recognition.</p>"},"Constants.html#/c:@SDLGlobalPropertyMenuName":{"name":"SDLGlobalPropertyMenuName","abstract":"<p>The name of the menu button displayed in templates</p>"},"Constants.html#/c:@SDLGlobalPropertyMenuIcon":{"name":"SDLGlobalPropertyMenuIcon","abstract":"<p>An icon on the menu button displayed in templates</p>"},"Constants.html#/c:@SDLGlobalPropertyKeyboard":{"name":"SDLGlobalPropertyKeyboard","abstract":"<p>Property related to the keyboard</p>"},"Constants.html#/c:@SDLGlobalPropertyUserLocation":{"name":"SDLGlobalPropertyUserLocation","abstract":"<p>Location of the user&rsquo;s seat of setGlobalProperties</p>"},"Constants.html#/c:@SDLHMILevelFull":{"name":"SDLHMILevelFull","abstract":"<p>The application has full use of the SDL HMI. The app may output via TTS, display, or streaming audio and may gather input via VR, Menu, and button presses</p>"},"Constants.html#/c:@SDLHMILevelLimited":{"name":"SDLHMILevelLimited","abstract":"<p>This HMI Level is only defined for a media application using an HMI with an 8 inch touchscreen (Nav) system. The application&rsquo;s Show text is displayed and it receives button presses from media-oriented buttons (SEEKRIGHT, SEEKLEFT, TUNEUP, TUNEDOWN, PRESET_0-9)</p>"},"Constants.html#/c:@SDLHMILevelBackground":{"name":"SDLHMILevelBackground","abstract":"<p>App cannot interact with user via TTS, VR, Display or Button Presses. App can perform the following operations:</p>"},"Constants.html#/c:@SDLHMILevelNone":{"name":"SDLHMILevelNone","abstract":"<p>Application has been discovered by SDL, but it cannot send any requests or receive any notifications</p>"},"Constants.html#/c:@SDLHMIZoneCapabilitiesFront":{"name":"SDLHMIZoneCapabilitiesFront","abstract":"<p>Indicates HMI available for front seat passengers.</p>"},"Constants.html#/c:@SDLHMIZoneCapabilitiesBack":{"name":"SDLHMIZoneCapabilitiesBack","abstract":"<p>Indicates HMI available for rear seat passengers.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceMobile":{"name":"SDLHybridAppPreferenceMobile","abstract":"<p>App preference of mobile.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceCloud":{"name":"SDLHybridAppPreferenceCloud","abstract":"<p>App preference of cloud.</p>"},"Constants.html#/c:@SDLHybridAppPreferenceBoth":{"name":"SDLHybridAppPreferenceBoth","abstract":"<p>App preference of both. Allows both the mobile and the cloud versions of the app to attempt to connect at the same time, however the first app that is registered is the one that is allowed to stay registered.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusNotStable":{"name":"SDLIgnitionStableStatusNotStable","abstract":"<p>The current ignition switch status is considered not to be stable.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusStable":{"name":"SDLIgnitionStableStatusStable","abstract":"<p>The current ignition switch status is considered to be stable.</p>"},"Constants.html#/c:@SDLIgnitionStableStatusMissingFromTransmitter":{"name":"SDLIgnitionStableStatusMissingFromTransmitter","abstract":"<p>The current ignition switch status is considered to be missing from the transmitter</p>"},"Constants.html#/c:@SDLIgnitionStatusUnknown":{"name":"SDLIgnitionStatusUnknown","abstract":"<p>Ignition status currently unknown</p>"},"Constants.html#/c:@SDLIgnitionStatusOff":{"name":"SDLIgnitionStatusOff","abstract":"<p>Ignition is off</p>"},"Constants.html#/c:@SDLIgnitionStatusAccessory":{"name":"SDLIgnitionStatusAccessory","abstract":"<p>Ignition is in mode accessory</p>"},"Constants.html#/c:@SDLIgnitionStatusRun":{"name":"SDLIgnitionStatusRun","abstract":"<p>Ignition is in mode run</p>"},"Constants.html#/c:@SDLIgnitionStatusStart":{"name":"SDLIgnitionStatusStart","abstract":"<p>Ignition is in mode start</p>"},"Constants.html#/c:@SDLIgnitionStatusInvalid":{"name":"SDLIgnitionStatusInvalid","abstract":"<p>Signal is invalid</p>"},"Constants.html#/c:@SDLImageFieldNameAlertIcon":{"name":"SDLImageFieldNameAlertIcon","abstract":"<p>The image field for Alert</p>"},"Constants.html#/c:@SDLImageFieldNameSoftButtonImage":{"name":"SDLImageFieldNameSoftButtonImage","abstract":"<p>The image field for SoftButton</p>"},"Constants.html#/c:@SDLImageFieldNameChoiceImage":{"name":"SDLImageFieldNameChoiceImage","abstract":"<p>The first image field for Choice.</p>"},"Constants.html#/c:@SDLImageFieldNameChoiceSecondaryImage":{"name":"SDLImageFieldNameChoiceSecondaryImage","abstract":"<p>The scondary image field for Choice.</p>"},"Constants.html#/c:@SDLImageFieldNameVoiceRecognitionHelpItem":{"name":"SDLImageFieldNameVoiceRecognitionHelpItem","abstract":"<p>The image field for vrHelpItem.</p>"},"Constants.html#/c:@SDLImageFieldNameTurnIcon":{"name":"SDLImageFieldNameTurnIcon","abstract":"<p>The image field for Turn.</p>"},"Constants.html#/c:@SDLImageFieldNameMenuIcon":{"name":"SDLImageFieldNameMenuIcon","abstract":"<p>The image field for the menu icon in SetGlobalProperties.</p>"},"Constants.html#/c:@SDLImageFieldNameCommandIcon":{"name":"SDLImageFieldNameCommandIcon","abstract":"<p>The image field for AddCommand."},"Constants.html#/c:@SDLImageFieldNameAppIcon":{"name":"SDLImageFieldNameAppIcon","abstract":"<p>The image field for the app icon (set by setAppIcon).</p>"},"Constants.html#/c:@SDLImageFieldNameGraphic":{"name":"SDLImageFieldNameGraphic","abstract":"<p>The primary image field for Show."},"Constants.html#/c:@SDLImageFieldNameSecondaryGraphic":{"name":"SDLImageFieldNameSecondaryGraphic","abstract":"<p>The secondary image field for Show."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTIcon":{"name":"SDLImageFieldNameShowConstantTBTIcon","abstract":"<p>The primary image field for ShowConstant TBT."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTNextTurnIcon":{"name":"SDLImageFieldNameShowConstantTBTNextTurnIcon","abstract":"<p>The secondary image field for ShowConstant TBT.</p>"},"Constants.html#/c:@SDLImageFieldNameLocationImage":{"name":"SDLImageFieldNameLocationImage","abstract":"<p>The optional image of a destination / location</p>"},"Constants.html#/c:@SDLImageFieldNameSubMenuIcon":{"name":"SDLImageFieldNameSubMenuIcon","abstract":"<p>The image field for AddSubMenu.menuIcon</p>"},"Constants.html#/c:@SDLImageFieldNameSubtleAlertIcon":{"name":"SDLImageFieldNameSubtleAlertIcon","abstract":"<p>The image of the subtle alert; applies to <code>SubtleAlert</code> <code>alertImage</code></p>"},"Constants.html#/c:@SDLImageFieldNameMenuCommandSecondaryImage":{"name":"SDLImageFieldNameMenuCommandSecondaryImage","abstract":"<p>The secondary image field for AddCommand</p>"},"Constants.html#/c:@SDLImageFieldNameMenuSubMenuSecondaryImage":{"name":"SDLImageFieldNameMenuSubMenuSecondaryImage","abstract":"<p>The secondary image field for AddSubMenu</p>"},"Constants.html#/c:@SDLImageTypeStatic":{"name":"SDLImageTypeStatic","abstract":"<p>Activate an icon that shipped with the IVI system by passing a hex value.</p>"},"Constants.html#/c:@SDLImageTypeDynamic":{"name":"SDLImageTypeDynamic","abstract":"<p>An icon referencing an image uploaded by the app (identifier to be sent by SDLPutFile)</p>"},"Constants.html#/c:@SDLInteractionModeManualOnly":{"name":"SDLInteractionModeManualOnly","abstract":"<p>Interaction Mode : Manual Only</p>"},"Constants.html#/c:@SDLInteractionModeVoiceRecognitionOnly":{"name":"SDLInteractionModeVoiceRecognitionOnly","abstract":"<p>Interaction Mode : VR Only</p>"},"Constants.html#/c:@SDLInteractionModeBoth":{"name":"SDLInteractionModeBoth","abstract":"<p>Interaction Mode : Manual &amp; VR</p>"},"Constants.html#/c:@SDLKeyboardEventKeypress":{"name":"SDLKeyboardEventKeypress","abstract":"<p>The use has pressed the keyboard key (applies to both SINGLE_KEYPRESS and RESEND_CURRENT_ENTRY modes).</p>"},"Constants.html#/c:@SDLKeyboardEventSubmitted":{"name":"SDLKeyboardEventSubmitted","abstract":"<p>The User has finished entering text from the keyboard and submitted the entry.</p>"},"Constants.html#/c:@SDLKeyboardEventCancelled":{"name":"SDLKeyboardEventCancelled","abstract":"<p>The User has pressed the HMI-defined &ldquo;Cancel&rdquo; button.</p>"},"Constants.html#/c:@SDLKeyboardEventAborted":{"name":"SDLKeyboardEventAborted","abstract":"<p>The User has not finished entering text and the keyboard is aborted with the event of higher priority.</p>"},"Constants.html#/c:@SDLKeyboardEventVoice":{"name":"SDLKeyboardEventVoice","abstract":"<p>The user used voice as input for the keyboard</p>"},"Constants.html#/c:@SDLKeyboardEventInputKeyMaskEnabled":{"name":"SDLKeyboardEventInputKeyMaskEnabled","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLKeyboardEventInputKeyMaskDisabled":{"name":"SDLKeyboardEventInputKeyMaskDisabled","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLKeyboardInputMaskEnableInputKeyMask":{"name":"SDLKeyboardInputMaskEnableInputKeyMask","abstract":"<p>Key mask is enabled. Input characters will not be viewable by the user.</p>"},"Constants.html#/c:@SDLKeyboardInputMaskDisableInputKeyMask":{"name":"SDLKeyboardInputMaskDisableInputKeyMask","abstract":"<p>Key mask is disabled. Input characters will be viewable by the user.</p>"},"Constants.html#/c:@SDLKeyboardInputMaskUserChoiceInputKeyMask":{"name":"SDLKeyboardInputMaskUserChoiceInputKeyMask","abstract":"<p>Key mask can be toggled by the user.</p>"},"Constants.html#/c:@SDLKeyboardLayoutQWERTY":{"name":"SDLKeyboardLayoutQWERTY","abstract":"<p>QWERTY layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutQWERTZ":{"name":"SDLKeyboardLayoutQWERTZ","abstract":"<p>QWERTZ layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutAZERTY":{"name":"SDLKeyboardLayoutAZERTY","abstract":"<p>AZERTY layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)</p>"},"Constants.html#/c:@SDLKeyboardLayoutNumeric":{"name":"SDLKeyboardLayoutNumeric","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLKeypressModeSingleKeypress":{"name":"SDLKeypressModeSingleKeypress","abstract":"<p>SINGLE_KEYPRESS:<br>Each and every User`s keypress must be reported (new notification for every newly entered single symbol).</p>"},"Constants.html#/c:@SDLKeypressModeQueueKeypresses":{"name":"SDLKeypressModeQueueKeypresses","abstract":"<p>QUEUE_KEYPRESSES:<br>The whole entry is reported only after the User submits it (by ‘Search’ button click displayed on touchscreen keyboard)</p>"},"Constants.html#/c:@SDLKeypressModeResendCurrentEntry":{"name":"SDLKeypressModeResendCurrentEntry","abstract":"<p>RESEND_CURRENT_ENTRY:<br>The whole entry must be reported each and every time the User makes a new keypress<br> (new notification with all previously entered symbols and a newly entered one appended).</p>"},"Constants.html#/c:@SDLLanguageEnSa":{"name":"SDLLanguageEnSa","abstract":"<p>English_SA</p>"},"Constants.html#/c:@SDLLanguageHeIl":{"name":"SDLLanguageHeIl","abstract":"<p>Hebrew_IL</p>"},"Constants.html#/c:@SDLLanguageRoRo":{"name":"SDLLanguageRoRo","abstract":"<p>Romainian_RO</p>"},"Constants.html#/c:@SDLLanguageUkUa":{"name":"SDLLanguageUkUa","abstract":"<p>Ukrainian_UA</p>"},"Constants.html#/c:@SDLLanguageIdId":{"name":"SDLLanguageIdId","abstract":"<p>Indonesian_ID</p>"},"Constants.html#/c:@SDLLanguageViVn":{"name":"SDLLanguageViVn","abstract":"<p>Vietnamese_VN</p>"},"Constants.html#/c:@SDLLanguageMsMy":{"name":"SDLLanguageMsMy","abstract":"<p>Malay_MY</p>"},"Constants.html#/c:@SDLLanguageHiIn":{"name":"SDLLanguageHiIn","abstract":"<p>Hindi_IN</p>"},"Constants.html#/c:@SDLLanguageNlBe":{"name":"SDLLanguageNlBe","abstract":"<p>Dutch(Flemish)_BE</p>"},"Constants.html#/c:@SDLLanguageElGr":{"name":"SDLLanguageElGr","abstract":"<p>Greek_GR</p>"},"Constants.html#/c:@SDLLanguageHuHu":{"name":"SDLLanguageHuHu","abstract":"<p>Hungarian_HU</p>"},"Constants.html#/c:@SDLLanguageFiFi":{"name":"SDLLanguageFiFi","abstract":"<p>Finnish_FI</p>"},"Constants.html#/c:@SDLLanguageSkSk":{"name":"SDLLanguageSkSk","abstract":"<p>Slovak_SK</p>"},"Constants.html#/c:@SDLLanguageEnUs":{"name":"SDLLanguageEnUs","abstract":"<p>English_US</p>"},"Constants.html#/c:@SDLLanguageEnIn":{"name":"SDLLanguageEnIn","abstract":"<p>English - India</p>"},"Constants.html#/c:@SDLLanguageThTh":{"name":"SDLLanguageThTh","abstract":"<p>Thai - Thailand</p>"},"Constants.html#/c:@SDLLanguageEsMx":{"name":"SDLLanguageEsMx","abstract":"<p>Spanish - Mexico</p>"},"Constants.html#/c:@SDLLanguageFrCa":{"name":"SDLLanguageFrCa","abstract":"<p>French - Canada</p>"},"Constants.html#/c:@SDLLanguageDeDe":{"name":"SDLLanguageDeDe","abstract":"<p>German - Germany</p>"},"Constants.html#/c:@SDLLanguageEsEs":{"name":"SDLLanguageEsEs","abstract":"<p>Spanish - Spain</p>"},"Constants.html#/c:@SDLLanguageEnGb":{"name":"SDLLanguageEnGb","abstract":"<p>English - Great Britain</p>"},"Constants.html#/c:@SDLLanguageRuRu":{"name":"SDLLanguageRuRu","abstract":"<p>Russian - Russia</p>"},"Constants.html#/c:@SDLLanguageTrTr":{"name":"SDLLanguageTrTr","abstract":"<p>Turkish - Turkey</p>"},"Constants.html#/c:@SDLLanguagePlPl":{"name":"SDLLanguagePlPl","abstract":"<p>Polish - Poland</p>"},"Constants.html#/c:@SDLLanguageFrFr":{"name":"SDLLanguageFrFr","abstract":"<p>French - France</p>"},"Constants.html#/c:@SDLLanguageItIt":{"name":"SDLLanguageItIt","abstract":"<p>Italian - Italy</p>"},"Constants.html#/c:@SDLLanguageSvSe":{"name":"SDLLanguageSvSe","abstract":"<p>Swedish - Sweden</p>"},"Constants.html#/c:@SDLLanguagePtPt":{"name":"SDLLanguagePtPt","abstract":"<p>Portuguese - Portugal</p>"},"Constants.html#/c:@SDLLanguageNlNl":{"name":"SDLLanguageNlNl","abstract":"<p>Dutch (Standard) - Netherlands</p>"},"Constants.html#/c:@SDLLanguageEnAu":{"name":"SDLLanguageEnAu","abstract":"<p>English - Australia</p>"},"Constants.html#/c:@SDLLanguageZhCn":{"name":"SDLLanguageZhCn","abstract":"<p>Mandarin - China</p>"},"Constants.html#/c:@SDLLanguageZhTw":{"name":"SDLLanguageZhTw","abstract":"<p>Mandarin - Taiwan</p>"},"Constants.html#/c:@SDLLanguageJaJp":{"name":"SDLLanguageJaJp","abstract":"<p>Japanese - Japan</p>"},"Constants.html#/c:@SDLLanguageArSa":{"name":"SDLLanguageArSa","abstract":"<p>Arabic - Saudi Arabia</p>"},"Constants.html#/c:@SDLLanguageKoKr":{"name":"SDLLanguageKoKr","abstract":"<p>Korean - South Korea</p>"},"Constants.html#/c:@SDLLanguagePtBr":{"name":"SDLLanguagePtBr","abstract":"<p>Portuguese - Brazil</p>"},"Constants.html#/c:@SDLLanguageCsCz":{"name":"SDLLanguageCsCz","abstract":"<p>Czech - Czech Republic</p>"},"Constants.html#/c:@SDLLanguageDaDk":{"name":"SDLLanguageDaDk","abstract":"<p>Danish - Denmark</p>"},"Constants.html#/c:@SDLLanguageNoNo":{"name":"SDLLanguageNoNo","abstract":"<p>Norwegian - Norway</p>"},"Constants.html#/c:@SDLLayoutModeIconOnly":{"name":"SDLLayoutModeIconOnly","abstract":"<p>This mode causes the interaction to display the previous set of choices as icons.</p>"},"Constants.html#/c:@SDLLayoutModeIconWithSearch":{"name":"SDLLayoutModeIconWithSearch","abstract":"<p>This mode causes the interaction to display the previous set of choices as icons along with a search field in the HMI.</p>"},"Constants.html#/c:@SDLLayoutModeListOnly":{"name":"SDLLayoutModeListOnly","abstract":"<p>This mode causes the interaction to display the previous set of choices as a list.</p>"},"Constants.html#/c:@SDLLayoutModeListWithSearch":{"name":"SDLLayoutModeListWithSearch","abstract":"<p>This mode causes the interaction to display the previous set of choices as a list along with a search field in the HMI.</p>"},"Constants.html#/c:@SDLLayoutModeKeyboard":{"name":"SDLLayoutModeKeyboard","abstract":"<p>This mode causes the interaction to immediately display a keyboard entry through the HMI.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftHighBeam":{"name":"SDLLightNameFrontLeftHighBeam","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_HIGH_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontRightHighBeam":{"name":"SDLLightNameFrontRightHighBeam","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_HIGH_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftLowBeam":{"name":"SDLLightNameFrontLeftLowBeam","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_LOW_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontRightLowBeam":{"name":"SDLLightNameFrontRightLowBeam","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_LOW_BEAM.</p>"},"Constants.html#/c:@SDLLightNameFrontLeftParkingLight":{"name":"SDLLightNameFrontLeftParkingLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_PARKING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightParkingLight":{"name":"SDLLightNameFrontRightParkingLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_PARKING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftFogLight":{"name":"SDLLightNameFrontLeftFogLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightFogLight":{"name":"SDLLightNameFrontRightFogLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftDaytimeRunningLight":{"name":"SDLLightNameFrontLeftDaytimeRunningLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_DAYTIME_RUNNING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightDaytimeRunningLight":{"name":"SDLLightNameFrontRightDaytimeRunningLight","abstract":"<p>@abstract Represents the Light with name FRONT_RIGHT_DAYTIME_RUNNING_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontLeftTurnLight":{"name":"SDLLightNameFrontLeftTurnLight","abstract":"<p>@abstract Represents the Light with name FRONT_LEFT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameFrontRightTurnLight":{"name":"SDLLightNameFrontRightTurnLight","abstract":"<p>@abstract Represents the Light with name FRONT_Right_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftFogLight":{"name":"SDLLightNameRearLeftFogLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_FOG_LIGHT.</p>"},"Constants.html#/c:@SDLLightNameRearRightFogLight":{"name":"SDLLightNameRearRightFogLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_FOG_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftTailLight":{"name":"SDLLightNameRearLeftTailLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_TAIL_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightTailLight":{"name":"SDLLightNameRearRightTailLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_TAIL_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftBrakeLight":{"name":"SDLLightNameRearLeftBrakeLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_BRAKE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightBrakeLight":{"name":"SDLLightNameRearRightBrakeLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_BRAKE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearLeftTurnLight":{"name":"SDLLightNameRearLeftTurnLight","abstract":"<p>@abstract Represents the Light with name REAR_LEFT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRightTurnLight":{"name":"SDLLightNameRearRightTurnLight","abstract":"<p>@abstract Represents the Light with name REAR_RIGHT_TURN_LIGHT</p>"},"Constants.html#/c:@SDLLightNameRearRegistrationPlateLight":{"name":"SDLLightNameRearRegistrationPlateLight","abstract":"<p>@abstract Represents the Light with name REAR_REGISTRATION_PLATE_LIGHT</p>"},"Constants.html#/c:@SDLLightNameHighBeams":{"name":"SDLLightNameHighBeams","abstract":"<p>@abstract Include all high beam lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameLowBeams":{"name":"SDLLightNameLowBeams","abstract":"<p>@abstract Include all low beam lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameFogLights":{"name":"SDLLightNameFogLights","abstract":"<p>@abstract Include all fog lights: front_left, front_right, rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameRunningLights":{"name":"SDLLightNameRunningLights","abstract":"<p>@abstract Include all daytime running lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameParkingLights":{"name":"SDLLightNameParkingLights","abstract":"<p>@abstract Include all parking lights: front_left and front_right.</p>"},"Constants.html#/c:@SDLLightNameBrakeLights":{"name":"SDLLightNameBrakeLights","abstract":"<p>@abstract Include all brake lights: rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameRearReversingLights":{"name":"SDLLightNameRearReversingLights","abstract":"<p>@abstract Represents the Light with name REAR_REVERSING_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameSideMarkerLights":{"name":"SDLLightNameSideMarkerLights","abstract":"<p>@abstract Represents the Light with name SIDE_MARKER_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameLeftTurnLights":{"name":"SDLLightNameLeftTurnLights","abstract":"<p>@abstract Include all left turn signal lights: front_left, rear_left, left_side and mirror_mounted.</p>"},"Constants.html#/c:@SDLLightNameRightTurnLights":{"name":"SDLLightNameRightTurnLights","abstract":"<p>@abstract Include all right turn signal lights: front_right, rear_right, right_side and mirror_mounted.</p>"},"Constants.html#/c:@SDLLightNameHazardLights":{"name":"SDLLightNameHazardLights","abstract":"<p>@abstract Include all hazard lights: front_left, front_right, rear_left and rear_right.</p>"},"Constants.html#/c:@SDLLightNameAmbientLights":{"name":"SDLLightNameAmbientLights","abstract":"<p>@abstract Represents the Light with name AMBIENT_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameOverHeadLights":{"name":"SDLLightNameOverHeadLights","abstract":"<p>@abstract Represents the Light with name OVERHEAD_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameReadingLights":{"name":"SDLLightNameReadingLights","abstract":"<p>@abstract Represents the Light with name READING_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameTrunkLights":{"name":"SDLLightNameTrunkLights","abstract":"<p>@abstract Represents the Light with name TRUNK_LIGHTS</p>"},"Constants.html#/c:@SDLLightNameExteriorFrontLights":{"name":"SDLLightNameExteriorFrontLights","abstract":"<p>@abstract Include exterior lights located in front of the vehicle. For example, fog lights and low beams.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearLights":{"name":"SDLLightNameExteriorRearLights","abstract":"<p>@abstract Include exterior lights located at the back of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorLeftLights":{"name":"SDLLightNameExteriorLeftLights","abstract":"<p>@abstract Include exterior lights located at the left side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRightLights":{"name":"SDLLightNameExteriorRightLights","abstract":"<p>@abstract Include exterior lights located at the right side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRearCargoLights":{"name":"SDLLightNameExteriorRearCargoLights","abstract":"<p>@abstract Cargo lamps illuminate the cargo area.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearTruckBedLights":{"name":"SDLLightNameExteriorRearTruckBedLights","abstract":"<p>@abstract Truck bed lamps light up the bed of the truck.</p>"},"Constants.html#/c:@SDLLightNameExteriorRearTrailerLights":{"name":"SDLLightNameExteriorRearTrailerLights","abstract":"<p>@abstract Trailer lights are lamps mounted on a trailer hitch.</p>"},"Constants.html#/c:@SDLLightNameExteriorLeftSpotLights":{"name":"SDLLightNameExteriorLeftSpotLights","abstract":"<p>@abstract It is the spotlights mounted on the left side of a vehicle.</p>"},"Constants.html#/c:@SDLLightNameExteriorRightSpotLights":{"name":"SDLLightNameExteriorRightSpotLights","abstract":"<p>@abstract It is the spotlights mounted on the right side of a vehicle.</p>"},"Constants.html#/c:@SDLLightNameExteriorLeftPuddleLights":{"name":"SDLLightNameExteriorLeftPuddleLights","abstract":"<p>@abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</p>"},"Constants.html#/c:@SDLLightNameExteriorRightPuddleLights":{"name":"SDLLightNameExteriorRightPuddleLights","abstract":"<p>@abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.</p>"},"Constants.html#/c:@SDLLightNameExteriorAllLights":{"name":"SDLLightNameExteriorAllLights","abstract":"<p>@abstract Include all exterior lights around the vehicle.</p>"},"Constants.html#/c:@SDLLightStatusOn":{"name":"SDLLightStatusOn","abstract":"<p>@abstract Light status currently on.</p>"},"Constants.html#/c:@SDLLightStatusOFF":{"name":"SDLLightStatusOFF","abstract":"<p>@abstract Light status currently Off.</p>"},"Constants.html#/c:@SDLLightStatusRampUp":{"name":"SDLLightStatusRampUp","abstract":"<p>@abstract Light status currently RAMP_UP.</p>"},"Constants.html#/c:@SDLLightStatusRampDown":{"name":"SDLLightStatusRampDown","abstract":"<p>@abstract Light status currently RAMP_DOWN.</p>"},"Constants.html#/c:@SDLLightStatusUnknown":{"name":"SDLLightStatusUnknown","abstract":"<p>@abstract Light status currently UNKNOWN.</p>"},"Constants.html#/c:@SDLLightStatusInvalid":{"name":"SDLLightStatusInvalid","abstract":"<p>@abstract Light status currently INVALID.</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusNormal":{"name":"SDLMaintenanceModeStatusNormal","abstract":"<p>Maintenance Mode Status : Normal</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusNear":{"name":"SDLMaintenanceModeStatusNear","abstract":"<p>Maintenance Mode Status : Near</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusActive":{"name":"SDLMaintenanceModeStatusActive","abstract":"<p>Maintenance Mode Status : Active</p>"},"Constants.html#/c:@SDLMaintenanceModeStatusFeatureNotPresent":{"name":"SDLMaintenanceModeStatusFeatureNotPresent","abstract":"<p>Maintenance Mode Status : Feature not present</p>"},"Constants.html#/c:@SDLMassageCushionTopLumbar":{"name":"SDLMassageCushionTopLumbar","abstract":"<p>@abstract TOP LUMBAR cushions of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionMiddleLumbar":{"name":"SDLMassageCushionMiddleLumbar","abstract":"<p>@abstract MIDDLE LUMBAR cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionBottomLumbar":{"name":"SDLMassageCushionBottomLumbar","abstract":"<p>@abstract BOTTOM LUMBAR cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionBackBolsters":{"name":"SDLMassageCushionBackBolsters","abstract":"<p>@abstract BACK BOLSTERS cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageCushionSeatBolsters":{"name":"SDLMassageCushionSeatBolsters","abstract":"<p>@abstract SEAT BOLSTERS cushion of a multi-contour massage seat</p>"},"Constants.html#/c:@SDLMassageModeOff":{"name":"SDLMassageModeOff","abstract":"<p>@abstract Massage Mode Status : OFF</p>"},"Constants.html#/c:@SDLMassageModeLow":{"name":"SDLMassageModeLow","abstract":"<p>@abstract Massage Mode Status : LOW</p>"},"Constants.html#/c:@SDLMassageModeHigh":{"name":"SDLMassageModeHigh","abstract":"<p>@abstract Massage Mode Status : HIGH</p>"},"Constants.html#/c:@SDLMassageZoneLumbar":{"name":"SDLMassageZoneLumbar","abstract":"<p>@abstract The back of a multi-contour massage seat. or SEAT_BACK</p>"},"Constants.html#/c:@SDLMassageZoneSeatCushion":{"name":"SDLMassageZoneSeatCushion","abstract":"<p>@abstract The bottom a multi-contour massage seat. or SEAT_BOTTOM</p>"},"Constants.html#/c:@SDLMediaClockFormatClock1":{"name":"SDLMediaClockFormatClock1","abstract":"<p>Media clock format: Clock1</p>"},"Constants.html#/c:@SDLMediaClockFormatClock2":{"name":"SDLMediaClockFormatClock2","abstract":"<p>Media clock format: Clock2</p>"},"Constants.html#/c:@SDLMediaClockFormatClock3":{"name":"SDLMediaClockFormatClock3","abstract":"<p>Media clock format: Clock3</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText1":{"name":"SDLMediaClockFormatClockText1","abstract":"<p>Media clock format: ClockText1</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText2":{"name":"SDLMediaClockFormatClockText2","abstract":"<p>Media clock format: ClockText2</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText3":{"name":"SDLMediaClockFormatClockText3","abstract":"<p>Media clock format: ClockText3</p>"},"Constants.html#/c:@SDLMediaClockFormatClockText4":{"name":"SDLMediaClockFormatClockText4","abstract":"<p>Media clock format: ClockText4</p>"},"Constants.html#/c:@SDLMediaTypeMusic":{"name":"SDLMediaTypeMusic","abstract":"<p>The app will have a media type of music.</p>"},"Constants.html#/c:@SDLMediaTypePodcast":{"name":"SDLMediaTypePodcast","abstract":"<p>The app will have a media type of podcast.</p>"},"Constants.html#/c:@SDLMediaTypeAudiobook":{"name":"SDLMediaTypeAudiobook","abstract":"<p>The app will have a media type of audiobook.</p>"},"Constants.html#/c:@SDLMediaTypeOther":{"name":"SDLMediaTypeOther","abstract":"<p>The app will have a media type of other.</p>"},"Constants.html#/c:@SDLMenuLayoutList":{"name":"SDLMenuLayoutList","abstract":"<p>The menu should be laid out in a scrollable list format with one menu cell below the previous, each is stretched across the view</p>"},"Constants.html#/c:@SDLMenuLayoutTiles":{"name":"SDLMenuLayoutTiles","abstract":"<p>The menu should be laid out in a scrollable tiles format with each menu cell laid out in a square-ish format next to each other horizontally</p>"},"Constants.html#/c:@SDLMetadataTypeMediaTitle":{"name":"SDLMetadataTypeMediaTitle","abstract":"<p>The song / media title name</p>"},"Constants.html#/c:@SDLMetadataTypeMediaArtist":{"name":"SDLMetadataTypeMediaArtist","abstract":"<p>The &ldquo;artist&rdquo; of the media</p>"},"Constants.html#/c:@SDLMetadataTypeMediaAlbum":{"name":"SDLMetadataTypeMediaAlbum","abstract":"<p>The &ldquo;album&rdquo; of the media&quot;</p>"},"Constants.html#/c:@SDLMetadataTypeMediaYear":{"name":"SDLMetadataTypeMediaYear","abstract":"<p>The &ldquo;year&rdquo; that the media was created</p>"},"Constants.html#/c:@SDLMetadataTypeMediaGenre":{"name":"SDLMetadataTypeMediaGenre","abstract":"<p>The &ldquo;genre&rdquo; of the media</p>"},"Constants.html#/c:@SDLMetadataTypeMediaStation":{"name":"SDLMetadataTypeMediaStation","abstract":"<p>The &ldquo;station&rdquo; that the media is playing on</p>"},"Constants.html#/c:@SDLMetadataTypeRating":{"name":"SDLMetadataTypeRating","abstract":"<p>The &ldquo;rating&rdquo; given to the media</p>"},"Constants.html#/c:@SDLMetadataTypeCurrentTemperature":{"name":"SDLMetadataTypeCurrentTemperature","abstract":"<p>The current temperature of the weather information</p>"},"Constants.html#/c:@SDLMetadataTypeMaximumTemperature":{"name":"SDLMetadataTypeMaximumTemperature","abstract":"<p>The high / maximum temperature of the weather information for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeMinimumTemperature":{"name":"SDLMetadataTypeMinimumTemperature","abstract":"<p>The low / minimum temperature of the weather information for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeWeatherTerm":{"name":"SDLMetadataTypeWeatherTerm","abstract":"<p>A description of the weather for the current period</p>"},"Constants.html#/c:@SDLMetadataTypeHumidity":{"name":"SDLMetadataTypeHumidity","abstract":"<p>The humidity of the weather information for the current period</p>"},"Constants.html#/c:@SDLModuleTypeClimate":{"name":"SDLModuleTypeClimate","abstract":"<p>A SDLModuleType with the value of <em>CLIMATE</em></p>"},"Constants.html#/c:@SDLModuleTypeRadio":{"name":"SDLModuleTypeRadio","abstract":"<p>A SDLModuleType with the value of <em>RADIO</em></p>"},"Constants.html#/c:@SDLModuleTypeSeat":{"name":"SDLModuleTypeSeat","abstract":"<p>A SDLModuleType with the value of <em>SEAT</em></p>"},"Constants.html#/c:@SDLModuleTypeAudio":{"name":"SDLModuleTypeAudio","abstract":"<p>A SDLModuleType with the value of <em>AUDIO</em></p>"},"Constants.html#/c:@SDLModuleTypeLight":{"name":"SDLModuleTypeLight","abstract":"<p>A SDLModuleType with the value of <em>LIGHT</em></p>"},"Constants.html#/c:@SDLModuleTypeHMISettings":{"name":"SDLModuleTypeHMISettings","abstract":"<p>A SDLModuleType with the value of <em>HMI_SETTINGS</em></p>"},"Constants.html#/c:@SDLNavigationActionTurn":{"name":"SDLNavigationActionTurn","abstract":"<p>Using this action plus a supplied direction can give the type of turn.</p>"},"Constants.html#/c:@SDLNavigationActionExit":{"name":"SDLNavigationActionExit","abstract":"<p>A navigation action of exit.</p>"},"Constants.html#/c:@SDLNavigationActionStay":{"name":"SDLNavigationActionStay","abstract":"<p>A navigation action of stay.</p>"},"Constants.html#/c:@SDLNavigationActionMerge":{"name":"SDLNavigationActionMerge","abstract":"<p>A navigation action of merge.</p>"},"Constants.html#/c:@SDLNavigationActionFerry":{"name":"SDLNavigationActionFerry","abstract":"<p>A navigation action of ferry.</p>"},"Constants.html#/c:@SDLNavigationActionCarShuttleTrain":{"name":"SDLNavigationActionCarShuttleTrain","abstract":"<p>A navigation action of car shuttle train.</p>"},"Constants.html#/c:@SDLNavigationActionWaypoint":{"name":"SDLNavigationActionWaypoint","abstract":"<p>A navigation action of waypoint.</p>"},"Constants.html#/c:@SDLNavigationJunctionRegular":{"name":"SDLNavigationJunctionRegular","abstract":"<p>A junction that represents a standard intersection with a single road crossing another.</p>"},"Constants.html#/c:@SDLNavigationJunctionBifurcation":{"name":"SDLNavigationJunctionBifurcation","abstract":"<p>A junction where the road splits off into two paths; a fork in the road.</p>"},"Constants.html#/c:@SDLNavigationJunctionMultiCarriageway":{"name":"SDLNavigationJunctionMultiCarriageway","abstract":"<p>A junction that has multiple intersections and paths.</p>"},"Constants.html#/c:@SDLNavigationJunctionRoundabout":{"name":"SDLNavigationJunctionRoundabout","abstract":"<p>A junction where traffic moves in a single direction around a central, non-traversable point to reach one of the connecting roads.</p>"},"Constants.html#/c:@SDLNavigationJunctionTraversableRoundabout":{"name":"SDLNavigationJunctionTraversableRoundabout","abstract":"<p>Similar to a roundabout, however the center of the roundabout is fully traversable. Also known as a mini-roundabout.</p>"},"Constants.html#/c:@SDLNavigationJunctionJughandle":{"name":"SDLNavigationJunctionJughandle","abstract":"<p>A junction where lefts diverge to the right, then curve to the left, converting a left turn to a crossing maneuver.</p>"},"Constants.html#/c:@SDLNavigationJunctionAllWayYield":{"name":"SDLNavigationJunctionAllWayYield","abstract":"<p>Multiple way intersection that allows traffic to flow based on priority; most commonly right of way and first in, first out.</p>"},"Constants.html#/c:@SDLNavigationJunctionTurnAround":{"name":"SDLNavigationJunctionTurnAround","abstract":"<p>A junction designated for traffic turn arounds.</p>"},"Constants.html#/c:@SDLNotificationUserInfoObject":{"name":"SDLNotificationUserInfoObject","abstract":"<p>The key used in all SDL NSNotifications to extract the response or notification from the userinfo dictionary.</p>"},"Constants.html#/c:@SDLTransportDidDisconnect":{"name":"SDLTransportDidDisconnect","abstract":"<p>Name for a disconnection notification</p>"},"Constants.html#/c:@SDLTransportDidConnect":{"name":"SDLTransportDidConnect","abstract":"<p>Name for a connection notification</p>"},"Constants.html#/c:@SDLTransportConnectError":{"name":"SDLTransportConnectError","abstract":"<p>Name for a error during connection notification</p>"},"Constants.html#/c:@SDLRPCServiceDidDisconnect":{"name":"SDLRPCServiceDidDisconnect","abstract":"<p>Name for a disconnection notification</p>"},"Constants.html#/c:@SDLRPCServiceDidConnect":{"name":"SDLRPCServiceDidConnect","abstract":"<p>Name for a connection notification</p>"},"Constants.html#/c:@SDLRPCServiceConnectionDidError":{"name":"SDLRPCServiceConnectionDidError","abstract":"<p>Name for a error during connection notification</p>"},"Constants.html#/c:@SDLDidReceiveError":{"name":"SDLDidReceiveError","abstract":"<p>Name for a general error notification</p>"},"Constants.html#/c:@SDLDidReceiveLockScreenIcon":{"name":"SDLDidReceiveLockScreenIcon","abstract":"<p>Name for an incoming lock screen icon notification</p>"},"Constants.html#/c:@SDLDidBecomeReady":{"name":"SDLDidBecomeReady","abstract":"<p>Name for an SDL became ready notification</p>"},"Constants.html#/c:@SDLDidUpdateProjectionView":{"name":"SDLDidUpdateProjectionView","abstract":"<p>Name for a notification sent by the user when their CarWindow view has been updated</p>"},"Constants.html#/c:@SDLDidReceiveAddCommandResponse":{"name":"SDLDidReceiveAddCommandResponse","abstract":"<p>Name for an AddCommand response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddSubMenuResponse":{"name":"SDLDidReceiveAddSubMenuResponse","abstract":"<p>Name for an AddSubMenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertResponse":{"name":"SDLDidReceiveAlertResponse","abstract":"<p>Name for an Alert response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertManeuverResponse":{"name":"SDLDidReceiveAlertManeuverResponse","abstract":"<p>Name for an AlertManeuver response RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressResponse":{"name":"SDLDidReceiveButtonPressResponse","abstract":"<p>Name for an ButtonPress response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCancelInteractionResponse":{"name":"SDLDidReceiveCancelInteractionResponse","abstract":"<p>Name for aa CancelInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceiveChangeRegistrationResponse":{"name":"SDLDidReceiveChangeRegistrationResponse","abstract":"<p>Name for a ChangeRegistration response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCloseApplicationResponse":{"name":"SDLDidReceiveCloseApplicationResponse","abstract":"<p>Name for a CloseApplication response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetResponse":{"name":"SDLDidReceiveCreateInteractionChoiceSetResponse","abstract":"<p>Name for a CreateInteractionChoiceSet response RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateWindowResponse":{"name":"SDLDidReceiveCreateWindowResponse","abstract":"<p>Name for a CreateWindow response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteCommandResponse":{"name":"SDLDidReceiveDeleteCommandResponse","abstract":"<p>Name for a DeleteCommand response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteFileResponse":{"name":"SDLDidReceiveDeleteFileResponse","abstract":"<p>Name for a DeleteFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetResponse":{"name":"SDLDidReceiveDeleteInteractionChoiceSetResponse","abstract":"<p>Name for a DeleteInteractionChoiceSet response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteSubmenuResponse":{"name":"SDLDidReceiveDeleteSubmenuResponse","abstract":"<p>Name for a DeleteSubmenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteWindowResponse":{"name":"SDLDidReceiveDeleteWindowResponse","abstract":"<p>Name for a DeleteWindow response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageResponse":{"name":"SDLDidReceiveDiagnosticMessageResponse","abstract":"<p>Name for a DiagnosticMessage response RPC</p>"},"Constants.html#/c:@SDLDidReceiveDialNumberResponse":{"name":"SDLDidReceiveDialNumberResponse","abstract":"<p>Name for a DialNumber response RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataResponse":{"name":"SDLDidReceiveEncodedSyncPDataResponse","abstract":"<p>Name for an EncodedSyncPData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruResponse":{"name":"SDLDidReceiveEndAudioPassThruResponse","abstract":"<p>Name for an EndAudioPassThru response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGenericResponse":{"name":"SDLDidReceiveGenericResponse","abstract":"<p>Name for a Generic response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesResponse":{"name":"SDLDidReceiveGetCloudAppPropertiesResponse","abstract":"<p>Name for a GetCloudAppProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataResponse":{"name":"SDLDidReceiveGetAppServiceDataResponse","abstract":"<p>Name for a GetAppServiceData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetDTCsResponse":{"name":"SDLDidReceiveGetDTCsResponse","abstract":"<p>Name for a GetDTCs response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetFileResponse":{"name":"SDLDidReceiveGetFileResponse","abstract":"<p>Name for a GetFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataResponse":{"name":"SDLDidReceiveGetInteriorVehicleDataResponse","abstract":"<p>Name for a GetInteriorVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataConsentResponse":{"name":"SDLDidReceiveGetInteriorVehicleDataConsentResponse","abstract":"<p>Name for a GetInteriorVehicleDataConsent response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilitiesResponse":{"name":"SDLDidReceiveGetSystemCapabilitiesResponse","abstract":"<p>Name for a GetSystemCapabilities response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetVehicleDataResponse":{"name":"SDLDidReceiveGetVehicleDataResponse","abstract":"<p>Name for a GetVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetWaypointsResponse":{"name":"SDLDidReceiveGetWaypointsResponse","abstract":"<p>Name for a GetWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveListFilesResponse":{"name":"SDLDidReceiveListFilesResponse","abstract":"<p>Name for a ListFiles response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionResponse":{"name":"SDLDidReceivePerformAppServiceInteractionResponse","abstract":"<p>Name for a PerformAppServiceInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruResponse":{"name":"SDLDidReceivePerformAudioPassThruResponse","abstract":"<p>Name for a PerformAudioPassThru response RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformInteractionResponse":{"name":"SDLDidReceivePerformInteractionResponse","abstract":"<p>Name for a PerformInteraction response RPC</p>"},"Constants.html#/c:@SDLDidReceivePublishAppServiceResponse":{"name":"SDLDidReceivePublishAppServiceResponse","abstract":"<p>Name for a PublishAppService response RPC</p>"},"Constants.html#/c:@SDLDidReceivePutFileResponse":{"name":"SDLDidReceivePutFileResponse","abstract":"<p>Name for a ReceivePutFile response RPC</p>"},"Constants.html#/c:@SDLDidReceiveReadDIDResponse":{"name":"SDLDidReceiveReadDIDResponse","abstract":"<p>Name for a ReceiveReadDID response RPC</p>"},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceResponse":{"name":"SDLDidReceiveRegisterAppInterfaceResponse","abstract":"<p>Name for a RegisterAppInterface response RPC</p>"},"Constants.html#/c:@SDLDidReceiveReleaseInteriorVehicleDataModuleResponse":{"name":"SDLDidReceiveReleaseInteriorVehicleDataModuleResponse","abstract":"<p>Name for a ReleaseInteriorVehicleDataModule response RPC</p>"},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesResponse":{"name":"SDLDidReceiveResetGlobalPropertiesResponse","abstract":"<p>Name for a ResetGlobalProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveScrollableMessageResponse":{"name":"SDLDidReceiveScrollableMessageResponse","abstract":"<p>Name for a ScrollableMessage response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendHapticDataResponse":{"name":"SDLDidReceiveSendHapticDataResponse","abstract":"<p>Name for a SendHapticData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendLocationResponse":{"name":"SDLDidReceiveSendLocationResponse","abstract":"<p>Name for a SendLocation response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetAppIconResponse":{"name":"SDLDidReceiveSetAppIconResponse","abstract":"<p>Name for a SetAppIcon response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesResponse":{"name":"SDLDidReceiveSetCloudAppPropertiesResponse","abstract":"<p>Name for a SetCloudAppProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutResponse":{"name":"SDLDidReceiveSetDisplayLayoutResponse","abstract":"<p>Name for a SetDisplayLayout response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesResponse":{"name":"SDLDidReceiveSetGlobalPropertiesResponse","abstract":"<p>Name for a SetGlobalProperties response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataResponse":{"name":"SDLDidReceiveSetInteriorVehicleDataResponse","abstract":"<p>Name for a SetInteriorVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerResponse":{"name":"SDLDidReceiveSetMediaClockTimerResponse","abstract":"<p>Name for a SetMediaClockTimer response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowConstantTBTResponse":{"name":"SDLDidReceiveShowConstantTBTResponse","abstract":"<p>Name for a ShowConstantTBT response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowResponse":{"name":"SDLDidReceiveShowResponse","abstract":"<p>Name for a Show response RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowAppMenuResponse":{"name":"SDLDidReceiveShowAppMenuResponse","abstract":"<p>Name for a ShowAppMenu response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSliderResponse":{"name":"SDLDidReceiveSliderResponse","abstract":"<p>Name for a Slider response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSpeakResponse":{"name":"SDLDidReceiveSpeakResponse","abstract":"<p>Name for a Speak response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeButtonResponse":{"name":"SDLDidReceiveSubscribeButtonResponse","abstract":"<p>Name for a SubscribeButton response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataResponse":{"name":"SDLDidReceiveSubscribeVehicleDataResponse","abstract":"<p>Name for a SubscribeVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeWaypointsResponse":{"name":"SDLDidReceiveSubscribeWaypointsResponse","abstract":"<p>Name for a SubscribeWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertResponse":{"name":"SDLDidReceiveSubtleAlertResponse","abstract":"<p>Name for a SubtleAlert response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataResponse":{"name":"SDLDidReceiveSyncPDataResponse","abstract":"<p>Name for a SyncPData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestResponse":{"name":"SDLDidReceiveSystemRequestResponse","abstract":"<p>Name for a SystemRequest response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateTurnListResponse":{"name":"SDLDidReceiveUpdateTurnListResponse","abstract":"<p>Name for an UpdateTurnList response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnpublishAppServiceResponse":{"name":"SDLDidReceiveUnpublishAppServiceResponse","abstract":"<p>Name for an UnpublishAppService response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceResponse":{"name":"SDLDidReceiveUnregisterAppInterfaceResponse","abstract":"<p>Name for an UnregisterAppInterface response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonResponse":{"name":"SDLDidReceiveUnsubscribeButtonResponse","abstract":"<p>Name for an UnsubscribeButton response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataResponse":{"name":"SDLDidReceiveUnsubscribeVehicleDataResponse","abstract":"<p>Name for an UnsubscribeVehicleData response RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeWaypointsResponse":{"name":"SDLDidReceiveUnsubscribeWaypointsResponse","abstract":"<p>Name for an UnsubscribeWaypoints response RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddCommandRequest":{"name":"SDLDidReceiveAddCommandRequest","abstract":"<p>Name for an AddCommand request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAddSubMenuRequest":{"name":"SDLDidReceiveAddSubMenuRequest","abstract":"<p>Name for an AddSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertRequest":{"name":"SDLDidReceiveAlertRequest","abstract":"<p>Name for an Alert request RPC</p>"},"Constants.html#/c:@SDLDidReceiveAlertManeuverRequest":{"name":"SDLDidReceiveAlertManeuverRequest","abstract":"<p>Name for an AlertManeuver request RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressRequest":{"name":"SDLDidReceiveButtonPressRequest","abstract":"<p>Name for a ButtonPress request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCancelInteractionRequest":{"name":"SDLDidReceiveCancelInteractionRequest","abstract":"<p>Name for a CancelInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceiveChangeRegistrationRequest":{"name":"SDLDidReceiveChangeRegistrationRequest","abstract":"<p>Name for a ChangeRegistration request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCloseApplicationRequest":{"name":"SDLDidReceiveCloseApplicationRequest","abstract":"<p>Name for a CloseApplication request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetRequest":{"name":"SDLDidReceiveCreateInteractionChoiceSetRequest","abstract":"<p>Name for a CreateInteractionChoiceSet request RPC</p>"},"Constants.html#/c:@SDLDidReceiveCreateWindowRequest":{"name":"SDLDidReceiveCreateWindowRequest","abstract":"<p>Name for a CreateWindow request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteCommandRequest":{"name":"SDLDidReceiveDeleteCommandRequest","abstract":"<p>Name for a DeleteCommand request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteFileRequest":{"name":"SDLDidReceiveDeleteFileRequest","abstract":"<p>Name for a DeleteFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetRequest":{"name":"SDLDidReceiveDeleteInteractionChoiceSetRequest","abstract":"<p>Name for a DeleteInteractionChoiceSet request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteSubMenuRequest":{"name":"SDLDidReceiveDeleteSubMenuRequest","abstract":"<p>Name for a DeleteSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDeleteWindowRequest":{"name":"SDLDidReceiveDeleteWindowRequest","abstract":"<p>Name for a DeleteSubMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageRequest":{"name":"SDLDidReceiveDiagnosticMessageRequest","abstract":"<p>Name for a DiagnosticMessage request RPC</p>"},"Constants.html#/c:@SDLDidReceiveDialNumberRequest":{"name":"SDLDidReceiveDialNumberRequest","abstract":"<p>Name for a DialNumberR request RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataRequest":{"name":"SDLDidReceiveEncodedSyncPDataRequest","abstract":"<p>Name for an EncodedSyncPData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruRequest":{"name":"SDLDidReceiveEndAudioPassThruRequest","abstract":"<p>Name for a EndAudioPass request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataRequest":{"name":"SDLDidReceiveGetAppServiceDataRequest","abstract":"<p>Name for a GetAppServiceData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesRequest":{"name":"SDLDidReceiveGetCloudAppPropertiesRequest","abstract":"<p>Name for a GetCloudAppProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetDTCsRequest":{"name":"SDLDidReceiveGetDTCsRequest","abstract":"<p>Name for a ReceiveGetDTCs request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetFileRequest":{"name":"SDLDidReceiveGetFileRequest","abstract":"<p>Name for a GetFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataRequest":{"name":"SDLDidReceiveGetInteriorVehicleDataRequest","abstract":"<p>Name for a GetInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataConsentRequest":{"name":"SDLDidReceiveGetInteriorVehicleDataConsentRequest","abstract":"<p>Name for a GetInteriorVehicleDataConsent request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilityRequest":{"name":"SDLDidReceiveGetSystemCapabilityRequest","abstract":"<p>Name for a GetSystemCapability request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetVehicleDataRequest":{"name":"SDLDidReceiveGetVehicleDataRequest","abstract":"<p>Name for a GetVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveGetWayPointsRequest":{"name":"SDLDidReceiveGetWayPointsRequest","abstract":"<p>Name for a GetWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveListFilesRequest":{"name":"SDLDidReceiveListFilesRequest","abstract":"<p>Name for a ListFiles request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionRequest":{"name":"SDLDidReceivePerformAppServiceInteractionRequest","abstract":"<p>Name for a PerformAppServiceInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruRequest":{"name":"SDLDidReceivePerformAudioPassThruRequest","abstract":"<p>Name for a PerformAudioPassThru request RPC</p>"},"Constants.html#/c:@SDLDidReceivePerformInteractionRequest":{"name":"SDLDidReceivePerformInteractionRequest","abstract":"<p>Name for a PerformInteraction request RPC</p>"},"Constants.html#/c:@SDLDidReceivePublishAppServiceRequest":{"name":"SDLDidReceivePublishAppServiceRequest","abstract":"<p>Name for a PublishAppService request RPC</p>"},"Constants.html#/c:@SDLDidReceivePutFileRequest":{"name":"SDLDidReceivePutFileRequest","abstract":"<p>Name for a PutFile request RPC</p>"},"Constants.html#/c:@SDLDidReceiveReadDIDRequest":{"name":"SDLDidReceiveReadDIDRequest","abstract":"<p>Name for a ReadDID request RPC</p>"},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceRequest":{"name":"SDLDidReceiveRegisterAppInterfaceRequest","abstract":"<p>Name for a RegisterAppInterfacr request RPC</p>"},"Constants.html#/c:@SDLDidReceiveReleaseInteriorVehicleDataModuleRequest":{"name":"SDLDidReceiveReleaseInteriorVehicleDataModuleRequest","abstract":"<p>Name for a ReleaseInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesRequest":{"name":"SDLDidReceiveResetGlobalPropertiesRequest","abstract":"<p>Name for a ResetGlobalProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveScrollableMessageRequest":{"name":"SDLDidReceiveScrollableMessageRequest","abstract":"<p>Name for a ScrollableMessage request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendHapticDataRequest":{"name":"SDLDidReceiveSendHapticDataRequest","abstract":"<p>Name for a SendHapticData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSendLocationRequest":{"name":"SDLDidReceiveSendLocationRequest","abstract":"<p>Name for a SendLocation request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetAppIconRequest":{"name":"SDLDidReceiveSetAppIconRequest","abstract":"<p>Name for a SetAppIcon request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesRequest":{"name":"SDLDidReceiveSetCloudAppPropertiesRequest","abstract":"<p>Name for a SetCloudProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutRequest":{"name":"SDLDidReceiveSetDisplayLayoutRequest","abstract":"<p>Name for a SetDisplayLayout request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesRequest":{"name":"SDLDidReceiveSetGlobalPropertiesRequest","abstract":"<p>Name for a SetGlobalProperties request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataRequest":{"name":"SDLDidReceiveSetInteriorVehicleDataRequest","abstract":"<p>Name for a SetInteriorVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerRequest":{"name":"SDLDidReceiveSetMediaClockTimerRequest","abstract":"<p>Name for a SetMediaClockTimer request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowRequest":{"name":"SDLDidReceiveShowRequest","abstract":"<p>Name for a Show request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowAppMenuRequest":{"name":"SDLDidReceiveShowAppMenuRequest","abstract":"<p>Name for a ShowAppMenu request RPC</p>"},"Constants.html#/c:@SDLDidReceiveShowConstantTBTRequest":{"name":"SDLDidReceiveShowConstantTBTRequest","abstract":"<p>Name for a ShowConstantTBT request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSliderRequest":{"name":"SDLDidReceiveSliderRequest","abstract":"<p>Name for a Slider request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSpeakRequest":{"name":"SDLDidReceiveSpeakRequest","abstract":"<p>Name for a Speak request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeButtonRequest":{"name":"SDLDidReceiveSubscribeButtonRequest","abstract":"<p>Name for a SubscribeButton request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataRequest":{"name":"SDLDidReceiveSubscribeVehicleDataRequest","abstract":"<p>Name for a SubscribeVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubscribeWayPointsRequest":{"name":"SDLDidReceiveSubscribeWayPointsRequest","abstract":"<p>Name for a SubscribeWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertRequest":{"name":"SDLDidReceiveSubtleAlertRequest","abstract":"<p>Name for a SubtleAlert request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataRequest":{"name":"SDLDidReceiveSyncPDataRequest","abstract":"<p>Name for a SyncPData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestRequest":{"name":"SDLDidReceiveSystemRequestRequest","abstract":"<p>Name for a SystemRequest request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnpublishAppServiceRequest":{"name":"SDLDidReceiveUnpublishAppServiceRequest","abstract":"<p>Name for an UnpublishAppService request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceRequest":{"name":"SDLDidReceiveUnregisterAppInterfaceRequest","abstract":"<p>Name for an UnregisterAppInterface request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonRequest":{"name":"SDLDidReceiveUnsubscribeButtonRequest","abstract":"<p>Name for an UnsubscribeButton request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataRequest":{"name":"SDLDidReceiveUnsubscribeVehicleDataRequest","abstract":"<p>Name for an UnsubscribeVehicleData request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUnsubscribeWayPointsRequest":{"name":"SDLDidReceiveUnsubscribeWayPointsRequest","abstract":"<p>Name for an UnsubscribeWayPoints request RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateTurnListRequest":{"name":"SDLDidReceiveUpdateTurnListRequest","abstract":"<p>Name for an UpdateTurnList request RPC</p>"},"Constants.html#/c:@SDLDidChangeDriverDistractionStateNotification":{"name":"SDLDidChangeDriverDistractionStateNotification","abstract":"<p>Name for a DriverDistractionState notification RPC</p>"},"Constants.html#/c:@SDLDidChangeHMIStatusNotification":{"name":"SDLDidChangeHMIStatusNotification","abstract":"<p>Name for a HMIStatus notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAppServiceDataNotification":{"name":"SDLDidReceiveAppServiceDataNotification","abstract":"<p>Name for an AppServiceData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAppUnregisteredNotification":{"name":"SDLDidReceiveAppUnregisteredNotification","abstract":"<p>Name for an AppUnregistered notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveAudioPassThruNotification":{"name":"SDLDidReceiveAudioPassThruNotification","abstract":"<p>Name for an AudioPassThru notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonEventNotification":{"name":"SDLDidReceiveButtonEventNotification","abstract":"<p>Name for a ButtonEvent notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveButtonPressNotification":{"name":"SDLDidReceiveButtonPressNotification","abstract":"<p>Name for a ButtonPress notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveCommandNotification":{"name":"SDLDidReceiveCommandNotification","abstract":"<p>Name for a Command notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveEncodedDataNotification":{"name":"SDLDidReceiveEncodedDataNotification","abstract":"<p>Name for a EncodedSyncPData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveInteriorVehicleDataNotification":{"name":"SDLDidReceiveInteriorVehicleDataNotification","abstract":"<p>Name for a InteriorVehicleData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveKeyboardInputNotification":{"name":"SDLDidReceiveKeyboardInputNotification","abstract":"<p>Name for a KeyboardInput notification RPC</p>"},"Constants.html#/c:@SDLDidChangeLanguageNotification":{"name":"SDLDidChangeLanguageNotification","abstract":"<p>Name for a Language notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveNewHashNotification":{"name":"SDLDidReceiveNewHashNotification","abstract":"<p>Name for a NewHash notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveVehicleIconNotification":{"name":"SDLDidReceiveVehicleIconNotification","abstract":"<p>Name for a VehicleIcon notification RPC</p>"},"Constants.html#/c:@SDLDidChangePermissionsNotification":{"name":"SDLDidChangePermissionsNotification","abstract":"<p>Name for a ChangePermissions notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSubtleAlertPressedNotification":{"name":"SDLDidReceiveSubtleAlertPressedNotification","abstract":"<p>Name for a SubtleAlertPressed notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveRemoteControlStatusNotification":{"name":"SDLDidReceiveRemoteControlStatusNotification","abstract":"<p>Name for a RemoteControlStatus notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSyncPDataNotification":{"name":"SDLDidReceiveSyncPDataNotification","abstract":"<p>Name for an OnSyncPData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemCapabilityUpdatedNotification":{"name":"SDLDidReceiveSystemCapabilityUpdatedNotification","abstract":"<p>Name for a SystemCapability notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveSystemRequestNotification":{"name":"SDLDidReceiveSystemRequestNotification","abstract":"<p>Name for a SystemRequest notification RPC</p>"},"Constants.html#/c:@SDLDidChangeTurnByTurnStateNotification":{"name":"SDLDidChangeTurnByTurnStateNotification","abstract":"<p>Name for a TurnByTurnStat notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveTouchEventNotification":{"name":"SDLDidReceiveTouchEventNotification","abstract":"<p>Name for a TouchEvent notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateFileNotification":{"name":"SDLDidReceiveUpdateFileNotification","abstract":"<p>Name for an OnUpdateFile notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveUpdateSubMenuNotification":{"name":"SDLDidReceiveUpdateSubMenuNotification","abstract":"<p>Name for an OnUpdateSubMenu notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveVehicleDataNotification":{"name":"SDLDidReceiveVehicleDataNotification","abstract":"<p>Name for a VehicleData notification RPC</p>"},"Constants.html#/c:@SDLDidReceiveWaypointNotification":{"name":"SDLDidReceiveWaypointNotification","abstract":"<p>Name for a Waypoint notification RPC</p>"},"Constants.html#/c:@SDLPRNDLPark":{"name":"SDLPRNDLPark","abstract":"<p>Park</p>"},"Constants.html#/c:@SDLPRNDLReverse":{"name":"SDLPRNDLReverse","abstract":"<p>Reverse gear</p>"},"Constants.html#/c:@SDLPRNDLNeutral":{"name":"SDLPRNDLNeutral","abstract":"<p>No gear</p>"},"Constants.html#/c:@SDLPRNDLDrive":{"name":"SDLPRNDLDrive","abstract":"<p>@abstract: Drive gear</p>"},"Constants.html#/c:@SDLPRNDLSport":{"name":"SDLPRNDLSport","abstract":"<p>Drive Sport mode</p>"},"Constants.html#/c:@SDLPRNDLLowGear":{"name":"SDLPRNDLLowGear","abstract":"<p>1st gear hold</p>"},"Constants.html#/c:@SDLPRNDLFirst":{"name":"SDLPRNDLFirst","abstract":"<p>First gear</p>"},"Constants.html#/c:@SDLPRNDLNinth":{"name":"SDLPRNDLNinth","abstract":"<p>Ninth gear"},"Constants.html#/c:@SDLPRNDLSecond":{"name":"SDLPRNDLSecond","abstract":"<p>Second gear</p>"},"Constants.html#/c:@SDLPRNDLTenth":{"name":"SDLPRNDLTenth","abstract":"<p>Tenth gear"},"Constants.html#/c:@SDLPRNDLThird":{"name":"SDLPRNDLThird","abstract":"<p>Third gear</p>"},"Constants.html#/c:@SDLPRNDLFourth":{"name":"SDLPRNDLFourth","abstract":"<p>Fourth gear</p>"},"Constants.html#/c:@SDLPRNDLFifth":{"name":"SDLPRNDLFifth","abstract":"<p>Fifth gear</p>"},"Constants.html#/c:@SDLPRNDLSixth":{"name":"SDLPRNDLSixth","abstract":"<p>Sixth gear</p>"},"Constants.html#/c:@SDLPRNDLSeventh":{"name":"SDLPRNDLSeventh","abstract":"<p>Seventh gear</p>"},"Constants.html#/c:@SDLPRNDLEighth":{"name":"SDLPRNDLEighth","abstract":"<p>Eighth gear</p>"},"Constants.html#/c:@SDLPRNDLUnknown":{"name":"SDLPRNDLUnknown","abstract":"<p>Unknown</p>"},"Constants.html#/c:@SDLPRNDLFault":{"name":"SDLPRNDLFault","abstract":"<p>Fault</p>"},"Constants.html#/c:@SDLPermissionStatusAllowed":{"name":"SDLPermissionStatusAllowed","abstract":"<p>permission: allowed</p>"},"Constants.html#/c:@SDLPermissionStatusDisallowed":{"name":"SDLPermissionStatusDisallowed","abstract":"<p>permission: disallowed</p>"},"Constants.html#/c:@SDLPermissionStatusUserDisallowed":{"name":"SDLPermissionStatusUserDisallowed","abstract":"<p>permission: user disallowed</p>"},"Constants.html#/c:@SDLPermissionStatusUserConsentPending":{"name":"SDLPermissionStatusUserConsentPending","abstract":"<p>permission: user consent pending</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusUndefined":{"name":"SDLPowerModeQualificationStatusUndefined","abstract":"<p>An undefined status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusEvaluationInProgress":{"name":"SDLPowerModeQualificationStatusEvaluationInProgress","abstract":"<p>An &ldquo;evaluation in progress&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusNotDefined":{"name":"SDLPowerModeQualificationStatusNotDefined","abstract":"<p>A &ldquo;not defined&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeQualificationStatusOk":{"name":"SDLPowerModeQualificationStatusOk","abstract":"<p>An &ldquo;ok&rdquo; status</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyOut":{"name":"SDLPowerModeStatusKeyOut","abstract":"<p>The key is not in the ignition, and the power is off</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyRecentlyOut":{"name":"SDLPowerModeStatusKeyRecentlyOut","abstract":"<p>The key is not in the ignition and it was just recently removed</p>"},"Constants.html#/c:@SDLPowerModeStatusKeyApproved":{"name":"SDLPowerModeStatusKeyApproved","abstract":"<p>The key is not in the ignition, but an approved key is available</p>"},"Constants.html#/c:@SDLPowerModeStatusPostAccessory":{"name":"SDLPowerModeStatusPostAccessory","abstract":"<p>We are in a post-accessory power situation</p>"},"Constants.html#/c:@SDLPowerModeStatusAccessory":{"name":"SDLPowerModeStatusAccessory","abstract":"<p>The car is in accessory power mode</p>"},"Constants.html#/c:@SDLPowerModeStatusPostIgnition":{"name":"SDLPowerModeStatusPostIgnition","abstract":"<p>We are in a post-ignition power situation</p>"},"Constants.html#/c:@SDLPowerModeStatusIgnitionOn":{"name":"SDLPowerModeStatusIgnitionOn","abstract":"<p>The ignition is on but the car is not yet running</p>"},"Constants.html#/c:@SDLPowerModeStatusRunning":{"name":"SDLPowerModeStatusRunning","abstract":"<p>The ignition is on and the car is running</p>"},"Constants.html#/c:@SDLPowerModeStatusCrank":{"name":"SDLPowerModeStatusCrank","abstract":"<p>We are in a crank power situation</p>"},"Constants.html#/c:@SDLPredefinedLayoutDefault":{"name":"SDLPredefinedLayoutDefault","abstract":"<p>A default layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutMedia":{"name":"SDLPredefinedLayoutMedia","abstract":"<p>The default media layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutNonMedia":{"name":"SDLPredefinedLayoutNonMedia","abstract":"<p>The default non-media layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutOnscreenPresets":{"name":"SDLPredefinedLayoutOnscreenPresets","abstract":"<p>A media layout containing preset buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationFullscreenMap":{"name":"SDLPredefinedLayoutNavigationFullscreenMap","abstract":"<p>The default navigation layout with a fullscreen map</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationList":{"name":"SDLPredefinedLayoutNavigationList","abstract":"<p>A list layout used for navigation apps</p>"},"Constants.html#/c:@SDLPredefinedLayoutNavigationKeyboard":{"name":"SDLPredefinedLayoutNavigationKeyboard","abstract":"<p>A keyboard layout used for navigation apps</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithText":{"name":"SDLPredefinedLayoutGraphicWithText","abstract":"<p>A layout with a single graphic on the left and text on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextWithGraphic":{"name":"SDLPredefinedLayoutTextWithGraphic","abstract":"<p>A layout with text on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTilesOnly":{"name":"SDLPredefinedLayoutTilesOnly","abstract":"<p>A layout with only softbuttons placed in a tile layout</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsOnly":{"name":"SDLPredefinedLayoutTextButtonsOnly","abstract":"<p>A layout with only soft buttons that only accept text</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTiles":{"name":"SDLPredefinedLayoutGraphicWithTiles","abstract":"<p>A layout with a single graphic on the left and soft buttons in a tile layout on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTilesWithGraphic":{"name":"SDLPredefinedLayoutTilesWithGraphic","abstract":"<p>A layout with soft buttons in a tile layout on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextAndSoftButtons":{"name":"SDLPredefinedLayoutGraphicWithTextAndSoftButtons","abstract":"<p>A layout with a single graphic on the left and both text and soft buttons on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextAndSoftButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextAndSoftButtonsWithGraphic","abstract":"<p>A layout with both text and soft buttons on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextButtons":{"name":"SDLPredefinedLayoutGraphicWithTextButtons","abstract":"<p>A layout with a single graphic on the left and text-only soft buttons on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextButtonsWithGraphic","abstract":"<p>A layout with text-only soft buttons on the left and a single graphic on the right</p>"},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutLargeGraphicWithSoftButtons","abstract":"<p>A layout with a single large graphic and soft buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutDoubleGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutDoubleGraphicWithSoftButtons","abstract":"<p>A layout with two graphics and soft buttons</p>"},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicOnly":{"name":"SDLPredefinedLayoutLargeGraphicOnly","abstract":"<p>A layout with only a single large graphic</p>"},"Constants.html#/c:@SDLPredefinedLayoutWebView":{"name":"SDLPredefinedLayoutWebView","abstract":"<p>Custom root template allowing in-vehicle WebEngine applications with"},"Constants.html#/c:@SDLPrerecordedSpeechHelp":{"name":"SDLPrerecordedSpeechHelp","abstract":"<p>A prerecorded help prompt</p>"},"Constants.html#/c:@SDLPrerecordedSpeechInitial":{"name":"SDLPrerecordedSpeechInitial","abstract":"<p>A prerecorded initial prompt</p>"},"Constants.html#/c:@SDLPrerecordedSpeechListen":{"name":"SDLPrerecordedSpeechListen","abstract":"<p>A prerecorded listen prompt is available</p>"},"Constants.html#/c:@SDLPrerecordedSpeechPositive":{"name":"SDLPrerecordedSpeechPositive","abstract":"<p>A prerecorded positive indicator noise is available</p>"},"Constants.html#/c:@SDLPrerecordedSpeechNegative":{"name":"SDLPrerecordedSpeechNegative","abstract":"<p>A prerecorded negative indicator noise is available</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceNoSourceSelected":{"name":"SDLPrimaryAudioSourceNoSourceSelected","abstract":"<p>Currently no source selected</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceUSB":{"name":"SDLPrimaryAudioSourceUSB","abstract":"<p>USB is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceUSB2":{"name":"SDLPrimaryAudioSourceUSB2","abstract":"<p>USB2 is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceBluetoothStereo":{"name":"SDLPrimaryAudioSourceBluetoothStereo","abstract":"<p>Bluetooth Stereo is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceLineIn":{"name":"SDLPrimaryAudioSourceLineIn","abstract":"<p>Line in is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceIpod":{"name":"SDLPrimaryAudioSourceIpod","abstract":"<p>iPod is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceMobileApp":{"name":"SDLPrimaryAudioSourceMobileApp","abstract":"<p>Mobile app is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceCD":{"name":"SDLPrimaryAudioSourceCD","abstract":"<p>@abstract CD is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceAM":{"name":"SDLPrimaryAudioSourceAM","abstract":"<p>@abstract Radio frequency AM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceFM":{"name":"SDLPrimaryAudioSourceFM","abstract":"<p>@abstract Radio frequency FM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceXM":{"name":"SDLPrimaryAudioSourceXM","abstract":"<p>@abstract Radio frequency XM is current source</p>"},"Constants.html#/c:@SDLPrimaryAudioSourceDAB":{"name":"SDLPrimaryAudioSourceDAB","abstract":"<p>@abstract Radio frequency DAB is current source</p>"},"Constants.html#/c:@SDLRPCFunctionNameAddCommand":{"name":"SDLRPCFunctionNameAddCommand","abstract":"<p>Function name for an AddCommand RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAddSubMenu":{"name":"SDLRPCFunctionNameAddSubMenu","abstract":"<p>Function name for an AddSubMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAlert":{"name":"SDLRPCFunctionNameAlert","abstract":"<p>Function name for an Alert RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameAlertManeuver":{"name":"SDLRPCFunctionNameAlertManeuver","abstract":"<p>Function name for an AlertManeuver RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameButtonPress":{"name":"SDLRPCFunctionNameButtonPress","abstract":"<p>Function name for a ButtonPress RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCancelInteraction":{"name":"SDLRPCFunctionNameCancelInteraction","abstract":"<p>Function name for a CancelInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameChangeRegistration":{"name":"SDLRPCFunctionNameChangeRegistration","abstract":"<p>Function name for a ChangeRegistration RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCloseApplication":{"name":"SDLRPCFunctionNameCloseApplication","abstract":"<p>Function name for a CloseApplication RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCreateInteractionChoiceSet":{"name":"SDLRPCFunctionNameCreateInteractionChoiceSet","abstract":"<p>Function name for a CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteCommand":{"name":"SDLRPCFunctionNameDeleteCommand","abstract":"<p>Function name for a DeleteCommand RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteFile":{"name":"SDLRPCFunctionNameDeleteFile","abstract":"<p>Function name for a DeleteFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteInteractionChoiceSet":{"name":"SDLRPCFunctionNameDeleteInteractionChoiceSet","abstract":"<p>Function name for a DeleteInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteSubMenu":{"name":"SDLRPCFunctionNameDeleteSubMenu","abstract":"<p>Function name for a DeleteSubMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDiagnosticMessage":{"name":"SDLRPCFunctionNameDiagnosticMessage","abstract":"<p>Function name for a DiagnosticMessage RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDialNumber":{"name":"SDLRPCFunctionNameDialNumber","abstract":"<p>Function name for a DialNumber RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameEncodedSyncPData":{"name":"SDLRPCFunctionNameEncodedSyncPData","abstract":"<p>Function name for an CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameEndAudioPassThru":{"name":"SDLRPCFunctionNameEndAudioPassThru","abstract":"<p>Function name for an EndAudioPassThru RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGenericResponse":{"name":"SDLRPCFunctionNameGenericResponse","abstract":"<p>Function name for an GenricResponse Response RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetAppServiceData":{"name":"SDLRPCFunctionNameGetAppServiceData","abstract":"<p>Function name for an CreateInteractionChoiceSet RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetDTCs":{"name":"SDLRPCFunctionNameGetDTCs","abstract":"<p>Function name for a GetDTCs RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetFile":{"name":"SDLRPCFunctionNameGetFile","abstract":"<p>Function name for a GetFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetCloudAppProperties":{"name":"SDLRPCFunctionNameGetCloudAppProperties","abstract":"<p>Function name for a GetCloudAppProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetInteriorVehicleData":{"name":"SDLRPCFunctionNameGetInteriorVehicleData","abstract":"<p>Function name for a GetInteriorVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetInteriorVehicleDataConsent":{"name":"SDLRPCFunctionNameGetInteriorVehicleDataConsent","abstract":"<p>Function name for a GetInteriorVehicleDataConsent RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetSystemCapability":{"name":"SDLRPCFunctionNameGetSystemCapability","abstract":"<p>Function name for a GetSystemCapability RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetVehicleData":{"name":"SDLRPCFunctionNameGetVehicleData","abstract":"<p>Function name for a GetVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameGetWayPoints":{"name":"SDLRPCFunctionNameGetWayPoints","abstract":"<p>Function name for a GetWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameListFiles":{"name":"SDLRPCFunctionNameListFiles","abstract":"<p>Function name for a ListFiles RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppCapabilityUpdated":{"name":"SDLRPCFunctionNameOnAppCapabilityUpdated","abstract":"<p>Function name for an OnAppCapabilityUpdated notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppInterfaceUnregistered":{"name":"SDLRPCFunctionNameOnAppInterfaceUnregistered","abstract":"<p>Function name for an OnAppInterfaceUnregistered notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAppServiceData":{"name":"SDLRPCFunctionNameOnAppServiceData","abstract":"<p>Function name for an OnAppServiceData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnAudioPassThru":{"name":"SDLRPCFunctionNameOnAudioPassThru","abstract":"<p>Function name for an OnAudioPassThru notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnButtonEvent":{"name":"SDLRPCFunctionNameOnButtonEvent","abstract":"<p>Function name for an OnButtonEvent notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnButtonPress":{"name":"SDLRPCFunctionNameOnButtonPress","abstract":"<p>Function name for an OnButtonPress notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnCommand":{"name":"SDLRPCFunctionNameOnCommand","abstract":"<p>Function name for an OnCommand notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnDriverDistraction":{"name":"SDLRPCFunctionNameOnDriverDistraction","abstract":"<p>Function name for an OnDriverDistraction notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnEncodedSyncPData":{"name":"SDLRPCFunctionNameOnEncodedSyncPData","abstract":"<p>Function name for an OnEncodedSyncPData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnHashChange":{"name":"SDLRPCFunctionNameOnHashChange","abstract":"<p>Function name for an OnHashChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnHMIStatus":{"name":"SDLRPCFunctionNameOnHMIStatus","abstract":"<p>Function name for an OnHMIStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnInteriorVehicleData":{"name":"SDLRPCFunctionNameOnInteriorVehicleData","abstract":"<p>Function name for an OnInteriorVehicleData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnKeyboardInput":{"name":"SDLRPCFunctionNameOnKeyboardInput","abstract":"<p>Function name for an OnKeyboardInput notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnLanguageChange":{"name":"SDLRPCFunctionNameOnLanguageChange","abstract":"<p>Function name for an OnLanguageChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnLockScreenStatus":{"name":"SDLRPCFunctionNameOnLockScreenStatus","abstract":"<p>Function name for an OnLockScreenStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnPermissionsChange":{"name":"SDLRPCFunctionNameOnPermissionsChange","abstract":"<p>Function name for an OnPermissionsChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnRCStatus":{"name":"SDLRPCFunctionNameOnRCStatus","abstract":"<p>Function name for an OnRCStatus notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSubtleAlertPressed":{"name":"SDLRPCFunctionNameOnSubtleAlertPressed","abstract":"<p>Function name for an SubtleAlertPressed notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSyncPData":{"name":"SDLRPCFunctionNameOnSyncPData","abstract":"<p>Function name for an OnSyncPData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSystemCapabilityUpdated":{"name":"SDLRPCFunctionNameOnSystemCapabilityUpdated","abstract":"<p>Function name for an OnSystemCapabilityUpdated notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnSystemRequest":{"name":"SDLRPCFunctionNameOnSystemRequest","abstract":"<p>Function name for an OnSystemRequest notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnTBTClientState":{"name":"SDLRPCFunctionNameOnTBTClientState","abstract":"<p>Function name for an OnTBTClientState notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnTouchEvent":{"name":"SDLRPCFunctionNameOnTouchEvent","abstract":"<p>Function name for an OnTouchEvent notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnUpdateFile":{"name":"SDLRPCFunctionNameOnUpdateFile","abstract":"<p>Function name for an OnUpdateFile notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnUpdateSubMenu":{"name":"SDLRPCFunctionNameOnUpdateSubMenu","abstract":"<p>Function name for an OnUpdateSubMenu notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnVehicleData":{"name":"SDLRPCFunctionNameOnVehicleData","abstract":"<p>Function name for an OnVehicleData notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameOnWayPointChange":{"name":"SDLRPCFunctionNameOnWayPointChange","abstract":"<p>Function name for an OnWayPointChange notification RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformAppServiceInteraction":{"name":"SDLRPCFunctionNamePerformAppServiceInteraction","abstract":"<p>Function name for a PerformAppServiceInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformAudioPassThru":{"name":"SDLRPCFunctionNamePerformAudioPassThru","abstract":"<p>Function name for a PerformAppServiceInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePerformInteraction":{"name":"SDLRPCFunctionNamePerformInteraction","abstract":"<p>Function name for a PerformInteraction RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePublishAppService":{"name":"SDLRPCFunctionNamePublishAppService","abstract":"<p>Function name for a PublishAppService RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNamePutFile":{"name":"SDLRPCFunctionNamePutFile","abstract":"<p>Function name for a PutFile RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReadDID":{"name":"SDLRPCFunctionNameReadDID","abstract":"<p>Function name for a ReadDID RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReleaseInteriorVehicleDataModule":{"name":"SDLRPCFunctionNameReleaseInteriorVehicleDataModule","abstract":"<p>Function name for a ReleaseInteriorVehicleDataModule RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameRegisterAppInterface":{"name":"SDLRPCFunctionNameRegisterAppInterface","abstract":"<p>Function name for a RegisterAppInterface RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameReserved":{"name":"SDLRPCFunctionNameReserved","abstract":"<p>Function name for a Reserved RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameResetGlobalProperties":{"name":"SDLRPCFunctionNameResetGlobalProperties","abstract":"<p>Function name for a ResetGlobalProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameScrollableMessage":{"name":"SDLRPCFunctionNameScrollableMessage","abstract":"<p>Function name for a ScrollableMessage RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSendHapticData":{"name":"SDLRPCFunctionNameSendHapticData","abstract":"<p>Function name for a SendHapticData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSendLocation":{"name":"SDLRPCFunctionNameSendLocation","abstract":"<p>Function name for a SendLocation RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetAppIcon":{"name":"SDLRPCFunctionNameSetAppIcon","abstract":"<p>Function name for a SetAppIcon RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetCloudAppProperties":{"name":"SDLRPCFunctionNameSetCloudAppProperties","abstract":"<p>Function name for a SetCloudProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetDisplayLayout":{"name":"SDLRPCFunctionNameSetDisplayLayout","abstract":"<p>Function name for a SetDisplayLayout RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetGlobalProperties":{"name":"SDLRPCFunctionNameSetGlobalProperties","abstract":"<p>Function name for a SetGlobalProperties RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetInteriorVehicleData":{"name":"SDLRPCFunctionNameSetInteriorVehicleData","abstract":"<p>Function name for a SetInteriorVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSetMediaClockTimer":{"name":"SDLRPCFunctionNameSetMediaClockTimer","abstract":"<p>Function name for a SetMediaClockTimer RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShow":{"name":"SDLRPCFunctionNameShow","abstract":"<p>Function name for a Show RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShowAppMenu":{"name":"SDLRPCFunctionNameShowAppMenu","abstract":"<p>Function name for a ShowAppMenu RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameShowConstantTBT":{"name":"SDLRPCFunctionNameShowConstantTBT","abstract":"<p>Function name for a ShowConstantTBT RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSlider":{"name":"SDLRPCFunctionNameSlider","abstract":"<p>Function name for a Slider RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSpeak":{"name":"SDLRPCFunctionNameSpeak","abstract":"<p>Function name for a Speak RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeButton":{"name":"SDLRPCFunctionNameSubscribeButton","abstract":"<p>Function name for a SubscribeButton RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeVehicleData":{"name":"SDLRPCFunctionNameSubscribeVehicleData","abstract":"<p>Function name for a SubscribeVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubscribeWayPoints":{"name":"SDLRPCFunctionNameSubscribeWayPoints","abstract":"<p>Function name for a SubscribeWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSubtleAlert":{"name":"SDLRPCFunctionNameSubtleAlert","abstract":"<p>Function name for a SubtleAlert RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSyncPData":{"name":"SDLRPCFunctionNameSyncPData","abstract":"<p>Function name for a SyncPData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameSystemRequest":{"name":"SDLRPCFunctionNameSystemRequest","abstract":"<p>Function name for a SystemRequest RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnpublishAppService":{"name":"SDLRPCFunctionNameUnpublishAppService","abstract":"<p>Function name for an UnpublishAppService RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnregisterAppInterface":{"name":"SDLRPCFunctionNameUnregisterAppInterface","abstract":"<p>Function name for an UnregisterAppInterface RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeButton":{"name":"SDLRPCFunctionNameUnsubscribeButton","abstract":"<p>Function name for an UnsubscribeButton RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeVehicleData":{"name":"SDLRPCFunctionNameUnsubscribeVehicleData","abstract":"<p>Function name for an UnsubscribeVehicleData RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeWayPoints":{"name":"SDLRPCFunctionNameUnsubscribeWayPoints","abstract":"<p>Function name for an UnsubscribeWayPoints RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameUpdateTurnList":{"name":"SDLRPCFunctionNameUpdateTurnList","abstract":"<p>Function name for an UpdateTurnList RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameCreateWindow":{"name":"SDLRPCFunctionNameCreateWindow","abstract":"<p>Function name for a CreateWindow RPC</p>"},"Constants.html#/c:@SDLRPCFunctionNameDeleteWindow":{"name":"SDLRPCFunctionNameDeleteWindow","abstract":"<p>Function name for a DeleteWindow RPC</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameRequest":{"name":"SDLRPCMessageTypeNameRequest","abstract":"<p>A request that will require a response</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameResponse":{"name":"SDLRPCMessageTypeNameResponse","abstract":"<p>A response to a request</p>"},"Constants.html#/c:@SDLRPCMessageTypeNameNotification":{"name":"SDLRPCMessageTypeNameNotification","abstract":"<p>A message that does not have a response</p>"},"Constants.html#/c:@SDLRadioBandAM":{"name":"SDLRadioBandAM","abstract":"<p>Represents AM radio band</p>"},"Constants.html#/c:@SDLRadioBandFM":{"name":"SDLRadioBandFM","abstract":"<p>Represents FM radio band</p>"},"Constants.html#/c:@SDLRadioBandXM":{"name":"SDLRadioBandXM","abstract":"<p>Represents XM radio band</p>"},"Constants.html#/c:@SDLRadioStateAcquiring":{"name":"SDLRadioStateAcquiring","abstract":"<p>Represents Radio state as ACQUIRING</p>"},"Constants.html#/c:@SDLRadioStateAcquired":{"name":"SDLRadioStateAcquired","abstract":"<p>Represents Radio state as ACQUIRED</p>"},"Constants.html#/c:@SDLRadioStateMulticast":{"name":"SDLRadioStateMulticast","abstract":"<p>Represents Radio state as MULTICAST</p>"},"Constants.html#/c:@SDLRadioStateNotFound":{"name":"SDLRadioStateNotFound","abstract":"<p>Represents Radio state as NOT_FOUND</p>"},"Constants.html#/c:@SDLRequestTypeHTTP":{"name":"SDLRequestTypeHTTP","abstract":"<p>An HTTP request</p>"},"Constants.html#/c:@SDLRequestTypeFileResume":{"name":"SDLRequestTypeFileResume","abstract":"<p>A file resumption request</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationRequest":{"name":"SDLRequestTypeAuthenticationRequest","abstract":"<p>An authentication request</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationChallenge":{"name":"SDLRequestTypeAuthenticationChallenge","abstract":"<p>An authentication challenge</p>"},"Constants.html#/c:@SDLRequestTypeAuthenticationAck":{"name":"SDLRequestTypeAuthenticationAck","abstract":"<p>An authentication acknowledgment</p>"},"Constants.html#/c:@SDLRequestTypeProprietary":{"name":"SDLRequestTypeProprietary","abstract":"<p>An proprietary formatted request</p>"},"Constants.html#/c:@SDLRequestTypeQueryApps":{"name":"SDLRequestTypeQueryApps","abstract":"<p>An Query Apps request</p>"},"Constants.html#/c:@SDLRequestTypeLaunchApp":{"name":"SDLRequestTypeLaunchApp","abstract":"<p>A Launch Apps request</p>"},"Constants.html#/c:@SDLRequestTypeLockScreenIconURL":{"name":"SDLRequestTypeLockScreenIconURL","abstract":"<p>The URL for a lock screen icon</p>"},"Constants.html#/c:@SDLRequestTypeTrafficMessageChannel":{"name":"SDLRequestTypeTrafficMessageChannel","abstract":"<p>A traffic message channel request</p>"},"Constants.html#/c:@SDLRequestTypeDriverProfile":{"name":"SDLRequestTypeDriverProfile","abstract":"<p>A driver profile request</p>"},"Constants.html#/c:@SDLRequestTypeVoiceSearch":{"name":"SDLRequestTypeVoiceSearch","abstract":"<p>A voice search request</p>"},"Constants.html#/c:@SDLRequestTypeNavigation":{"name":"SDLRequestTypeNavigation","abstract":"<p>A navigation request</p>"},"Constants.html#/c:@SDLRequestTypePhone":{"name":"SDLRequestTypePhone","abstract":"<p>A phone request</p>"},"Constants.html#/c:@SDLRequestTypeClimate":{"name":"SDLRequestTypeClimate","abstract":"<p>A climate request</p>"},"Constants.html#/c:@SDLRequestTypeSettings":{"name":"SDLRequestTypeSettings","abstract":"<p>A settings request</p>"},"Constants.html#/c:@SDLRequestTypeVehicleDiagnostics":{"name":"SDLRequestTypeVehicleDiagnostics","abstract":"<p>A vehicle diagnostics request</p>"},"Constants.html#/c:@SDLRequestTypeEmergency":{"name":"SDLRequestTypeEmergency","abstract":"<p>An emergency request</p>"},"Constants.html#/c:@SDLRequestTypeMedia":{"name":"SDLRequestTypeMedia","abstract":"<p>A media request</p>"},"Constants.html#/c:@SDLRequestTypeFOTA":{"name":"SDLRequestTypeFOTA","abstract":"<p>A firmware over-the-air request</p>"},"Constants.html#/c:@SDLRequestTypeOEMSpecific":{"name":"SDLRequestTypeOEMSpecific","abstract":"<p>A request that is OEM specific using the <code>RequestSubType</code> in SystemRequest</p>"},"Constants.html#/c:@SDLRequestTypeIconURL":{"name":"SDLRequestTypeIconURL","abstract":"<p>A request for an icon url</p>"},"Constants.html#/c:@SDLResultSuccess":{"name":"SDLResultSuccess","abstract":"<p>The request succeeded</p>"},"Constants.html#/c:@SDLResultInvalidData":{"name":"SDLResultInvalidData","abstract":"<p>The request contained invalid data</p>"},"Constants.html#/c:@SDLResultCharacterLimitExceeded":{"name":"SDLResultCharacterLimitExceeded","abstract":"<p>The request had a string containing too many characters</p>"},"Constants.html#/c:@SDLResultUnsupportedRequest":{"name":"SDLResultUnsupportedRequest","abstract":"<p>The request is not supported by the IVI unit implementing SDL</p>"},"Constants.html#/c:@SDLResultOutOfMemory":{"name":"SDLResultOutOfMemory","abstract":"<p>The system could not process the request because the necessary memory couldn&rsquo;t be allocated</p>"},"Constants.html#/c:@SDLResultTooManyPendingRequests":{"name":"SDLResultTooManyPendingRequests","abstract":"<p>There are too many requests pending (means that the response has not been delivered yet).</p>"},"Constants.html#/c:@SDLResultInvalidId":{"name":"SDLResultInvalidId","abstract":"<p>One of the provided IDs is not valid.</p>"},"Constants.html#/c:@SDLResultDuplicateName":{"name":"SDLResultDuplicateName","abstract":"<p>The provided name or synonym is a duplicate of some already-defined name or synonym.</p>"},"Constants.html#/c:@SDLResultTooManyApplications":{"name":"SDLResultTooManyApplications","abstract":"<p>There are already too many registered applications.</p>"},"Constants.html#/c:@SDLResultApplicationRegisteredAlready":{"name":"SDLResultApplicationRegisteredAlready","abstract":"<p>RegisterAppInterface has been called, but this app is already registered</p>"},"Constants.html#/c:@SDLResultUnsupportedVersion":{"name":"SDLResultUnsupportedVersion","abstract":"<p>The Head Unit doesn&rsquo;t support the SDL version that is requested by the mobile application.</p>"},"Constants.html#/c:@SDLResultWrongLanguage":{"name":"SDLResultWrongLanguage","abstract":"<p>The requested language is currently not supported. This might be because of a mismatch of the currently active language on the head unit and the requested language.</p>"},"Constants.html#/c:@SDLResultApplicationNotRegistered":{"name":"SDLResultApplicationNotRegistered","abstract":"<p>A command can not be executed because no application has been registered with RegisterApplication.</p>"},"Constants.html#/c:@SDLResultInUse":{"name":"SDLResultInUse","abstract":"<p>The data may not be changed, because it is currently in use. For example when trying to delete a choice set that is currently involved in an interaction.</p>"},"Constants.html#/c:@SDLResultVehicleDataNotAllowed":{"name":"SDLResultVehicleDataNotAllowed","abstract":"<p>The user has turned off access to vehicle data, and it is globally unavailable to mobile applications.</p>"},"Constants.html#/c:@SDLResultVehicleDataNotAvailable":{"name":"SDLResultVehicleDataNotAvailable","abstract":"<p>The requested vehicle data is not available on this vehicle or is not published.</p>"},"Constants.html#/c:@SDLResultRejected":{"name":"SDLResultRejected","abstract":"<p>The requested command was rejected, e.g. because the mobile app is in background and cannot perform any HMI commands, or an HMI command (e.g. Speak) is rejected because a higher priority HMI command (e.g. Alert) is playing.</p>"},"Constants.html#/c:@SDLResultAborted":{"name":"SDLResultAborted","abstract":"<p>A command was aborted, e.g. due to user interaction (user pressed button), or an HMI command (e.g. Speak) is aborted because a higher priority HMI command (e.g. Alert) was requested.</p>"},"Constants.html#/c:@SDLResultIgnored":{"name":"SDLResultIgnored","abstract":"<p>A command was ignored, because the intended result is already in effect. For example, SetMediaClockTimer was used to pause the media clock although the clock is paused already.</p>"},"Constants.html#/c:@SDLResultUnsupportedResource":{"name":"SDLResultUnsupportedResource","abstract":"<p>A button that was requested for subscription is not supported under the current system.</p>"},"Constants.html#/c:@SDLResultFileNotFound":{"name":"SDLResultFileNotFound","abstract":"<p>A specified file could not be found on the head unit.</p>"},"Constants.html#/c:@SDLResultGenericError":{"name":"SDLResultGenericError","abstract":"<p>Provided data is valid but something went wrong in the lower layers.</p>"},"Constants.html#/c:@SDLResultDisallowed":{"name":"SDLResultDisallowed","abstract":"<p>RPC is not authorized in local policy table.</p>"},"Constants.html#/c:@SDLResultUserDisallowed":{"name":"SDLResultUserDisallowed","abstract":"<p>RPC is included in a functional group explicitly blocked by the user.</p>"},"Constants.html#/c:@SDLResultTimedOut":{"name":"SDLResultTimedOut","abstract":"<p>Overlay reached the maximum timeout and closed.</p>"},"Constants.html#/c:@SDLResultCancelRoute":{"name":"SDLResultCancelRoute","abstract":"<p>User selected to Cancel Route.</p>"},"Constants.html#/c:@SDLResultCorruptedData":{"name":"SDLResultCorruptedData","abstract":"<p>The data sent failed to pass CRC check in receiver end.</p>"},"Constants.html#/c:@SDLResultTruncatedData":{"name":"SDLResultTruncatedData","abstract":"<p>The RPC (e.g. ReadDID) executed successfully but the data exceeded the platform maximum threshold and thus, only part of the data is available.</p>"},"Constants.html#/c:@SDLResultRetry":{"name":"SDLResultRetry","abstract":"<p>The user interrupted the RPC (e.g. PerformAudioPassThru) and indicated to start over. Note, the app must issue the new RPC.</p>"},"Constants.html#/c:@SDLResultWarnings":{"name":"SDLResultWarnings","abstract":"<p>The RPC (e.g. SubscribeVehicleData) executed successfully but one or more items have a warning or failure.</p>"},"Constants.html#/c:@SDLResultSaved":{"name":"SDLResultSaved","abstract":"<p>The RPC (e.g. Slider) executed successfully and the user elected to save the current position / value.</p>"},"Constants.html#/c:@SDLResultInvalidCertificate":{"name":"SDLResultInvalidCertificate","abstract":"<p>The certificate provided during authentication is invalid.</p>"},"Constants.html#/c:@SDLResultExpiredCertificate":{"name":"SDLResultExpiredCertificate","abstract":"<p>The certificate provided during authentication is expired.</p>"},"Constants.html#/c:@SDLResultResumeFailed":{"name":"SDLResultResumeFailed","abstract":"<p>The provided hash ID does not match the hash of the current set of registered data or the core could not resume the previous data.</p>"},"Constants.html#/c:@SDLResultDataNotAvailable":{"name":"SDLResultDataNotAvailable","abstract":"<p>The requested data is not available on this vehicle or is not published for the connected app.</p>"},"Constants.html#/c:@SDLResultReadOnly":{"name":"SDLResultReadOnly","abstract":"<p>The requested data is read only thus cannot be change via remote control .</p>"},"Constants.html#/c:@SDLResultEncryptionNeeded":{"name":"SDLResultEncryptionNeeded","abstract":"<p>The RPC request needs to be encrypted.</p>"},"Constants.html#/c:@SDLSamplingRate8KHZ":{"name":"SDLSamplingRate8KHZ","abstract":"<p>Sampling rate of 8 kHz</p>"},"Constants.html#/c:@SDLSamplingRate16KHZ":{"name":"SDLSamplingRate16KHZ","abstract":"<p>Sampling rate of 16 kHz</p>"},"Constants.html#/c:@SDLSamplingRate22KHZ":{"name":"SDLSamplingRate22KHZ","abstract":"<p>Sampling rate of 22 kHz</p>"},"Constants.html#/c:@SDLSamplingRate44KHZ":{"name":"SDLSamplingRate44KHZ","abstract":"<p>Sampling rate of 44 kHz</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeSave":{"name":"SDLSeatMemoryActionTypeSave","abstract":"<p>@abstract Save current seat positions and settings to seat memory.</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeRestore":{"name":"SDLSeatMemoryActionTypeRestore","abstract":"<p>@abstract Restore / apply the seat memory settings to the current seat.</p>"},"Constants.html#/c:@SDLSeatMemoryActionTypeNone":{"name":"SDLSeatMemoryActionTypeNone","abstract":"<p>@abstract No action to be performed.</p>"},"Constants.html#/c:@SDLSeekIndicatorTypeTrack":{"name":"SDLSeekIndicatorTypeTrack","abstract":"<p>Seek indicator UI that is appropriate for skipping tracks</p>"},"Constants.html#/c:@SDLSeekIndicatorTypeTime":{"name":"SDLSeekIndicatorTypeTime","abstract":"<p>Seek indicator UI that is appropriate for skipping time</p>"},"Constants.html#/c:@SDLServiceUpdateReasonPublished":{"name":"SDLServiceUpdateReasonPublished","abstract":"<p>The service has just been published with the module and once activated to the primary service of its type, it will be ready for possible consumption.</p>"},"Constants.html#/c:@SDLServiceUpdatePublished":{"name":"SDLServiceUpdatePublished","abstract":"<p>The service has just been published with the module and once activated to the primary service of its type, it will be ready for possible consumption.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonRemoved":{"name":"SDLServiceUpdateReasonRemoved","abstract":"<p>The service has just been unpublished with the module and is no longer accessible.</p>"},"Constants.html#/c:@SDLServiceUpdateRemoved":{"name":"SDLServiceUpdateRemoved","abstract":"<p>The service has just been unpublished with the module and is no longer accessible.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonActivated":{"name":"SDLServiceUpdateReasonActivated","abstract":"<p>The service is activated as the primary service of this type. All requests dealing with this service type will be handled by this service.</p>"},"Constants.html#/c:@SDLServiceUpdateActivated":{"name":"SDLServiceUpdateActivated","abstract":"<p>The service is activated as the primary service of this type. All requests dealing with this service type will be handled by this service.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonDeactivated":{"name":"SDLServiceUpdateReasonDeactivated","abstract":"<p>The service has been deactivated as the primary service of its type.</p>"},"Constants.html#/c:@SDLServiceUpdateDeactivated":{"name":"SDLServiceUpdateDeactivated","abstract":"<p>The service has been deactivated as the primary service of its type.</p>"},"Constants.html#/c:@SDLServiceUpdateReasonManifestUpdate":{"name":"SDLServiceUpdateReasonManifestUpdate","abstract":"<p>The service has updated its manifest. This could imply updated capabilities.</p>"},"Constants.html#/c:@SDLServiceUpdateManifestUpdate":{"name":"SDLServiceUpdateManifestUpdate","abstract":"<p>The service has updated its manifest. This could imply updated capabilities.</p>"},"Constants.html#/c:@SDLSoftButtonTypeText":{"name":"SDLSoftButtonTypeText","abstract":"<p>Text kind Softbutton</p>"},"Constants.html#/c:@SDLSoftButtonTypeImage":{"name":"SDLSoftButtonTypeImage","abstract":"<p>Image kind Softbutton</p>"},"Constants.html#/c:@SDLSoftButtonTypeBoth":{"name":"SDLSoftButtonTypeBoth","abstract":"<p>Both (Text &amp; Image) kind Softbutton</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesText":{"name":"SDLSpeechCapabilitiesText","abstract":"<p>The SDL platform can speak text phrases.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesSAPIPhonemes":{"name":"SDLSpeechCapabilitiesSAPIPhonemes","abstract":"<p>The SDL platform can speak SAPI Phonemes.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesLHPlusPhonemes":{"name":"SDLSpeechCapabilitiesLHPlusPhonemes","abstract":"<p>The SDL platform can speak LHPlus Phonemes.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesPrerecorded":{"name":"SDLSpeechCapabilitiesPrerecorded","abstract":"<p>The SDL platform can speak Prerecorded indicators and prompts.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesSilence":{"name":"SDLSpeechCapabilitiesSilence","abstract":"<p>The SDL platform can speak Silence.</p>"},"Constants.html#/c:@SDLSpeechCapabilitiesFile":{"name":"SDLSpeechCapabilitiesFile","abstract":"<p>The SDL platform can play a file</p>"},"Constants.html#/c:@SDLStaticIconNameAcceptCall":{"name":"SDLStaticIconNameAcceptCall","abstract":"<p>Static icon accept call / active phone call in progress / initiate a phone call</p>"},"Constants.html#/c:@SDLStaticIconNameAddWaypoint":{"name":"SDLStaticIconNameAddWaypoint","abstract":"<p>Static icon add waypoint</p>"},"Constants.html#/c:@SDLStaticIconNameAlbum":{"name":"SDLStaticIconNameAlbum","abstract":"<p>Static icon album</p>"},"Constants.html#/c:@SDLStaticIconNameAmbientLighting":{"name":"SDLStaticIconNameAmbientLighting","abstract":"<p>Static icon ambient lighting</p>"},"Constants.html#/c:@SDLStaticIconNameArrowNorth":{"name":"SDLStaticIconNameArrowNorth","abstract":"<p>Static icon arrow - north</p>"},"Constants.html#/c:@SDLStaticIconNameAudioMute":{"name":"SDLStaticIconNameAudioMute","abstract":"<p>Static icon audio mute</p>"},"Constants.html#/c:@SDLStaticIconNameAudiobookEpisode":{"name":"SDLStaticIconNameAudiobookEpisode","abstract":"<p>Static icon audiobook episode</p>"},"Constants.html#/c:@SDLStaticIconNameAudiobookNarrator":{"name":"SDLStaticIconNameAudiobookNarrator","abstract":"<p>Static icon audiobook narrator</p>"},"Constants.html#/c:@SDLStaticIconNameAuxillaryAudio":{"name":"SDLStaticIconNameAuxillaryAudio","abstract":"<p>Static icon auxiliary audio</p>"},"Constants.html#/c:@SDLStaticIconNameAuxiliaryAudio":{"name":"SDLStaticIconNameAuxiliaryAudio","abstract":"<p>Static icon auxiliary audio</p>"},"Constants.html#/c:@SDLStaticIconNameBack":{"name":"SDLStaticIconNameBack","abstract":"<p>Static icon back / return</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity0Of5":{"name":"SDLStaticIconNameBatteryCapacity0Of5","abstract":"<p>Static icon battery capacity 0 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity1Of5":{"name":"SDLStaticIconNameBatteryCapacity1Of5","abstract":"<p>Static icon battery capacity 1 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity2Of5":{"name":"SDLStaticIconNameBatteryCapacity2Of5","abstract":"<p>Static icon battery capacity 2 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity3Of5":{"name":"SDLStaticIconNameBatteryCapacity3Of5","abstract":"<p>Static icon battery capacity 3 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity4Of5":{"name":"SDLStaticIconNameBatteryCapacity4Of5","abstract":"<p>Static icon battery capacity 4 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity5Of5":{"name":"SDLStaticIconNameBatteryCapacity5Of5","abstract":"<p>Static icon battery capacity 5 of 5</p>"},"Constants.html#/c:@SDLStaticIconNameBluetoothAudioSource":{"name":"SDLStaticIconNameBluetoothAudioSource","abstract":"<p>Static icon bluetooth audio source</p>"},"Constants.html#/c:@SDLStaticIconNameBluetooth1":{"name":"SDLStaticIconNameBluetooth1","abstract":"<p>Static icon bluetooth1</p>"},"Constants.html#/c:@SDLStaticIconNameBluetooth2":{"name":"SDLStaticIconNameBluetooth2","abstract":"<p>Static icon bluetooth2</p>"},"Constants.html#/c:@SDLStaticIconNameBrowse":{"name":"SDLStaticIconNameBrowse","abstract":"<p>Static icon browse</p>"},"Constants.html#/c:@SDLStaticIconNameCellPhoneInRoamingMode":{"name":"SDLStaticIconNameCellPhoneInRoamingMode","abstract":"<p>Static icon cell phone in roaming mode</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength0Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength0Of5Bars","abstract":"<p>Static icon cell service signal strength 0 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength1Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength1Of5Bars","abstract":"<p>Static icon cell service signal strength 1 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength2Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength2Of5Bars","abstract":"<p>Static icon cell service signal strength 2 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength3Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength3Of5Bars","abstract":"<p>Static icon cell service signal strength 3 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength4Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength4Of5Bars","abstract":"<p>Static icon cell service signal strength 4 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength5Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength5Of5Bars","abstract":"<p>Static icon cell service signal strength 5 of 5 bars</p>"},"Constants.html#/c:@SDLStaticIconNameChangeLaneLeft":{"name":"SDLStaticIconNameChangeLaneLeft","abstract":"<p>Static icon change lane left</p>"},"Constants.html#/c:@SDLStaticIconNameChangeLaneRight":{"name":"SDLStaticIconNameChangeLaneRight","abstract":"<p>Static icon change lane right</p>"},"Constants.html#/c:@SDLStaticIconNameCheckBoxChecked":{"name":"SDLStaticIconNameCheckBoxChecked","abstract":"<p>Static icon check box checked</p>"},"Constants.html#/c:@SDLStaticIconNameCheckBoxUnchecked":{"name":"SDLStaticIconNameCheckBoxUnchecked","abstract":"<p>Static icon check box unchecked</p>"},"Constants.html#/c:@SDLStaticIconNameClimate":{"name":"SDLStaticIconNameClimate","abstract":"<p>Static icon climate</p>"},"Constants.html#/c:@SDLStaticIconNameClock":{"name":"SDLStaticIconNameClock","abstract":"<p>Static icon clock</p>"},"Constants.html#/c:@SDLStaticIconNameCompose":{"name":"SDLStaticIconNameCompose","abstract":"<p>Static icon compose (e.g. message)</p>"},"Constants.html#/c:@SDLStaticIconNameContact":{"name":"SDLStaticIconNameContact","abstract":"<p>Static icon contact / person</p>"},"Constants.html#/c:@SDLStaticIconNameContinue":{"name":"SDLStaticIconNameContinue","abstract":"<p>Static icon continue</p>"},"Constants.html#/c:@SDLStaticIconNameDash":{"name":"SDLStaticIconNameDash","abstract":"<p>Static icon dash / bullet point</p>"},"Constants.html#/c:@SDLStaticIconNameDate":{"name":"SDLStaticIconNameDate","abstract":"<p>Static icon date / calendar</p>"},"Constants.html#/c:@SDLStaticIconNameDelete":{"name":"SDLStaticIconNameDelete","abstract":"<p>Static icon delete/remove - trash</p>"},"Constants.html#/c:@SDLStaticIconNameDestination":{"name":"SDLStaticIconNameDestination","abstract":"<p>Static icon destination</p>"},"Constants.html#/c:@SDLStaticIconNameDestinationFerryAhead":{"name":"SDLStaticIconNameDestinationFerryAhead","abstract":"<p>Static icon destination ferry ahead</p>"},"Constants.html#/c:@SDLStaticIconNameEbookmark":{"name":"SDLStaticIconNameEbookmark","abstract":"<p>Static icon ebookmark (e.g. message, feed)</p>"},"Constants.html#/c:@SDLStaticIconNameEmpty":{"name":"SDLStaticIconNameEmpty","abstract":"<p>Static icon empty (i.e. no image)</p>"},"Constants.html#/c:@SDLStaticIconNameEndCall":{"name":"SDLStaticIconNameEndCall","abstract":"<p>Static icon end call / reject call</p>"},"Constants.html#/c:@SDLStaticIconNameFail":{"name":"SDLStaticIconNameFail","abstract":"<p>Static icon fail / X</p>"},"Constants.html#/c:@SDLStaticIconNameFastForward30Secs":{"name":"SDLStaticIconNameFastForward30Secs","abstract":"<p>Static icon fast forward 30 secs</p>"},"Constants.html#/c:@SDLStaticIconNameFavoriteHeart":{"name":"SDLStaticIconNameFavoriteHeart","abstract":"<p>Static icon favorite / heart</p>"},"Constants.html#/c:@SDLStaticIconNameFavoriteStar":{"name":"SDLStaticIconNameFavoriteStar","abstract":"<p>Static icon favorite / star</p>"},"Constants.html#/c:@SDLStaticIconNameFaxNumber":{"name":"SDLStaticIconNameFaxNumber","abstract":"<p>Static icon fax number</p>"},"Constants.html#/c:@SDLStaticIconNameFilename":{"name":"SDLStaticIconNameFilename","abstract":"<p>Static icon filename</p>"},"Constants.html#/c:@SDLStaticIconNameFilter":{"name":"SDLStaticIconNameFilter","abstract":"<p>Static icon filter / search</p>"},"Constants.html#/c:@SDLStaticIconNameFolder":{"name":"SDLStaticIconNameFolder","abstract":"<p>Static icon folder</p>"},"Constants.html#/c:@SDLStaticIconNameFuelPrices":{"name":"SDLStaticIconNameFuelPrices","abstract":"<p>Static icon fuel prices</p>"},"Constants.html#/c:@SDLStaticIconNameFullMap":{"name":"SDLStaticIconNameFullMap","abstract":"<p>Static icon full map</p>"},"Constants.html#/c:@SDLStaticIconNameGenericPhoneNumber":{"name":"SDLStaticIconNameGenericPhoneNumber","abstract":"<p>Static icon generic phone number</p>"},"Constants.html#/c:@SDLStaticIconNameGenre":{"name":"SDLStaticIconNameGenre","abstract":"<p>Static icon genre</p>"},"Constants.html#/c:@SDLStaticIconNameGlobalKeyboard":{"name":"SDLStaticIconNameGlobalKeyboard","abstract":"<p>Static icon global keyboard</p>"},"Constants.html#/c:@SDLStaticIconNameHighwayExitInformation":{"name":"SDLStaticIconNameHighwayExitInformation","abstract":"<p>Static icon highway exit information</p>"},"Constants.html#/c:@SDLStaticIconNameHomePhoneNumber":{"name":"SDLStaticIconNameHomePhoneNumber","abstract":"<p>Static icon home phone number</p>"},"Constants.html#/c:@SDLStaticIconNameHyperlink":{"name":"SDLStaticIconNameHyperlink","abstract":"<p>Static icon hyperlink</p>"},"Constants.html#/c:@SDLStaticIconNameID3TagUnknown":{"name":"SDLStaticIconNameID3TagUnknown","abstract":"<p>Static icon ID3 tag unknown</p>"},"Constants.html#/c:@SDLStaticIconNameIncomingCalls":{"name":"SDLStaticIconNameIncomingCalls","abstract":"<p>Static icon incoming calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNameInformation":{"name":"SDLStaticIconNameInformation","abstract":"<p>Static icon information</p>"},"Constants.html#/c:@SDLStaticIconNameIPodMediaSource":{"name":"SDLStaticIconNameIPodMediaSource","abstract":"<p>Static icon IPOD media source</p>"},"Constants.html#/c:@SDLStaticIconNameJoinCalls":{"name":"SDLStaticIconNameJoinCalls","abstract":"<p>Static icon join calls</p>"},"Constants.html#/c:@SDLStaticIconNameKeepLeft":{"name":"SDLStaticIconNameKeepLeft","abstract":"<p>Static icon keep left</p>"},"Constants.html#/c:@SDLStaticIconNameKeepRight":{"name":"SDLStaticIconNameKeepRight","abstract":"<p>Static icon keep right</p>"},"Constants.html#/c:@SDLStaticIconNameKey":{"name":"SDLStaticIconNameKey","abstract":"<p>Static icon key / keycode</p>"},"Constants.html#/c:@SDLStaticIconNameLeft":{"name":"SDLStaticIconNameLeft","abstract":"<p>Static icon left</p>"},"Constants.html#/c:@SDLStaticIconNameLeftArrow":{"name":"SDLStaticIconNameLeftArrow","abstract":"<p>Static icon left arrow / back</p>"},"Constants.html#/c:@SDLStaticIconNameLeftExit":{"name":"SDLStaticIconNameLeftExit","abstract":"<p>Static icon left exit</p>"},"Constants.html#/c:@SDLStaticIconNameLineInAudioSource":{"name":"SDLStaticIconNameLineInAudioSource","abstract":"<p>Static icon LINE IN audio source</p>"},"Constants.html#/c:@SDLStaticIconNameLocked":{"name":"SDLStaticIconNameLocked","abstract":"<p>Static icon locked</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlLeftArrow":{"name":"SDLStaticIconNameMediaControlLeftArrow","abstract":"<p>Static icon media control - left arrow</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlRecording":{"name":"SDLStaticIconNameMediaControlRecording","abstract":"<p>Static icon media control - recording</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlRightArrow":{"name":"SDLStaticIconNameMediaControlRightArrow","abstract":"<p>Static icon media control - right arrow</p>"},"Constants.html#/c:@SDLStaticIconNameMediaControlStop":{"name":"SDLStaticIconNameMediaControlStop","abstract":"<p>Static icon media control - stop (e.g. streaming)</p>"},"Constants.html#/c:@SDLStaticIconNameMicrophone":{"name":"SDLStaticIconNameMicrophone","abstract":"<p>Static icon microphone</p>"},"Constants.html#/c:@SDLStaticIconNameMissedCalls":{"name":"SDLStaticIconNameMissedCalls","abstract":"<p>Static icon missed calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNameMobilePhoneNumber":{"name":"SDLStaticIconNameMobilePhoneNumber","abstract":"<p>Static icon mobile phone number</p>"},"Constants.html#/c:@SDLStaticIconNameMoveDown":{"name":"SDLStaticIconNameMoveDown","abstract":"<p>Static icon move down / download</p>"},"Constants.html#/c:@SDLStaticIconNameMoveUp":{"name":"SDLStaticIconNameMoveUp","abstract":"<p>Static icon move up</p>"},"Constants.html#/c:@SDLStaticIconNameMP3TagArtist":{"name":"SDLStaticIconNameMP3TagArtist","abstract":"<p>Static icon MP3 tag artist</p>"},"Constants.html#/c:@SDLStaticIconNameNavigation":{"name":"SDLStaticIconNameNavigation","abstract":"<p>Static icon navigation / navigation settings</p>"},"Constants.html#/c:@SDLStaticIconNameNavigationCurrentDirection":{"name":"SDLStaticIconNameNavigationCurrentDirection","abstract":"<p>Static icon navigation current direction</p>"},"Constants.html#/c:@SDLStaticIconNameNegativeRatingThumbsDown":{"name":"SDLStaticIconNameNegativeRatingThumbsDown","abstract":"<p>Static icon negative rating - thumbs down</p>"},"Constants.html#/c:@SDLStaticIconNameNew":{"name":"SDLStaticIconNameNew","abstract":"<p>Static icon new/unread text message/email</p>"},"Constants.html#/c:@SDLStaticIconNameOfficePhoneNumber":{"name":"SDLStaticIconNameOfficePhoneNumber","abstract":"<p>Static icon office phone number / work phone number</p>"},"Constants.html#/c:@SDLStaticIconNameOpened":{"name":"SDLStaticIconNameOpened","abstract":"<p>Static icon opened/read text message/email</p>"},"Constants.html#/c:@SDLStaticIconNameOrigin":{"name":"SDLStaticIconNameOrigin","abstract":"<p>Static icon origin / nearby locale / current position</p>"},"Constants.html#/c:@SDLStaticIconNameOutgoingCalls":{"name":"SDLStaticIconNameOutgoingCalls","abstract":"<p>Static icon outgoing calls (in list of phone calls)</p>"},"Constants.html#/c:@SDLStaticIconNamePause":{"name":"SDLStaticIconNamePause","abstract":"<p>Static icon play / pause - pause active</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneCall1":{"name":"SDLStaticIconNamePhoneCall1","abstract":"<p>Static icon phone call 1</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneCall2":{"name":"SDLStaticIconNamePhoneCall2","abstract":"<p>Static icon phone call 2</p>"},"Constants.html#/c:@SDLStaticIconNamePhoneDevice":{"name":"SDLStaticIconNamePhoneDevice","abstract":"<p>Static icon phone device</p>"},"Constants.html#/c:@SDLStaticIconNamePhonebook":{"name":"SDLStaticIconNamePhonebook","abstract":"<p>Static icon phonebook</p>"},"Constants.html#/c:@SDLStaticIconNamePhoto":{"name":"SDLStaticIconNamePhoto","abstract":"<p>Static icon photo / picture</p>"},"Constants.html#/c:@SDLStaticIconNamePlay":{"name":"SDLStaticIconNamePlay","abstract":"<p>Static icon play / pause - play active</p>"},"Constants.html#/c:@SDLStaticIconNamePlaylist":{"name":"SDLStaticIconNamePlaylist","abstract":"<p>Static icon playlist</p>"},"Constants.html#/c:@SDLStaticIconNamePopUp":{"name":"SDLStaticIconNamePopUp","abstract":"<p>Static icon pop-up</p>"},"Constants.html#/c:@SDLStaticIconNamePositiveRatingThumbsUp":{"name":"SDLStaticIconNamePositiveRatingThumbsUp","abstract":"<p>Static icon positive rating - thumbs up</p>"},"Constants.html#/c:@SDLStaticIconNamePower":{"name":"SDLStaticIconNamePower","abstract":"<p>Static icon power</p>"},"Constants.html#/c:@SDLStaticIconNamePrimaryPhone":{"name":"SDLStaticIconNamePrimaryPhone","abstract":"<p>Static icon primary phone (favorite)</p>"},"Constants.html#/c:@SDLStaticIconNameRadioButtonChecked":{"name":"SDLStaticIconNameRadioButtonChecked","abstract":"<p>Static icon radio button checked</p>"},"Constants.html#/c:@SDLStaticIconNameRadioButtonUnchecked":{"name":"SDLStaticIconNameRadioButtonUnchecked","abstract":"<p>Static icon radio button unchecked</p>"},"Constants.html#/c:@SDLStaticIconNameRecentCalls":{"name":"SDLStaticIconNameRecentCalls","abstract":"<p>Static icon recent calls / history</p>"},"Constants.html#/c:@SDLStaticIconNameRecentDestinations":{"name":"SDLStaticIconNameRecentDestinations","abstract":"<p>Static icon recent destinations</p>"},"Constants.html#/c:@SDLStaticIconNameRedo":{"name":"SDLStaticIconNameRedo","abstract":"<p>Static icon redo</p>"},"Constants.html#/c:@SDLStaticIconNameRefresh":{"name":"SDLStaticIconNameRefresh","abstract":"<p>Static icon refresh</p>"},"Constants.html#/c:@SDLStaticIconNameRemoteDiagnosticsCheckEngine":{"name":"SDLStaticIconNameRemoteDiagnosticsCheckEngine","abstract":"<p>Static icon remote diagnostics - check engine</p>"},"Constants.html#/c:@SDLStaticIconNameRendered911Assist":{"name":"SDLStaticIconNameRendered911Assist","abstract":"<p>Static icon rendered 911 assist / emergency assistance</p>"},"Constants.html#/c:@SDLStaticIconNameRepeat":{"name":"SDLStaticIconNameRepeat","abstract":"<p>Static icon repeat</p>"},"Constants.html#/c:@SDLStaticIconNameRepeatPlay":{"name":"SDLStaticIconNameRepeatPlay","abstract":"<p>Static icon repeat play</p>"},"Constants.html#/c:@SDLStaticIconNameReply":{"name":"SDLStaticIconNameReply","abstract":"<p>Static icon reply</p>"},"Constants.html#/c:@SDLStaticIconNameRewind30Secs":{"name":"SDLStaticIconNameRewind30Secs","abstract":"<p>Static icon rewind 30 secs</p>"},"Constants.html#/c:@SDLStaticIconNameRight":{"name":"SDLStaticIconNameRight","abstract":"<p>Static icon right</p>"},"Constants.html#/c:@SDLStaticIconNameRightExit":{"name":"SDLStaticIconNameRightExit","abstract":"<p>Static icon right exit</p>"},"Constants.html#/c:@SDLStaticIconNameRingtones":{"name":"SDLStaticIconNameRingtones","abstract":"<p>Static icon ringtones</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand1":{"name":"SDLStaticIconNameRoundaboutLeftHand1","abstract":"<p>Static icon roundabout left hand 1</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand2":{"name":"SDLStaticIconNameRoundaboutLeftHand2","abstract":"<p>Static icon roundabout left hand 2</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand3":{"name":"SDLStaticIconNameRoundaboutLeftHand3","abstract":"<p>Static icon roundabout left hand 3</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand4":{"name":"SDLStaticIconNameRoundaboutLeftHand4","abstract":"<p>Static icon roundabout left hand 4</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand5":{"name":"SDLStaticIconNameRoundaboutLeftHand5","abstract":"<p>Static icon roundabout left hand 5</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand6":{"name":"SDLStaticIconNameRoundaboutLeftHand6","abstract":"<p>Static icon roundabout left hand 6</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand7":{"name":"SDLStaticIconNameRoundaboutLeftHand7","abstract":"<p>Static icon roundabout left hand 7</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand1":{"name":"SDLStaticIconNameRoundaboutRightHand1","abstract":"<p>Static icon roundabout right hand 1</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand2":{"name":"SDLStaticIconNameRoundaboutRightHand2","abstract":"<p>Static icon roundabout right hand 2</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand3":{"name":"SDLStaticIconNameRoundaboutRightHand3","abstract":"<p>Static icon roundabout right hand 3</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand4":{"name":"SDLStaticIconNameRoundaboutRightHand4","abstract":"<p>Static icon roundabout right hand 4</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand5":{"name":"SDLStaticIconNameRoundaboutRightHand5","abstract":"<p>Static icon roundabout right hand 5</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand6":{"name":"SDLStaticIconNameRoundaboutRightHand6","abstract":"<p>Static icon roundabout right hand 6</p>"},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand7":{"name":"SDLStaticIconNameRoundaboutRightHand7","abstract":"<p>Static icon roundabout right hand 7</p>"},"Constants.html#/c:@SDLStaticIconNameRSS":{"name":"SDLStaticIconNameRSS","abstract":"<p>Static icon RSS</p>"},"Constants.html#/c:@SDLStaticIconNameSettings":{"name":"SDLStaticIconNameSettings","abstract":"<p>Static icon settings / menu</p>"},"Constants.html#/c:@SDLStaticIconNameSharpLeft":{"name":"SDLStaticIconNameSharpLeft","abstract":"<p>Static icon sharp left</p>"},"Constants.html#/c:@SDLStaticIconNameSharpRight":{"name":"SDLStaticIconNameSharpRight","abstract":"<p>Static icon sharp right</p>"},"Constants.html#/c:@SDLStaticIconNameShow":{"name":"SDLStaticIconNameShow","abstract":"<p>Static icon show</p>"},"Constants.html#/c:@SDLStaticIconNameShufflePlay":{"name":"SDLStaticIconNameShufflePlay","abstract":"<p>Static icon shuffle play</p>"},"Constants.html#/c:@SDLStaticIconNameSkiPlaces":{"name":"SDLStaticIconNameSkiPlaces","abstract":"<p>Static icon ski places / elevation / altitude</p>"},"Constants.html#/c:@SDLStaticIconNameSlightLeft":{"name":"SDLStaticIconNameSlightLeft","abstract":"<p>Static icon slight left</p>"},"Constants.html#/c:@SDLStaticIconNameSlightRight":{"name":"SDLStaticIconNameSlightRight","abstract":"<p>Static icon slight right</p>"},"Constants.html#/c:@SDLStaticIconNameSmartphone":{"name":"SDLStaticIconNameSmartphone","abstract":"<p>Static icon smartphone</p>"},"Constants.html#/c:@SDLStaticIconNameSortList":{"name":"SDLStaticIconNameSortList","abstract":"<p>Static icon sort list</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber0":{"name":"SDLStaticIconNameSpeedDialNumbersNumber0","abstract":"<p>Static icon speed dial numbers - number 0</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber1":{"name":"SDLStaticIconNameSpeedDialNumbersNumber1","abstract":"<p>Static icon speed dial numbers - number 1</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber2":{"name":"SDLStaticIconNameSpeedDialNumbersNumber2","abstract":"<p>Static icon speed dial numbers - number 2</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber3":{"name":"SDLStaticIconNameSpeedDialNumbersNumber3","abstract":"<p>Static icon speed dial numbers - number 3</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber4":{"name":"SDLStaticIconNameSpeedDialNumbersNumber4","abstract":"<p>Static icon speed dial numbers - number 4</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber5":{"name":"SDLStaticIconNameSpeedDialNumbersNumber5","abstract":"<p>Static icon speed dial numbers - number 5</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber6":{"name":"SDLStaticIconNameSpeedDialNumbersNumber6","abstract":"<p>Static icon speed dial numbers - number 6</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber7":{"name":"SDLStaticIconNameSpeedDialNumbersNumber7","abstract":"<p>Static icon speed dial numbers - number 7</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber8":{"name":"SDLStaticIconNameSpeedDialNumbersNumber8","abstract":"<p>Static icon speed dial numbers - number 8</p>"},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber9":{"name":"SDLStaticIconNameSpeedDialNumbersNumber9","abstract":"<p>Static icon speed dial numbers - number 9</p>"},"Constants.html#/c:@SDLStaticIconNameSuccess":{"name":"SDLStaticIconNameSuccess","abstract":"<p>Static icon success / check</p>"},"Constants.html#/c:@SDLStaticIconNameTrackTitle":{"name":"SDLStaticIconNameTrackTitle","abstract":"<p>Static icon track title / song title</p>"},"Constants.html#/c:@SDLStaticIconNameTrafficReport":{"name":"SDLStaticIconNameTrafficReport","abstract":"<p>Static icon traffic report</p>"},"Constants.html#/c:@SDLStaticIconNameTurnList":{"name":"SDLStaticIconNameTurnList","abstract":"<p>Static icon turn list</p>"},"Constants.html#/c:@SDLStaticIconNameUTurnLeftTraffic":{"name":"SDLStaticIconNameUTurnLeftTraffic","abstract":"<p>Static icon u-turn left traffic</p>"},"Constants.html#/c:@SDLStaticIconNameUTurnRightTraffic":{"name":"SDLStaticIconNameUTurnRightTraffic","abstract":"<p>Static icon u-turn right traffic</p>"},"Constants.html#/c:@SDLStaticIconNameUndo":{"name":"SDLStaticIconNameUndo","abstract":"<p>Static icon undo</p>"},"Constants.html#/c:@SDLStaticIconNameUnlocked":{"name":"SDLStaticIconNameUnlocked","abstract":"<p>Static icon unlocked</p>"},"Constants.html#/c:@SDLStaticIconNameUSBMediaAudioSource":{"name":"SDLStaticIconNameUSBMediaAudioSource","abstract":"<p>Static icon USB media audio source</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo1":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo1","abstract":"<p>Static icon voice control scrollbar - list item no. 1</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo2":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo2","abstract":"<p>Static icon voice control scrollbar - list item no. 2</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo3":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo3","abstract":"<p>Static icon voice control scrollbar - list item no. 3</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo4":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo4","abstract":"<p>Static icon voice control scrollbar - list item no. 4</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionFailed":{"name":"SDLStaticIconNameVoiceRecognitionFailed","abstract":"<p>Static icon voice recognition - failed</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionPause":{"name":"SDLStaticIconNameVoiceRecognitionPause","abstract":"<p>Static icon voice recognition - pause</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSuccessful":{"name":"SDLStaticIconNameVoiceRecognitionSuccessful","abstract":"<p>Static icon voice recognition - successful</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemActive":{"name":"SDLStaticIconNameVoiceRecognitionSystemActive","abstract":"<p>Static icon voice recognition - system active</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemListening":{"name":"SDLStaticIconNameVoiceRecognitionSystemListening","abstract":"<p>Static icon voice recognition - system listening</p>"},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionTryAgain":{"name":"SDLStaticIconNameVoiceRecognitionTryAgain","abstract":"<p>Static icon voice recognition - try again</p>"},"Constants.html#/c:@SDLStaticIconNameWarning":{"name":"SDLStaticIconNameWarning","abstract":"<p>Static icon warning / safety alert</p>"},"Constants.html#/c:@SDLStaticIconNameWeather":{"name":"SDLStaticIconNameWeather","abstract":"<p>Static icon weather</p>"},"Constants.html#/c:@SDLStaticIconNameWifiFull":{"name":"SDLStaticIconNameWifiFull","abstract":"<p>Static icon wifi full</p>"},"Constants.html#/c:@SDLStaticIconNameZoomIn":{"name":"SDLStaticIconNameZoomIn","abstract":"<p>Static icon zoom in</p>"},"Constants.html#/c:@SDLStaticIconNameZoomOut":{"name":"SDLStaticIconNameZoomOut","abstract":"<p>Static icon zoom out</p>"},"Constants.html#/c:@SDLVideoStreamDidStartNotification":{"name":"SDLVideoStreamDidStartNotification","abstract":"<p>Name of video stream start notification</p>"},"Constants.html#/c:@SDLVideoStreamDidStopNotification":{"name":"SDLVideoStreamDidStopNotification","abstract":"<p>Name of video stream stop notification</p>"},"Constants.html#/c:@SDLVideoStreamSuspendedNotification":{"name":"SDLVideoStreamSuspendedNotification","abstract":"<p>Name of video stream suspended notification</p>"},"Constants.html#/c:@SDLAudioStreamDidStartNotification":{"name":"SDLAudioStreamDidStartNotification","abstract":"<p>Name of audio stream start notification</p>"},"Constants.html#/c:@SDLAudioStreamDidStopNotification":{"name":"SDLAudioStreamDidStopNotification","abstract":"<p>Name of audio stream stop notification</p>"},"Constants.html#/c:@SDLLockScreenManagerWillPresentLockScreenViewController":{"name":"SDLLockScreenManagerWillPresentLockScreenViewController","abstract":"<p>Lockscreen will present notification</p>"},"Constants.html#/c:@SDLLockScreenManagerDidPresentLockScreenViewController":{"name":"SDLLockScreenManagerDidPresentLockScreenViewController","abstract":"<p>Lockscreen did present notification</p>"},"Constants.html#/c:@SDLLockScreenManagerWillDismissLockScreenViewController":{"name":"SDLLockScreenManagerWillDismissLockScreenViewController","abstract":"<p>Lockscreen will dismiss notification</p>"},"Constants.html#/c:@SDLLockScreenManagerDidDismissLockScreenViewController":{"name":"SDLLockScreenManagerDidDismissLockScreenViewController","abstract":"<p>Lockscreen did dismiss notification</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateStopped":{"name":"SDLVideoStreamManagerStateStopped","abstract":"<p>Streaming state stopped</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateStarting":{"name":"SDLVideoStreamManagerStateStarting","abstract":"<p>Streaming state starting</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateReady":{"name":"SDLVideoStreamManagerStateReady","abstract":"<p>Streaming state ready</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateSuspended":{"name":"SDLVideoStreamManagerStateSuspended","abstract":"<p>Streaming state suspended</p>"},"Constants.html#/c:@SDLVideoStreamManagerStateShuttingDown":{"name":"SDLVideoStreamManagerStateShuttingDown","abstract":"<p>Streaming state shutting down</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateStopped":{"name":"SDLAudioStreamManagerStateStopped","abstract":"<p>Audio state stopped</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateStarting":{"name":"SDLAudioStreamManagerStateStarting","abstract":"<p>Audio state starting</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateReady":{"name":"SDLAudioStreamManagerStateReady","abstract":"<p>Audio state ready</p>"},"Constants.html#/c:@SDLAudioStreamManagerStateShuttingDown":{"name":"SDLAudioStreamManagerStateShuttingDown","abstract":"<p>Audio state shutting down</p>"},"Constants.html#/c:@SDLAppStateInactive":{"name":"SDLAppStateInactive","abstract":"<p>App state inactive</p>"},"Constants.html#/c:@SDLAppStateActive":{"name":"SDLAppStateActive","abstract":"<p>App state active</p>"},"Constants.html#/c:@SDLSupportedSeatDriver":{"name":"SDLSupportedSeatDriver","abstract":"<p>Save current seat positions and settings to seat memory.</p>"},"Constants.html#/c:@SDLSupportedSeatFrontPassenger":{"name":"SDLSupportedSeatFrontPassenger","abstract":"<p>Restore / apply the seat memory settings to the current seat.</p>"},"Constants.html#/c:@SDLSystemActionDefaultAction":{"name":"SDLSystemActionDefaultAction","abstract":"<p>A default soft button action</p>"},"Constants.html#/c:@SDLSystemActionStealFocus":{"name":"SDLSystemActionStealFocus","abstract":"<p>An action causing your app to steal HMI focus</p>"},"Constants.html#/c:@SDLSystemActionKeepContext":{"name":"SDLSystemActionKeepContext","abstract":"<p>An action causing you to keep context</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeAppServices":{"name":"SDLSystemCapabilityTypeAppServices","abstract":"<p>The app services capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeNavigation":{"name":"SDLSystemCapabilityTypeNavigation","abstract":"<p>The navigation capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypePhoneCall":{"name":"SDLSystemCapabilityTypePhoneCall","abstract":"<p>The phone call capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeVideoStreaming":{"name":"SDLSystemCapabilityTypeVideoStreaming","abstract":"<p>The video streaming capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeRemoteControl":{"name":"SDLSystemCapabilityTypeRemoteControl","abstract":"<p>The remote control capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeSeatLocation":{"name":"SDLSystemCapabilityTypeSeatLocation","abstract":"<p>Contains information about the locations of each seat</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeDisplays":{"name":"SDLSystemCapabilityTypeDisplays","abstract":"<p>The Display type capability</p>"},"Constants.html#/c:@SDLSystemCapabilityTypeDriverDistraction":{"name":"SDLSystemCapabilityTypeDriverDistraction","abstract":"<p>@since SDL 7.0.0</p>"},"Constants.html#/c:@SDLSystemContextMain":{"name":"SDLSystemContextMain","abstract":"<p>No user interaction (user-initiated or app-initiated) is in progress.</p>"},"Constants.html#/c:@SDLSystemContextVoiceRecognitionSession":{"name":"SDLSystemContextVoiceRecognitionSession","abstract":"<p>VR-oriented, user-initiated or app-initiated interaction is in-progress.</p>"},"Constants.html#/c:@SDLSystemContextMenu":{"name":"SDLSystemContextMenu","abstract":"<p>Menu-oriented, user-initiated or app-initiated interaction is in-progress.</p>"},"Constants.html#/c:@SDLSystemContextHMIObscured":{"name":"SDLSystemContextHMIObscured","abstract":"<p>The app&rsquo;s display HMI is currently being obscured by either a system or other app&rsquo;s overlay.</p>"},"Constants.html#/c:@SDLSystemContextAlert":{"name":"SDLSystemContextAlert","abstract":"<p>Broadcast only to whichever app has an alert currently being displayed.</p>"},"Constants.html#/c:@SDLTBTStateRouteUpdateRequest":{"name":"SDLTBTStateRouteUpdateRequest","abstract":"<p>The route should be updated</p>"},"Constants.html#/c:@SDLTBTStateRouteAccepted":{"name":"SDLTBTStateRouteAccepted","abstract":"<p>The route is accepted</p>"},"Constants.html#/c:@SDLTBTStateRouteRefused":{"name":"SDLTBTStateRouteRefused","abstract":"<p>The route is refused</p>"},"Constants.html#/c:@SDLTBTStateRouteCancelled":{"name":"SDLTBTStateRouteCancelled","abstract":"<p>The route is cancelled</p>"},"Constants.html#/c:@SDLTBTStateETARequest":{"name":"SDLTBTStateETARequest","abstract":"<p>The route should update its Estimated Time of Arrival</p>"},"Constants.html#/c:@SDLTBTStateNextTurnRequest":{"name":"SDLTBTStateNextTurnRequest","abstract":"<p>The route should update its next turn</p>"},"Constants.html#/c:@SDLTBTStateRouteStatusRequest":{"name":"SDLTBTStateRouteStatusRequest","abstract":"<p>The route should update its status</p>"},"Constants.html#/c:@SDLTBTStateRouteSummaryRequest":{"name":"SDLTBTStateRouteSummaryRequest","abstract":"<p>The route update its summary</p>"},"Constants.html#/c:@SDLTBTStateTripStatusRequest":{"name":"SDLTBTStateTripStatusRequest","abstract":"<p>The route should update the trip&rsquo;s status</p>"},"Constants.html#/c:@SDLTBTStateRouteUpdateRequestTimeout":{"name":"SDLTBTStateRouteUpdateRequestTimeout","abstract":"<p>The route update timed out</p>"},"Constants.html#/c:@SDLTPMSUnknown":{"name":"SDLTPMSUnknown","abstract":"<p>If set the status of the tire is not known.</p>"},"Constants.html#/c:@SDLTPMSSystemFault":{"name":"SDLTPMSSystemFault","abstract":"<p>TPMS does not function.</p>"},"Constants.html#/c:@SDLTPMSSensorFault":{"name":"SDLTPMSSensorFault","abstract":"<p>The sensor of the tire does not function.</p>"},"Constants.html#/c:@SDLTPMSLow":{"name":"SDLTPMSLow","abstract":"<p>TPMS is reporting a low tire pressure for the tire.</p>"},"Constants.html#/c:@SDLTPMSSystemActive":{"name":"SDLTPMSSystemActive","abstract":"<p>TPMS is active and the tire pressure is monitored.</p>"},"Constants.html#/c:@SDLTPMSTrain":{"name":"SDLTPMSTrain","abstract":"<p>TPMS is reporting that the tire must be trained.</p>"},"Constants.html#/c:@SDLTPMSTrainingComplete":{"name":"SDLTPMSTrainingComplete","abstract":"<p>TPMS reports the training for the tire is completed.</p>"},"Constants.html#/c:@SDLTPMSNotTrained":{"name":"SDLTPMSNotTrained","abstract":"<p>TPMS reports the tire is not trained.</p>"},"Constants.html#/c:@SDLTemperatureUnitCelsius":{"name":"SDLTemperatureUnitCelsius","abstract":"<p>Reflects the current HMI setting for temperature unit in Celsius</p>"},"Constants.html#/c:@SDLTemperatureUnitFahrenheit":{"name":"SDLTemperatureUnitFahrenheit","abstract":"<p>Reflects the current HMI setting for temperature unit in Fahrenheit</p>"},"Constants.html#/c:@SDLTextAlignmentLeft":{"name":"SDLTextAlignmentLeft","abstract":"<p>Text aligned left.</p>"},"Constants.html#/c:@SDLTextAlignmentRight":{"name":"SDLTextAlignmentRight","abstract":"<p>Text aligned right.</p>"},"Constants.html#/c:@SDLTextAlignmentCenter":{"name":"SDLTextAlignmentCenter","abstract":"<p>Text aligned centered.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField1":{"name":"SDLTextFieldNameMainField1","abstract":"<p>The first line of the first set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField2":{"name":"SDLTextFieldNameMainField2","abstract":"<p>The second line of the first set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField3":{"name":"SDLTextFieldNameMainField3","abstract":"<p>The first line of the second set of main fields of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMainField4":{"name":"SDLTextFieldNameMainField4"},"Constants.html#/c:@SDLTextFieldNameTemplateTitle":{"name":"SDLTextFieldNameTemplateTitle","abstract":"<p>The title line of the persistent display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameStatusBar":{"name":"SDLTextFieldNameStatusBar","abstract":"<p>The status bar on the NGN display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMediaClock":{"name":"SDLTextFieldNameMediaClock","abstract":"<p>Text value for MediaClock field. Must be properly formatted according to MediaClockFormat. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameMediaTrack":{"name":"SDLTextFieldNameMediaTrack","abstract":"<p>The track field of NGN type ACMs. This field is only available for media applications on a NGN display. Applies to SDLShow.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText1":{"name":"SDLTextFieldNameAlertText1","abstract":"<p>The first line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText2":{"name":"SDLTextFieldNameAlertText2","abstract":"<p>The second line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameAlertText3":{"name":"SDLTextFieldNameAlertText3","abstract":"<p>The third line of the alert text field. Applies to SDLAlert.</p>"},"Constants.html#/c:@SDLTextFieldNameScrollableMessageBody":{"name":"SDLTextFieldNameScrollableMessageBody","abstract":"<p>Long form body of text that can include newlines and tabs. Applies to SDLScrollableMessage.</p>"},"Constants.html#/c:@SDLTextFieldNameInitialInteractionText":{"name":"SDLTextFieldNameInitialInteractionText","abstract":"<p>First line suggestion for a user response (in the case of VR enabled interaction).</p>"},"Constants.html#/c:@SDLTextFieldNameNavigationText1":{"name":"SDLTextFieldNameNavigationText1","abstract":"<p>First line of navigation text.</p>"},"Constants.html#/c:@SDLTextFieldNameNavigationText2":{"name":"SDLTextFieldNameNavigationText2","abstract":"<p>Second line of navigation text.</p>"},"Constants.html#/c:@SDLTextFieldNameETA":{"name":"SDLTextFieldNameETA","abstract":"<p>Estimated Time of Arrival time for navigation.</p>"},"Constants.html#/c:@SDLTextFieldNameTotalDistance":{"name":"SDLTextFieldNameTotalDistance","abstract":"<p>Total distance to destination for navigation.</p>"},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText1":{"name":"SDLTextFieldNameAudioPassThruDisplayText1","abstract":"<p>First line of text for audio pass thru.</p>"},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText2":{"name":"SDLTextFieldNameAudioPassThruDisplayText2","abstract":"<p>Second line of text for audio pass thru.</p>"},"Constants.html#/c:@SDLTextFieldNameSliderHeader":{"name":"SDLTextFieldNameSliderHeader","abstract":"<p>Header text for slider.</p>"},"Constants.html#/c:@SDLTextFieldNameSliderFooter":{"name":"SDLTextFieldNameSliderFooter","abstract":"<p>Footer text for slider</p>"},"Constants.html#/c:@SDLTextFieldNameMenuName":{"name":"SDLTextFieldNameMenuName","abstract":"<p>Primary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameSecondaryText":{"name":"SDLTextFieldNameSecondaryText","abstract":"<p>Secondary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameTertiaryText":{"name":"SDLTextFieldNameTertiaryText","abstract":"<p>Tertiary text for SDLChoice</p>"},"Constants.html#/c:@SDLTextFieldNameMenuTitle":{"name":"SDLTextFieldNameMenuTitle","abstract":"<p>Optional text to label an app menu button (for certain touchscreen platforms)</p>"},"Constants.html#/c:@SDLTextFieldNameLocationName":{"name":"SDLTextFieldNameLocationName","abstract":"<p>Optional name / title of intended location for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameLocationDescription":{"name":"SDLTextFieldNameLocationDescription","abstract":"<p>Optional description of intended location / establishment (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameAddressLines":{"name":"SDLTextFieldNameAddressLines","abstract":"<p>Optional location address (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNamePhoneNumber":{"name":"SDLTextFieldNamePhoneNumber","abstract":"<p>Optional hone number of intended location / establishment (if applicable) for SDLSendLocation</p>"},"Constants.html#/c:@SDLTextFieldNameTimeToDestination":{"name":"SDLTextFieldNameTimeToDestination","abstract":"<p>Optional time to destination field for ShowConstantTBT</p>"},"Constants.html#/c:@SDLTextFieldNameTurnText":{"name":"SDLTextFieldNameTurnText","abstract":"<p>Turn text for turnList parameter of UpdateTurnList</p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertText1":{"name":"SDLTextFieldNameSubtleAlertText1","abstract":"<p>The first line of the subtle alert text field; applies to <code>SubtleAlert</code> <code>alertText1</code></p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertText2":{"name":"SDLTextFieldNameSubtleAlertText2","abstract":"<p>The second line of the subtle alert text field; applies to <code>SubtleAlert</code> <code>alertText2</code></p>"},"Constants.html#/c:@SDLTextFieldNameSubtleAlertSoftButtonText":{"name":"SDLTextFieldNameSubtleAlertSoftButtonText","abstract":"<p>A text field in the soft button of a subtle alert; applies to <code>SubtleAlert</code> <code>softButtons</code></p>"},"Constants.html#/c:@SDLTextFieldNameMenuCommandSecondaryText":{"name":"SDLTextFieldNameMenuCommandSecondaryText","abstract":"<p>Secondary text for AddCommand</p>"},"Constants.html#/c:@SDLTextFieldNameMenuCommandTertiaryText":{"name":"SDLTextFieldNameMenuCommandTertiaryText","abstract":"<p>Tertiary text for AddCommand</p>"},"Constants.html#/c:@SDLTextFieldNameMenuSubMenuSecondaryText":{"name":"SDLTextFieldNameMenuSubMenuSecondaryText","abstract":"<p>Secondary text for AddSubMenu</p>"},"Constants.html#/c:@SDLTextFieldNameMenuSubMenuTertiaryText":{"name":"SDLTextFieldNameMenuSubMenuTertiaryText","abstract":"<p>Tertiary text for AddSubMenu</p>"},"Constants.html#/c:@SDLTimerModeUp":{"name":"SDLTimerModeUp","abstract":"<p>The timer should count up.</p>"},"Constants.html#/c:@SDLTimerModeDown":{"name":"SDLTimerModeDown","abstract":"<p>The timer should count down.</p>"},"Constants.html#/c:@SDLTimerModeNone":{"name":"SDLTimerModeNone","abstract":"<p>The timer should not count.</p>"},"Constants.html#/c:@SDLTouchTypeBegin":{"name":"SDLTouchTypeBegin","abstract":"<p>The touch is the beginning of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeMove":{"name":"SDLTouchTypeMove","abstract":"<p>The touch is the movement of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeEnd":{"name":"SDLTouchTypeEnd","abstract":"<p>The touch is the ending of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTouchTypeCancel":{"name":"SDLTouchTypeCancel","abstract":"<p>The touch is the cancellation of a finger pressed on the display.</p>"},"Constants.html#/c:@SDLTransmissionTypeAutomatic":{"name":"SDLTransmissionTypeAutomatic","abstract":"<p>Automatic transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeContinuouslyVariable":{"name":"SDLTransmissionTypeContinuouslyVariable","abstract":"<p>Continuously variable transmission(CVT).</p>"},"Constants.html#/c:@SDLTransmissionTypeDirectDrive":{"name":"SDLTransmissionTypeDirectDrive","abstract":"<p>Direct drive between engine and wheels.</p>"},"Constants.html#/c:@SDLTransmissionTypeDualClutch":{"name":"SDLTransmissionTypeDualClutch","abstract":"<p>Dual clutch transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeElectricVariable":{"name":"SDLTransmissionTypeElectricVariable","abstract":"<p>Electric variable transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeInfinitelyVariable":{"name":"SDLTransmissionTypeInfinitelyVariable","abstract":"<p>Infinitely variable transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeManual":{"name":"SDLTransmissionTypeManual","abstract":"<p>Manual transmission.</p>"},"Constants.html#/c:@SDLTransmissionTypeSemiAutomatic":{"name":"SDLTransmissionTypeSemiAutomatic","abstract":"<p>Semi automatic transmission.</p>"},"Constants.html#/c:@SDLTriggerSourceMenu":{"name":"SDLTriggerSourceMenu","abstract":"<p>Selection made via menu</p>"},"Constants.html#/c:@SDLTriggerSourceVoiceRecognition":{"name":"SDLTriggerSourceVoiceRecognition","abstract":"<p>Selection made via Voice session</p>"},"Constants.html#/c:@SDLTriggerSourceKeyboard":{"name":"SDLTriggerSourceKeyboard","abstract":"<p>Selection made via Keyboard</p>"},"Constants.html#/c:@SDLTurnSignalOff":{"name":"SDLTurnSignalOff","abstract":"<p>Turn signal is OFF</p>"},"Constants.html#/c:@SDLTurnSignalLeft":{"name":"SDLTurnSignalLeft","abstract":"<p>Left turn signal is on</p>"},"Constants.html#/c:@SDLTurnSignalRight":{"name":"SDLTurnSignalRight","abstract":"<p>Right turn signal is on</p>"},"Constants.html#/c:@SDLTurnSignalBoth":{"name":"SDLTurnSignalBoth","abstract":"<p>Both signals (left and right) are on</p>"},"Constants.html#/c:@SDLUpdateModeCountUp":{"name":"SDLUpdateModeCountUp","abstract":"<p>Starts the media clock timer counting upward, in increments of 1 second.</p>"},"Constants.html#/c:@SDLUpdateModeCountDown":{"name":"SDLUpdateModeCountDown","abstract":"<p>Starts the media clock timer counting downward, in increments of 1 second.</p>"},"Constants.html#/c:@SDLUpdateModePause":{"name":"SDLUpdateModePause","abstract":"<p>Pauses the media clock timer.</p>"},"Constants.html#/c:@SDLUpdateModeResume":{"name":"SDLUpdateModeResume","abstract":"<p>Resumes the media clock timer. The timer resumes counting in whatever mode was in effect before pausing (i.e. COUNTUP or COUNTDOWN).</p>"},"Constants.html#/c:@SDLUpdateModeClear":{"name":"SDLUpdateModeClear","abstract":"<p>Clear the media clock timer.</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveNotConfirmed","abstract":"<p>Inactive not confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveConfirmed","abstract":"<p>Inactive confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusActiveNotConfirmed","abstract":"<p>Active not confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveConfirmed":{"name":"SDLVehicleDataActiveStatusActiveConfirmed","abstract":"<p>Active confirmed</p>"},"Constants.html#/c:@SDLVehicleDataActiveStatusFault":{"name":"SDLVehicleDataActiveStatusFault","abstract":"<p>Fault</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNoEvent":{"name":"SDLVehicleDataEventStatusNoEvent","abstract":"<p>No event</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNo":{"name":"SDLVehicleDataEventStatusNo","abstract":"<p>The event is a No status</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusYes":{"name":"SDLVehicleDataEventStatusYes","abstract":"<p>The event is a Yes status</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusNotSupported":{"name":"SDLVehicleDataEventStatusNotSupported","abstract":"<p>Vehicle data event is not supported</p>"},"Constants.html#/c:@SDLVehicleDataEventStatusFault":{"name":"SDLVehicleDataEventStatusFault","abstract":"<p>The event is a Fault status</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotSupported":{"name":"SDLVehicleDataNotificationStatusNotSupported","abstract":"<p>The vehicle data notification status is not supported</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNormal":{"name":"SDLVehicleDataNotificationStatusNormal","abstract":"<p>The vehicle data notification status is normal</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusActive":{"name":"SDLVehicleDataNotificationStatusActive","abstract":"<p>The vehicle data notification status is active</p>"},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotUsed":{"name":"SDLVehicleDataNotificationStatusNotUsed","abstract":"<p>The vehicle data notification status is not used</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeSuccess":{"name":"SDLVehicleDataResultCodeSuccess","abstract":"<p>Individual vehicle data item / DTC / DID request or subscription successful</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeTruncatedData":{"name":"SDLVehicleDataResultCodeTruncatedData","abstract":"<p>DTC / DID request successful, however, not all active DTCs or full contents of DID location available</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDisallowed":{"name":"SDLVehicleDataResultCodeDisallowed","abstract":"<p>This vehicle data item is not allowed for this app by SDL</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeUserDisallowed":{"name":"SDLVehicleDataResultCodeUserDisallowed","abstract":"<p>The user has not granted access to this type of vehicle data item at this time</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeInvalidId":{"name":"SDLVehicleDataResultCodeInvalidId","abstract":"<p>The ECU ID referenced is not a valid ID on the bus / system</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeVehicleDataNotAvailable":{"name":"SDLVehicleDataResultCodeVehicleDataNotAvailable","abstract":"<p>The requested vehicle data item / DTC / DID is not currently available or responding on the bus / system</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDataAlreadySubscribed":{"name":"SDLVehicleDataResultCodeDataAlreadySubscribed","abstract":"<p>The vehicle data item is already subscribed</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeDataNotSubscribed":{"name":"SDLVehicleDataResultCodeDataNotSubscribed","abstract":"<p>The vehicle data item cannot be unsubscribed because it is not currently subscribed</p>"},"Constants.html#/c:@SDLVehicleDataResultCodeIgnored":{"name":"SDLVehicleDataResultCodeIgnored","abstract":"<p>The request for this item is ignored because it is already in progress</p>"},"Constants.html#/c:@SDLVehicleDataStatusNoDataExists":{"name":"SDLVehicleDataStatusNoDataExists","abstract":"<p>No data available</p>"},"Constants.html#/c:@SDLVehicleDataStatusOff":{"name":"SDLVehicleDataStatusOff","abstract":"<p>The status is Off</p>"},"Constants.html#/c:@SDLVehicleDataStatusOn":{"name":"SDLVehicleDataStatusOn","abstract":"<p>The status is On</p>"},"Constants.html#/c:@SDLVehicleDataTypeGearStatus":{"name":"SDLVehicleDataTypeGearStatus","abstract":"<p>Vehicle Gear Status data"},"Constants.html#/c:@SDLVehicleDataTypeGPS":{"name":"SDLVehicleDataTypeGPS","abstract":"<p>GPS vehicle data</p>"},"Constants.html#/c:@SDLVehicleDataTypeSpeed":{"name":"SDLVehicleDataTypeSpeed","abstract":"<p>Vehicle speed data</p>"},"Constants.html#/c:@SDLVehicleDataTypeStabilityControlsStatus":{"name":"SDLVehicleDataTypeStabilityControlsStatus","abstract":"<p>vehicle data StabilityControlsStatus to know if stability controls like ESC, Traction Control etc. are active.</p>"},"Constants.html#/c:@SDLVehicleDataTypeRPM":{"name":"SDLVehicleDataTypeRPM","abstract":"<p>Vehicle RPM data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelLevel":{"name":"SDLVehicleDataTypeFuelLevel","abstract":"<p>Vehicle fuel level data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelLevelState":{"name":"SDLVehicleDataTypeFuelLevelState","abstract":"<p>Vehicle fuel level state data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelConsumption":{"name":"SDLVehicleDataTypeFuelConsumption","abstract":"<p>Vehicle fuel consumption data</p>"},"Constants.html#/c:@SDLVehicleDataTypeExternalTemperature":{"name":"SDLVehicleDataTypeExternalTemperature","abstract":"<p>Vehicle external temperature data"},"Constants.html#/c:@SDLVehicleDataTypeVehicleDataClimateData":{"name":"SDLVehicleDataTypeVehicleDataClimateData","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLVehicleDataTypeVIN":{"name":"SDLVehicleDataTypeVIN","abstract":"<p>Vehicle VIN data</p>"},"Constants.html#/c:@SDLVehicleDataTypePRNDL":{"name":"SDLVehicleDataTypePRNDL","abstract":"<p>Vehicle PRNDL data</p>"},"Constants.html#/c:@SDLVehicleDataTypeTirePressure":{"name":"SDLVehicleDataTypeTirePressure","abstract":"<p>Vehicle tire pressure data</p>"},"Constants.html#/c:@SDLVehicleDataTypeOdometer":{"name":"SDLVehicleDataTypeOdometer","abstract":"<p>Vehicle odometer data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBeltStatus":{"name":"SDLVehicleDataTypeBeltStatus","abstract":"<p>Vehicle belt status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBodyInfo":{"name":"SDLVehicleDataTypeBodyInfo","abstract":"<p>Vehicle body info data</p>"},"Constants.html#/c:@SDLVehicleDataTypeDeviceStatus":{"name":"SDLVehicleDataTypeDeviceStatus","abstract":"<p>Vehicle device status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeECallInfo":{"name":"SDLVehicleDataTypeECallInfo","abstract":"<p>Vehicle emergency call info data</p>"},"Constants.html#/c:@SDLVehicleDataTypeFuelRange":{"name":"SDLVehicleDataTypeFuelRange","abstract":"<p>Vehicle fuel range data</p>"},"Constants.html#/c:@SDLVehicleDataTypeAirbagStatus":{"name":"SDLVehicleDataTypeAirbagStatus","abstract":"<p>Vehicle airbag status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEmergencyEvent":{"name":"SDLVehicleDataTypeEmergencyEvent","abstract":"<p>Vehicle emergency event info</p>"},"Constants.html#/c:@SDLVehicleDataTypeClusterModeStatus":{"name":"SDLVehicleDataTypeClusterModeStatus","abstract":"<p>Vehicle cluster mode status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeMyKey":{"name":"SDLVehicleDataTypeMyKey","abstract":"<p>Vehicle MyKey data</p>"},"Constants.html#/c:@SDLVehicleDataTypeBraking":{"name":"SDLVehicleDataTypeBraking","abstract":"<p>Vehicle braking data</p>"},"Constants.html#/c:@SDLVehicleDataTypeWiperStatus":{"name":"SDLVehicleDataTypeWiperStatus","abstract":"<p>Vehicle wiper status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeHandsOffSteering":{"name":"SDLVehicleDataTypeHandsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel"},"Constants.html#/c:@SDLVehicleDataTypeHeadlampStatus":{"name":"SDLVehicleDataTypeHeadlampStatus","abstract":"<p>Vehicle headlamp status</p>"},"Constants.html#/c:@SDLVehicleDataTypeBatteryVoltage":{"name":"SDLVehicleDataTypeBatteryVoltage","abstract":"<p>Vehicle battery voltage data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEngineOilLife":{"name":"SDLVehicleDataTypeEngineOilLife","abstract":"<p>Vehicle engine oil life data</p>"},"Constants.html#/c:@SDLVehicleDataTypeEngineTorque":{"name":"SDLVehicleDataTypeEngineTorque","abstract":"<p>Vehicle engine torque data</p>"},"Constants.html#/c:@SDLVehicleDataTypeAccelerationPedal":{"name":"SDLVehicleDataTypeAccelerationPedal","abstract":"<p>Vehicle acceleration pedal data</p>"},"Constants.html#/c:@SDLVehicleDataTypeSteeringWheel":{"name":"SDLVehicleDataTypeSteeringWheel","abstract":"<p>Vehicle steering wheel data</p>"},"Constants.html#/c:@SDLVehicleDataTypeElectronicParkBrakeStatus":{"name":"SDLVehicleDataTypeElectronicParkBrakeStatus","abstract":"<p>Vehicle electronic parking brake status data</p>"},"Constants.html#/c:@SDLVehicleDataTypeTurnSignal":{"name":"SDLVehicleDataTypeTurnSignal","abstract":"<p>Vehicle turn signal data</p>"},"Constants.html#/c:@SDLVehicleDataTypeCloudAppVehicleID":{"name":"SDLVehicleDataTypeCloudAppVehicleID","abstract":"<p>The cloud application vehicle id. Used by cloud apps to identify a head unit</p>"},"Constants.html#/c:@SDLVehicleDataTypeOEMVehicleDataType":{"name":"SDLVehicleDataTypeOEMVehicleDataType","abstract":"<p>Custom OEM Vehicle data</p>"},"Constants.html#/c:@SDLVehicleDataTypeWindowStatus":{"name":"SDLVehicleDataTypeWindowStatus","abstract":"<p>Describes the status of a window of a door/liftgate etc.</p>"},"Constants.html#/c:@SDLVehicleDataTypeSeatOccupancy":{"name":"SDLVehicleDataTypeSeatOccupancy","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Constants.html#/c:@SDLVentilationModeUpper":{"name":"SDLVentilationModeUpper","abstract":"<p>The upper ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeLower":{"name":"SDLVentilationModeLower","abstract":"<p>The lower ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeBoth":{"name":"SDLVentilationModeBoth","abstract":"<p>The both ventilation mode</p>"},"Constants.html#/c:@SDLVentilationModeNone":{"name":"SDLVentilationModeNone","abstract":"<p>No ventilation mode</p>"},"Constants.html#/c:@SDLVideoStreamingCodecH264":{"name":"SDLVideoStreamingCodecH264","abstract":"<p>H264</p>"},"Constants.html#/c:@SDLVideoStreamingCodecH265":{"name":"SDLVideoStreamingCodecH265","abstract":"<p>H265</p>"},"Constants.html#/c:@SDLVideoStreamingCodecTheora":{"name":"SDLVideoStreamingCodecTheora","abstract":"<p>Theora</p>"},"Constants.html#/c:@SDLVideoStreamingCodecVP8":{"name":"SDLVideoStreamingCodecVP8","abstract":"<p>VP8</p>"},"Constants.html#/c:@SDLVideoStreamingCodecVP9":{"name":"SDLVideoStreamingCodecVP9","abstract":"<p>VP9</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRAW":{"name":"SDLVideoStreamingProtocolRAW","abstract":"<p>RAW</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTP":{"name":"SDLVideoStreamingProtocolRTP","abstract":"<p>RTP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTSP":{"name":"SDLVideoStreamingProtocolRTSP","abstract":"<p>RTSP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolRTMP":{"name":"SDLVideoStreamingProtocolRTMP","abstract":"<p>RTMP</p>"},"Constants.html#/c:@SDLVideoStreamingProtocolWebM":{"name":"SDLVideoStreamingProtocolWebM","abstract":"<p>WebM</p>"},"Constants.html#/c:@SDLVideoStreamingStateStreamable":{"name":"SDLVideoStreamingStateStreamable","abstract":"<p>STREAMABLE, the current app is allowed to stream video</p>"},"Constants.html#/c:@SDLVideoStreamingStateNotStreamable":{"name":"SDLVideoStreamingStateNotStreamable","abstract":"<p>NOT_STREAMABLE, the current app is not allowed to stream video</p>"},"Constants.html#/c:@SDLVRCapabilitiesText":{"name":"SDLVRCapabilitiesText","abstract":"<p>The SDL platform is capable of recognizing spoken text in the current language.</p>"},"Constants.html#/c:@SDLWarningLightStatusOff":{"name":"SDLWarningLightStatusOff","abstract":"<p>The warning light is off</p>"},"Constants.html#/c:@SDLWarningLightStatusOn":{"name":"SDLWarningLightStatusOn","abstract":"<p>The warning light is off</p>"},"Constants.html#/c:@SDLWarningLightStatusFlash":{"name":"SDLWarningLightStatusFlash","abstract":"<p>The warning light is flashing</p>"},"Constants.html#/c:@SDLWarningLightStatusNotUsed":{"name":"SDLWarningLightStatusNotUsed","abstract":"<p>The warning light is unused</p>"},"Constants.html#/c:@SDLWayPointTypeAll":{"name":"SDLWayPointTypeAll","abstract":"<p>All other waypoint types</p>"},"Constants.html#/c:@SDLWayPointTypeDestination":{"name":"SDLWayPointTypeDestination","abstract":"<p>The destination waypoint</p>"},"Constants.html#/c:@SDLWindowTypeMain":{"name":"SDLWindowTypeMain","abstract":"<p>This window type describes the main window on a display.</p>"},"Constants.html#/c:@SDLWindowTypeWidget":{"name":"SDLWindowTypeWidget","abstract":"<p>A widget is a small window that the app can create to provide information and soft buttons for quick app control.</p>"},"Constants.html#/c:@SDLWiperStatusOff":{"name":"SDLWiperStatusOff","abstract":"<p>Wiper is off</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticOff":{"name":"SDLWiperStatusAutomaticOff","abstract":"<p>Wiper is off automatically</p>"},"Constants.html#/c:@SDLWiperStatusOffMoving":{"name":"SDLWiperStatusOffMoving","abstract":"<p>Wiper is moving but off</p>"},"Constants.html#/c:@SDLWiperStatusManualIntervalOff":{"name":"SDLWiperStatusManualIntervalOff","abstract":"<p>Wiper is off due to a manual interval</p>"},"Constants.html#/c:@SDLWiperStatusManualIntervalOn":{"name":"SDLWiperStatusManualIntervalOn","abstract":"<p>Wiper is on due to a manual interval</p>"},"Constants.html#/c:@SDLWiperStatusManualLow":{"name":"SDLWiperStatusManualLow","abstract":"<p>Wiper is on low manually</p>"},"Constants.html#/c:@SDLWiperStatusManualHigh":{"name":"SDLWiperStatusManualHigh","abstract":"<p>Wiper is on high manually</p>"},"Constants.html#/c:@SDLWiperStatusManualFlick":{"name":"SDLWiperStatusManualFlick","abstract":"<p>Wiper is on for a single wipe manually</p>"},"Constants.html#/c:@SDLWiperStatusWash":{"name":"SDLWiperStatusWash","abstract":"<p>Wiper is in wash mode</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticLow":{"name":"SDLWiperStatusAutomaticLow","abstract":"<p>Wiper is on low automatically</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticHigh":{"name":"SDLWiperStatusAutomaticHigh","abstract":"<p>Wiper is on high automatically</p>"},"Constants.html#/c:@SDLWiperStatusCourtesyWipe":{"name":"SDLWiperStatusCourtesyWipe","abstract":"<p>Wiper is performing a courtesy wipe</p>"},"Constants.html#/c:@SDLWiperStatusAutomaticAdjust":{"name":"SDLWiperStatusAutomaticAdjust","abstract":"<p>Wiper is on automatic adjust</p>"},"Constants.html#/c:@SDLWiperStatusStalled":{"name":"SDLWiperStatusStalled","abstract":"<p>Wiper is stalled</p>"},"Constants.html#/c:@SDLWiperStatusNoDataExists":{"name":"SDLWiperStatusNoDataExists","abstract":"<p>Wiper data is not available</p>"},"Constants.html#/c:@SmartDeviceLinkVersionNumber":{"name":"SmartDeviceLinkVersionNumber","abstract":"<p>Project version number for SmartDeviceLink.</p>"},"Constants.html#/c:@SmartDeviceLinkVersionString":{"name":"SmartDeviceLinkVersionString","abstract":"<p>Project version string for SmartDeviceLink.</p>"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(im)initWithType:maximumNumberOfWindows:":{"name":"-initWithType:maximumNumberOfWindows:","abstract":"<p>Init with required parameters</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(py)type":{"name":"type","abstract":"<p>Type of windows available, to create.</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowTypeCapabilities.html#/c:objc(cs)SDLWindowTypeCapabilities(py)maximumNumberOfWindows":{"name":"maximumNumberOfWindows","abstract":"<p>Number of windows available, to create.</p>","parent_name":"SDLWindowTypeCapabilities"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(im)initWithLocation:state:":{"name":"-initWithLocation:state:","parent_name":"SDLWindowStatus"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(py)location":{"name":"location","abstract":"<p>location</p>","parent_name":"SDLWindowStatus"},"Classes/SDLWindowStatus.html#/c:objc(cs)SDLWindowStatus(py)state":{"name":"state","abstract":"<p>state</p>","parent_name":"SDLWindowStatus"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(im)initWithApproximatePosition:deviation:":{"name":"-initWithApproximatePosition:deviation:","parent_name":"SDLWindowState"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(py)approximatePosition":{"name":"approximatePosition","abstract":"<p>The approximate percentage that the window is open - 0 being fully closed, 100 being fully open</p>","parent_name":"SDLWindowState"},"Classes/SDLWindowState.html#/c:objc(cs)SDLWindowState(py)deviation":{"name":"deviation","abstract":"<p>The percentage deviation of the approximatePosition. e.g. If the approximatePosition is 50 and the deviation is 10, then the window&rsquo;s location is somewhere between 40 and 60.</p>","parent_name":"SDLWindowState"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(im)initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:":{"name":"-initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(im)initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:":{"name":"-initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)windowID":{"name":"windowID","abstract":"<p>The specified ID of the window. Can be set to a predefined window, or omitted for the main window on the main display.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)textFields":{"name":"textFields","abstract":"<p>A set of all fields that support text data. - see: TextField</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)imageFields":{"name":"imageFields","abstract":"<p>A set of all fields that support images. - see: ImageField</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)imageTypeSupported":{"name":"imageTypeSupported","abstract":"<p>Provides information about image types supported by the system.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)templatesAvailable":{"name":"templatesAvailable","abstract":"<p>A set of all window templates available on the head unit.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)numCustomPresetsAvailable":{"name":"numCustomPresetsAvailable","abstract":"<p>The number of on-window custom presets available (if any); otherwise omitted.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>The number of buttons and the capabilities of each on-window button.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>The number of soft buttons available on-window and the capabilities for each button.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)menuLayoutsAvailable":{"name":"menuLayoutsAvailable","abstract":"<p>An array of available menu layouts. If this parameter is not provided, only the <code>LIST</code> layout is assumed to be available.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)dynamicUpdateCapabilities":{"name":"dynamicUpdateCapabilities","abstract":"<p>Contains the head unit&rsquo;s capabilities for dynamic updating features declaring if the module will send dynamic update RPCs.</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWindowCapability.html#/c:objc(cs)SDLWindowCapability(py)keyboardCapabilities":{"name":"keyboardCapabilities","abstract":"<p>See KeyboardCapabilities</p>","parent_name":"SDLWindowCapability"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(im)initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:":{"name":"-initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)currentForecastSupported":{"name":"currentForecastSupported","abstract":"<p>Whether or not the current forecast is supported.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMultidayForecastAmount":{"name":"maxMultidayForecastAmount","abstract":"<p>The maximum number of day-by-day forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxHourlyForecastAmount":{"name":"maxHourlyForecastAmount","abstract":"<p>The maximum number of hour-by-hour forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMinutelyForecastAmount":{"name":"maxMinutelyForecastAmount","abstract":"<p>The maximum number of minute-by-minute forecasts.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)weatherForLocationSupported":{"name":"weatherForLocationSupported","abstract":"<p>Whether or not the weather for location is supported.</p>","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:":{"name":"-initWithLocation:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:":{"name":"-initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)location":{"name":"location","abstract":"<p>The location.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)currentForecast":{"name":"currentForecast","abstract":"<p>The current forecast.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)minuteForecast":{"name":"minuteForecast","abstract":"<p>A minute-by-minute array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)hourlyForecast":{"name":"hourlyForecast","abstract":"<p>An hour-by-hour array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)multidayForecast":{"name":"multidayForecast","abstract":"<p>A day-by-day array of forecasts.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)alerts":{"name":"alerts","abstract":"<p>An array of weather alerts. This array should be ordered with the first object being the current day.</p>","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(im)initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:":{"name":"-initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:","abstract":"<p>Convenience init for all parameters</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)currentTemperature":{"name":"currentTemperature","abstract":"<p>The current temperature.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureHigh":{"name":"temperatureHigh","abstract":"<p>The predicted high temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureLow":{"name":"temperatureLow","abstract":"<p>The predicted low temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperature":{"name":"apparentTemperature","abstract":"<p>The apparent temperature.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureHigh":{"name":"apparentTemperatureHigh","abstract":"<p>The predicted high apparent temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureLow":{"name":"apparentTemperatureLow","abstract":"<p>The predicted low apparent temperature for the day.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherSummary":{"name":"weatherSummary","abstract":"<p>A summary of the weather.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)time":{"name":"time","abstract":"<p>The time this data refers to.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)humidity":{"name":"humidity","abstract":"<p>From 0 to 1, percentage humidity.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)cloudCover":{"name":"cloudCover","abstract":"<p>From 0 to 1, percentage cloud cover.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)moonPhase":{"name":"moonPhase","abstract":"<p>From 0 to 1, percentage of the moon seen, e.g. 0 = no moon, 0.25 = quarter moon</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windBearing":{"name":"windBearing","abstract":"<p>In degrees, true north at 0 degrees.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windGust":{"name":"windGust","abstract":"<p>In km/hr</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windSpeed":{"name":"windSpeed","abstract":"<p>In km/hr</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormBearing":{"name":"nearestStormBearing","abstract":"<p>In degrees, true north at 0 degrees.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormDistance":{"name":"nearestStormDistance","abstract":"<p>In km</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipAccumulation":{"name":"precipAccumulation","abstract":"<p>In cm</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipIntensity":{"name":"precipIntensity","abstract":"<p>In cm of water per hour.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipProbability":{"name":"precipProbability","abstract":"<p>From 0 to 1, percentage chance.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipType":{"name":"precipType","abstract":"<p>A description of the precipitation type (e.g. &ldquo;rain&rdquo;, &ldquo;snow&rdquo;, &ldquo;sleet&rdquo;, &ldquo;hail&rdquo;)</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)visibility":{"name":"visibility","abstract":"<p>In km</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherIcon":{"name":"weatherIcon","abstract":"<p>The weather icon image.</p>","parent_name":"SDLWeatherData"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(im)initWithTitle:summary:expires:regions:severity:timeIssued:":{"name":"-initWithTitle:summary:expires:regions:severity:timeIssued:","abstract":"<p>Convenience init for all parameters</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)title":{"name":"title","abstract":"<p>The title of the alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)summary":{"name":"summary","abstract":"<p>A summary for the alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)expires":{"name":"expires","abstract":"<p>The date the alert expires.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)regions":{"name":"regions","abstract":"<p>Regions affected.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)severity":{"name":"severity","abstract":"<p>Severity of the weather alert.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)timeIssued":{"name":"timeIssued","abstract":"<p>The date the alert was issued.</p>","parent_name":"SDLWeatherAlert"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:":{"name":"-initWithText:image:","abstract":"<p>Convenience init to create a VR help item with the following parameters</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:position:":{"name":"-initWithText:image:position:","abstract":"<p>Convenience init to create a VR help item with all parameters</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)text":{"name":"text","abstract":"<p>Text to display for VR Help item</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)image":{"name":"image","abstract":"<p>Image for VR Help item</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)position":{"name":"position","abstract":"<p>Position to display item in VR Help list</p>","parent_name":"SDLVRHelpItem"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The strings the user can say to activate this voice command</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)handler":{"name":"handler","abstract":"<p>The handler that will be called when the command is activated</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(im)initWithVoiceCommands:handler:":{"name":"-initWithVoiceCommands:handler:","abstract":"<p>Convenience init</p>","parent_name":"SDLVoiceCommand"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)minimumAspectRatio":{"name":"minimumAspectRatio","abstract":"<p>The minimum supported normalized aspect ratio, min value is 1.0, defaults to 1.0</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)maximumAspectRatio":{"name":"maximumAspectRatio","abstract":"<p>The maximum supported normalized aspect ratio, min value is 1.0, defaults to 9999.0</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)minimumDiagonal":{"name":"minimumDiagonal","abstract":"<p>The minimum supported diagonal screen size in inches, defaults to 0.0 (matches any size)</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)minimumResolution":{"name":"minimumResolution","abstract":"<p>The minimum resolution to support, it overrides .minimumAspectRatio</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(py)maximumResolution":{"name":"maximumResolution","abstract":"<p>The maximum resolution to support, it overrides .maximumAspectRatio</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)initWithMinimumResolution:maximumResolution:":{"name":"-initWithMinimumResolution:maximumResolution:","abstract":"<p>Create a video streaming range based on a minimum and maximum resolution</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)initWithMinimumResolution:maximumResolution:minimumAspectRatio:maximumAspectRatio:minimumDiagonal:":{"name":"-initWithMinimumResolution:maximumResolution:minimumAspectRatio:maximumAspectRatio:minimumDiagonal:","abstract":"<p>Create a video streaming range with all supported options</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(cm)disabled":{"name":"+disabled","abstract":"<p>A convenience method to create a disabled range with the min and max resolutions equal to zero</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)isImageResolutionInRange:":{"name":"-isImageResolutionInRange:","abstract":"<p>Check if the argument is within the [.minimumResolution, .maximumResolution] range</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingRange.html#/c:objc(cs)SDLVideoStreamingRange(im)isAspectRatioInRange:":{"name":"-isAspectRatioInRange:","abstract":"<p>Check if the argument is within the [.minimumAspectRatio, .maximumAspectRatio] range</p>","parent_name":"SDLVideoStreamingRange"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)protocol":{"name":"protocol","abstract":"<p>Protocol type, see VideoStreamingProtocol</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)codec":{"name":"codec","abstract":"<p>Codec type, see VideoStreamingCodec</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(im)initWithCodec:protocol:":{"name":"-initWithCodec:protocol:","abstract":"<p>Convenience init</p>","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(im)initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:diagonalScreenSize:pixelPerInch:scale:","abstract":"<p>Convenience init for creating a video streaming capability with all parameters.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(im)initWithPreferredResolution:maxBitrate:supportedFormats:hapticSpatialDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticSpatialDataSupported:diagonalScreenSize:pixelPerInch:scale:preferredFPS:","abstract":"<p>Convenience init for creating a video streaming capability with all parameters.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredResolution":{"name":"preferredResolution","abstract":"<p>The preferred resolution of a video stream for decoding and rendering on HMI</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)maxBitrate":{"name":"maxBitrate","abstract":"<p>The maximum bitrate of video stream that is supported, in kbps, optional</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)supportedFormats":{"name":"supportedFormats","abstract":"<p>Detailed information on each format supported by this system, in its preferred order</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)hapticSpatialDataSupported":{"name":"hapticSpatialDataSupported","abstract":"<p>True if the system can utilize the haptic spatial data from the source being streamed.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)diagonalScreenSize":{"name":"diagonalScreenSize","abstract":"<p>The diagonal screen size in inches.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)pixelPerInch":{"name":"pixelPerInch","abstract":"<p>The diagonal resolution in pixels divided by the diagonal screen size in inches.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)scale":{"name":"scale","abstract":"<p>The scaling factor the app should use to change the size of the projecting view.</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)additionalVideoStreamingCapabilities":{"name":"additionalVideoStreamingCapabilities","abstract":"<p>{&ldquo;array_min_size&rdquo;: 1, &ldquo;array_max_size&rdquo;: 100}</p>","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredFPS":{"name":"preferredFPS","abstract":"<p>The preferred frame rate per second of the head unit. The mobile application / app library may take other factors into account that constrain the frame rate lower than this value, but it should not perform streaming at a higher frame rate than this value.","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)major":{"name":"major","abstract":"<p>Major version (e.g. X.0.0)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)minor":{"name":"minor","abstract":"<p>Minor version (e.g. 0.X.0)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)patch":{"name":"patch","abstract":"<p>Patch version (e.g. 0.0.X)</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)stringVersion":{"name":"stringVersion","abstract":"<p>A String format of the current SDLVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithMajor:minor:patch:":{"name":"-initWithMajor:minor:patch:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithMajor:minor:patch:":{"name":"+versionWithMajor:minor:patch:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithString:":{"name":"-initWithString:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithString:":{"name":"+versionWithString:","abstract":"<p>Convenience init</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithSDLMsgVersion:":{"name":"-initWithSDLMsgVersion:","abstract":"<p>Convenience init to set version using SDLMsgVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithSDLMsgVersion:":{"name":"+versionWithSDLMsgVersion:","abstract":"<p>Convenience init to set version using SDLMsgVersion</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)compare:":{"name":"-compare:","abstract":"<p>Compare two SDLVersions</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanVersion:":{"name":"-isLessThanVersion:","abstract":"<p>Compare is less than</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isEqualToVersion:":{"name":"-isEqualToVersion:","abstract":"<p>Compare is equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanVersion:":{"name":"-isGreaterThanVersion:","abstract":"<p>Compare is greater than</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanOrEqualToVersion:":{"name":"-isGreaterThanOrEqualToVersion:","abstract":"<p>Compare is greater than or equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanOrEqualToVersion:":{"name":"-isLessThanOrEqualToVersion:","abstract":"<p>Compare is less than or equal to</p>","parent_name":"SDLVersion"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)make":{"name":"make","abstract":"<p>The make of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)model":{"name":"model","abstract":"<p>The model of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)modelYear":{"name":"modelYear","abstract":"<p>The model year of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)trim":{"name":"trim","abstract":"<p>The trim of the vehicle</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(im)initWithMake:model:modelYear:trim:":{"name":"-initWithMake:model:modelYear:trim:","abstract":"<p>Initialize the object</p>","parent_name":"SDLVehicleType"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(im)initWithDataType:resultCode:":{"name":"-initWithDataType:resultCode:","abstract":"<p>Convenience init for creating a SDLVehicleDataResult with a dataType</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(im)initWithCustomOEMDataType:resultCode:":{"name":"-initWithCustomOEMDataType:resultCode:","abstract":"<p>Convenience init for creating a SDLVehicleDataResult with a customDataType</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)dataType":{"name":"dataType","abstract":"<p>Defined published data element type</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)customOEMDataType":{"name":"customOEMDataType","abstract":"<p>OEM custom defined published data element type</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)resultCode":{"name":"resultCode","abstract":"<p>Published data result code</p>","parent_name":"SDLVehicleDataResult"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(im)initWithTurnList:softButtons:":{"name":"-initWithTurnList:softButtons:","abstract":"<p>Convenience init to update a list of maneuvers for navigation</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)turnList":{"name":"turnList","abstract":"<p>Optional, SDLTurn, 1 - 100 entries</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)softButtons":{"name":"softButtons","abstract":"<p>Required, SDLSoftButton, 0 - 1 Entries</p>","parent_name":"SDLUpdateTurnList"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The result of requesting to unsubscribe to the GPSData.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The result of requesting to unsubscribe to the vehicle speed in kilometers per hour.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The result of requesting to unsubscribe to the number of revolutions per minute of the engine.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The result of requesting to unsubscribe to the fuel level in the tank (percentage)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The result of requesting to unsubscribe to the fuel level state.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The result of requesting to unsubscribe to the fuel range.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The result of requesting to unsubscribe to the instantaneous fuel consumption in microlitres.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The result of requesting to unsubscribe to the tireStatus.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>The result of requesting to unsubscribe to the odometer in km.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the seat belts.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The result of requesting to unsubscribe to the body information including power modes.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The result of requesting to unsubscribe to the device status including signal and battery strength.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The result of requesting to unsubscribe to the status of the brake pedal.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the wipers.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>The result of requesting to unsubscribe from the status of driver hands are off the steering wheel</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>The result of requesting to unsubscribe to the status of the head lamps.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The result of requesting to unsubscribe to the estimated percentage of remaining oil life of the engine.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>The result of requesting to unsubscribe to the torque value for engine (in Nm) on non-diesel variants.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>The result of requesting to unsubscribe to the accelerator pedal position (percentage depressed)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>The result of requesting to unsubscribe to the current angle of the steering wheel (in deg)</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>The result of requesting to unsubscribe to the emergency call info</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The result of requesting to unsubscribe to the airbag status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>The result of requesting to unsubscribe to the emergency event</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"<p>The result of requesting to unsubscribe to the cluster modes</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>The result of requesting to unsubscribe to the myKey status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The result of requesting to unsubscribe to the electronic parking brake status</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The result of requesting to unsubscribe to the turn signal</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The result of requesting to unsubscribe to the cloud app vehicle id</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"<p>Convenience init for unsubscribing to all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for unsubscribing from all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for unsubscribing from all possible vehicle data items.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gps":{"name":"gps","abstract":"<p>If true, unsubscribes from GPS</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)speed":{"name":"speed","abstract":"<p>If true, unsubscribes from Speed</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"<p>If true, unsubscribes from RPM</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>If true, unsubscribes from Fuel Level</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>If true, unsubscribes from Fuel Level State</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>If true, unsubscribes from Fuel Range</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>If true, unsubscribes from Instant Fuel Consumption</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>If true, unsubscribes from Tire Pressure</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"<p>If true, unsubscribes from Odometer</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>If true, unsubscribes from Belt Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>If true, unsubscribes from Body Information</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>If true, unsubscribes from Device Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>If true, unsubscribes from Driver Braking</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>If true, unsubscribes from Wiper Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>If true, unsubscribes from Head Lamp Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>If true, unsubscribes from Engine Oil Life</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>If true, unsubscribes from Engine Torque</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>If true, unsubscribes from Acc Pedal Position</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>If true, unsubscribes from Steering Wheel Angle data</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>If true, unsubscribes from eCallInfo</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>If true, unsubscribes from Airbag Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>If true, unsubscribes from Emergency Event</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>If true, unsubscribes from Cluster Mode Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"<p>If true, unsubscribes from My Key</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, unsubscribes to the Electronic Parking Brake Status</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, unsubscribes to the Turn Signal</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, unsubscribes to the Cloud App Vehicle ID</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(im)initWithButtonName:":{"name":"-initWithButtonName:","abstract":"<p>Convenience init to unsubscribe from a subscription button</p>","parent_name":"SDLUnsubscribeButton"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(py)buttonName":{"name":"buttonName","abstract":"<p>A name of the button to unsubscribe from","parent_name":"SDLUnsubscribeButton"},"Classes/SDLUnpublishAppService.html#/c:objc(cs)SDLUnpublishAppService(im)initWithServiceID:":{"name":"-initWithServiceID:","abstract":"<p>Create an instance of UnpublishAppService with the serviceID that corresponds with the service to be unpublished</p>","parent_name":"SDLUnpublishAppService"},"Classes/SDLUnpublishAppService.html#/c:objc(cs)SDLUnpublishAppService(py)serviceID":{"name":"serviceID","abstract":"<p>The ID of the service to be unpublished.</p>","parent_name":"SDLUnpublishAppService"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(im)initWithNavigationText:turnIcon:":{"name":"-initWithNavigationText:turnIcon:","abstract":"<p>Convenience init to UpdateTurnList for navigation</p>","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)navigationText":{"name":"navigationText","abstract":"<p>Individual turn text. Must provide at least text or icon for a given turn</p>","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)turnIcon":{"name":"turnIcon","abstract":"<p>Individual turn icon. Must provide at least text or icon for a given turn</p>","parent_name":"SDLTurn"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventDelegate":{"name":"touchEventDelegate","abstract":"<p>Notified of processed touches such as pinches, pans, and taps</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventHandler":{"name":"touchEventHandler","abstract":"<p>Returns all OnTouchEvent notifications as SDLTouch and SDLTouchType objects.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapDistanceThreshold":{"name":"tapDistanceThreshold","abstract":"<p>Distance between two taps on the screen, in the head unit&rsquo;s coordinate system, used for registering double-tap callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)panDistanceThreshold":{"name":"panDistanceThreshold","abstract":"<p>Minimum distance for a pan gesture in the head unit&rsquo;s coordinate system, used for registering pan callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapTimeThreshold":{"name":"tapTimeThreshold","abstract":"<p>Time (in seconds) between tap events to register a double-tap callback. This must be greater than 0.0.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)enableSyncedPanning":{"name":"enableSyncedPanning","abstract":"<p>If set to NO, the display link syncing will be ignored. Defaults to YES.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEnabled":{"name":"touchEnabled","abstract":"<p>Boolean denoting whether or not the touch manager should deliver touch event callbacks.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)cancelPendingTouches":{"name":"-cancelPendingTouches","abstract":"<p>Cancels pending touch event timers that may be in progress.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)initWithHitTester:videoScaleManager:":{"name":"-initWithHitTester:videoScaleManager:","abstract":"<p>Initialize a touch manager with a hit tester and a video scale manager.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)syncFrame":{"name":"-syncFrame","abstract":"<p>Called by SDLStreamingMediaManager in sync with the streaming framerate. This helps to moderate panning gestures by allowing the UI to be modified in time with the framerate.</p>","parent_name":"SDLTouchManager"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)pressAvailable":{"name":"pressAvailable","abstract":"<p>Whether or not long presses are available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)multiTouchAvailable":{"name":"multiTouchAvailable","abstract":"<p>Whether or not multi-touch (e.g. a pinch gesture) is available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)doublePressAvailable":{"name":"doublePressAvailable","abstract":"<p>Whether or not a double tap is available</p>","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)touchEventId":{"name":"touchEventId","abstract":"<p>A touch&rsquo;s unique identifier. The application can track the current touch events by id.</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)timeStamp":{"name":"timeStamp","abstract":"<p>The time that the touch was recorded. This number can the time since the beginning of the session or something else as long as the units are in milliseconds.</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)coord":{"name":"coord","abstract":"<p>The touch&rsquo;s coordinate</p>","parent_name":"SDLTouchEvent"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)x":{"name":"x","abstract":"<p>The x value of the touch coordinate</p>","parent_name":"SDLTouchCoord"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)y":{"name":"y","abstract":"<p>The y value of the touch coordinate</p>","parent_name":"SDLTouchCoord"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(im)initWithTouchEvent:":{"name":"-initWithTouchEvent:","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)identifier":{"name":"identifier","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)location":{"name":"location","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)timeStamp":{"name":"timeStamp","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isFirstFinger":{"name":"isFirstFinger","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isSecondFinger":{"name":"isSecondFinger","abstract":"<p>@abstract","parent_name":"SDLTouch"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)pressureTelltale":{"name":"pressureTelltale","abstract":"<p>Status of the Tire Pressure Telltale. See WarningLightStatus.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftFront":{"name":"leftFront","abstract":"<p>The status of the left front tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightFront":{"name":"rightFront","abstract":"<p>The status of the right front tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftRear":{"name":"leftRear","abstract":"<p>The status of the left rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightRear":{"name":"rightRear","abstract":"<p>The status of the right rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerLeftRear":{"name":"innerLeftRear","abstract":"<p>The status of the inner left rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerRightRear":{"name":"innerRightRear","abstract":"<p>The status of the inner right rear tire.</p>","parent_name":"SDLTireStatus"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)name":{"name":"name","abstract":"<p>The enumeration identifying the field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)characterSet":{"name":"characterSet","abstract":"<p>The set of characters that are supported by this text field. All text is sent in UTF-8 format, but not all systems may support all of the characters expressed by UTF-8. All systems will support at least ASCII, but they may support more, either the LATIN-1 character set, or the full UTF-8 character set.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)width":{"name":"width","abstract":"<p>The number of characters in one row of this field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)rows":{"name":"rows","abstract":"<p>The number of rows for this text field.</p>","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(im)initWithName:characterSet:width:rows:":{"name":"-initWithName:characterSet:width:rows:","abstract":"<p>Convenience initializer for the TextField RPC struct</p>","parent_name":"SDLTextField"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithPredefinedLayout:":{"name":"-initWithPredefinedLayout:","abstract":"<p>Constructor with the required values.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithTemplate:":{"name":"-initWithTemplate:","abstract":"<p>Init with the required values.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(im)initWithTemplate:dayColorScheme:nightColorScheme:":{"name":"-initWithTemplate:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience constructor with all the parameters.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)template":{"name":"template","abstract":"<p>Predefined or dynamically created window template. Currently only predefined window template layouts are defined.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to use when the head unit is in a light / day situation.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateConfiguration.html#/c:objc(cs)SDLTemplateConfiguration(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to use when the head unit is in a dark / night situation.</p>","parent_name":"SDLTemplateConfiguration"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:":{"name":"-initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:","abstract":"<p>Convenience init</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryColor:secondaryColor:backgroundColor:":{"name":"-initWithPrimaryColor:secondaryColor:backgroundColor:","abstract":"<p>Convenience init</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)primaryColor":{"name":"primaryColor","abstract":"<p>The &ldquo;primary&rdquo; color. This must always be your primary brand color. If the OEM only uses one color, this will be the color. It is recommended to the OEMs that the primaryColor should change the <code>mediaClockTimer</code> bar and the highlight color of soft buttons.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)secondaryColor":{"name":"secondaryColor","abstract":"<p>The &ldquo;secondary&rdquo; color. This may be an accent or complimentary color to your primary brand color. If the OEM uses this color, they must also use the primary color. It is recommended to the OEMs that the secondaryColor should change the background color of buttons, such as soft buttons.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The background color to be used on the template. If the OEM does not support this parameter, assume on &ldquo;dayColorScheme&rdquo; that this will be a light color, and on &ldquo;nightColorScheme&rdquo; a dark color. You should do the same for your custom schemes.</p>","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithFahrenheitValue:":{"name":"-initWithFahrenheitValue:","abstract":"<p>Convenience init for a fahrenheit temperature value.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithCelsiusValue:":{"name":"-initWithCelsiusValue:","abstract":"<p>Convenience init for a celsius temperature value.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithUnit:value:":{"name":"-initWithUnit:value:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)unit":{"name":"unit","abstract":"<p>Temperature unit</p>","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)value":{"name":"value","abstract":"<p>Temperature value in specified unit. Range depends on OEM and is not checked by SDL.</p>","parent_name":"SDLTemperature"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(im)initWithText:type:":{"name":"-initWithText:type:","abstract":"<p>Initialize with text and a type</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)textChunksFromString:":{"name":"+textChunksFromString:","abstract":"<p>Create TTS using text</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)sapiChunksFromString:":{"name":"+sapiChunksFromString:","abstract":"<p>Create TTS using SAPI</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)lhPlusChunksFromString:":{"name":"+lhPlusChunksFromString:","abstract":"<p>Create TTS using LH Plus</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)prerecordedChunksFromString:":{"name":"+prerecordedChunksFromString:","abstract":"<p>Create TTS using prerecorded chunks</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)silenceChunks":{"name":"+silenceChunks","abstract":"<p>Create TTS using silence</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)fileChunksWithName:":{"name":"+fileChunksWithName:","abstract":"<p>Create &ldquo;TTS&rdquo; to play an audio file previously uploaded to the system.</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)text":{"name":"text","abstract":"<p>Text to be spoken, a phoneme specification, or the name of a pre-recorded / pre-uploaded sound. The contents of this field are indicated by the &ldquo;type&rdquo; field.</p>","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)type":{"name":"type","abstract":"<p>The type of information in the &ldquo;text&rdquo; field (e.g. phrase to be spoken, phoneme specification, name of pre-recorded sound).</p>","parent_name":"SDLTTSChunk"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithType:fileName:":{"name":"-initWithType:fileName:","abstract":"<p>Create a generic system request with a file name</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithProprietaryType:fileName:":{"name":"-initWithProprietaryType:fileName:","abstract":"<p>Create an OEM_PROPRIETARY system request with a subtype and file name</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestType":{"name":"requestType","abstract":"<p>The type of system request. Note that Proprietary requests should forward the binary data to the known proprietary module on the system.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"<p>A request subType used when the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestType\">requestType</a></code> is <code>OEM_SPECIFIC</code>.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)fileName":{"name":"fileName","abstract":"<p>Filename of HTTP data to store in predefined system staging area.</p>","parent_name":"SDLSystemRequest"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(py)vehicleType":{"name":"vehicleType","abstract":"<p>The connected module&rsquo;s vehicle type: it&rsquo;s make, model, trim, and model year</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(py)systemSoftwareVersion":{"name":"systemSoftwareVersion","abstract":"<p>The connected module&rsquo;s software version</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(py)systemHardwareVersion":{"name":"systemHardwareVersion","abstract":"<p>The connected module&rsquo;s hardware version</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(im)initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:":{"name":"-initWithMake:model:trim:modelYear:softwareVersion:hardwareVersion:","abstract":"<p>Initialize a system info object with individual pieces</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemInfo.html#/c:objc(cs)SDLSystemInfo(im)initWithVehicleType:softwareVersion:hardwareVersion:":{"name":"-initWithVehicleType:softwareVersion:hardwareVersion:","abstract":"<p>Initialize a system info object with the vehicle type and versions</p>","parent_name":"SDLSystemInfo"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)displays":{"name":"displays","abstract":"<p>Provides window capabilities of all displays connected with SDL. By default, one display is connected and supported which includes window capability information of the default main window of the display. May be nil if the system has not provided display and window capability information yet.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>If returned, the platform supports on-screen SoftButtons</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>If returned, the platform supports custom on-screen Presets</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)speechCapabilities":{"name":"speechCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)prerecordedSpeechCapabilities":{"name":"prerecordedSpeechCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)vrCapability":{"name":"vrCapability","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)pcmStreamCapability":{"name":"pcmStreamCapability","abstract":"<div class=\"aside aside-see\">","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"<p>If returned, the platform supports app services</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)navigationCapability":{"name":"navigationCapability","abstract":"<p>If returned, the platform supports navigation</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)phoneCapability":{"name":"phoneCapability","abstract":"<p>If returned, the platform supports making phone calls</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>If returned, the platform supports video streaming</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"<p>If returned, the platform supports remote control capabilities</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)seatLocationCapability":{"name":"seatLocationCapability","abstract":"<p>If returned, the platform supports remote control capabilities for seats</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)driverDistractionCapability":{"name":"driverDistractionCapability","abstract":"<p>If returned, the platform supports driver distraction capabilities</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)defaultMainWindowCapability":{"name":"defaultMainWindowCapability","abstract":"<p>Returns the window capability object of the default main window which is always pre-created by the connected system. This is a convenience method for easily accessing the capabilities of the default main window.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)supportsSubscriptions":{"name":"supportsSubscriptions","abstract":"<p>YES if subscriptions are available on the connected module and you will automatically be notified if the value changes on the module. If NO, calls to <code>subscribe</code> methods will subscribe to updates, but the module will not automatically notify you. You will need to call <code>updateWithCapabilityType:completionHandler:</code> to force an update if you need one (though this should be rare). This does not apply to the <code>DISPLAYS</code> capability type which you can always subscribe to.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)init":{"name":"-init","abstract":"<p>Init is unavailable. Dependencies must be injected using initWithConnectionManager:</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)initWithConnectionManager:":{"name":"-initWithConnectionManager:","abstract":"<p>Creates a new system capability manager with a specified connection manager</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)start":{"name":"-start","abstract":"<p>Starts the manager. This method is used internally.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager. This method is used internally.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)windowCapabilityWithWindowID:":{"name":"-windowCapabilityWithWindowID:","abstract":"<p>Returns the window capability of one of your app&rsquo;s windows with the specified window ID that is on the primary display (i.e. the head unit itself). This is a convenience method to easily access capabilities of windows such as your apps&rsquo; widget windows.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)isCapabilitySupported:":{"name":"-isCapabilitySupported:","abstract":"<p>Returns whether or not the capability type is supported on the module. You can use this to check if subscribing to the capability will work. If this returns NO, then the feature is not supported by the head unit. If YES, the feature is supported by the head unit. You can subscribe to the capability type to get more information about the capability&rsquo;s support and features on the connected module.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)updateCapabilityType:completionHandler:":{"name":"-updateCapabilityType:completionHandler:","abstract":"<p>This method has been superseded by the <code>subscribeToCapabilityType:</code> methods. You should use one of those methods instead unless you only want a value once (you don&rsquo;t want to keep a long-lasting observer) and it must be current (most capabilities do not need to be updated). If you have a separate subscription observer and are connected to a head unit that does not support subscriptions, when this method returns, it will also call all subscription callbacks that you&rsquo;ve set up with the new value if there is one. Therefore, you can use this method to force an update to all subscriptions of that particular type on head units that don&rsquo;t support subscriptions (<code>supportsSubscriptions == NO</code>).</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)subscribeToCapabilityType:withUpdateHandler:":{"name":"-subscribeToCapabilityType:withUpdateHandler:","abstract":"<p>Subscribe to a particular capability type using a handler callback.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)subscribeToCapabilityType:withObserver:selector:":{"name":"-subscribeToCapabilityType:withObserver:selector:","abstract":"<p>Subscribe to a particular capability type with a selector callback.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)unsubscribeFromCapabilityType:withObserver:":{"name":"-unsubscribeFromCapabilityType:withObserver:","abstract":"<p>Unsubscribe from a particular capability type. If it was subscribed with a block / handler, the return value should be passed to the <code>observer</code> to unsubscribe the block. If it was subscribed with a selector, the <code>observer</code> object (on which the selector exists and is called) should be passed to unsubscribe the object selector.</p>","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithAppServicesCapabilities:":{"name":"-initWithAppServicesCapabilities:","abstract":"<p>Convenience init for an App Service Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithNavigationCapability:":{"name":"-initWithNavigationCapability:","abstract":"<p>Convenience init for a Navigation Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithPhoneCapability:":{"name":"-initWithPhoneCapability:","abstract":"<p>Convenience init for a Phone Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithVideoStreamingCapability:":{"name":"-initWithVideoStreamingCapability:","abstract":"<p>Convenience init for a Video Streaming Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithRemoteControlCapability:":{"name":"-initWithRemoteControlCapability:","abstract":"<p>Convenience init for a Remote Control Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithDisplayCapabilities:":{"name":"-initWithDisplayCapabilities:","abstract":"<p>Convenience init for DisplayCapability list</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithSeatLocationCapability:":{"name":"-initWithSeatLocationCapability:","abstract":"<p>Convenience init for a Remote Control Capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithDriverDistractionCapability:":{"name":"-initWithDriverDistractionCapability:","abstract":"<p>Convenience init for a Driver Distraction capability</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"<p>Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other parameter included.</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"<p>Describes the capabilities of app services including what service types are supported and the current state of services.</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)navigationCapability":{"name":"navigationCapability","abstract":"<p>Describes the extended capabilities of the onboard navigation system</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)phoneCapability":{"name":"phoneCapability","abstract":"<p>Describes the extended capabilities of the module&rsquo;s phone feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>Describes the capabilities of the module&rsquo;s video streaming feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"<p>Describes the extended capabilities of the module&rsquo;s remote control feature</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)seatLocationCapability":{"name":"seatLocationCapability","abstract":"<p>Describes information about the locations of each seat</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>Contain the display related information and all windows related to that display</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)driverDistractionCapability":{"name":"driverDistractionCapability","abstract":"<p>Describes capabilities when the driver is distracted</p>","parent_name":"SDLSystemCapability"},"Classes/SDLSubtleAlertResponse.html#/c:objc(cs)SDLSubtleAlertResponse(im)initWithTryAgainTime:":{"name":"-initWithTryAgainTime:","parent_name":"SDLSubtleAlertResponse"},"Classes/SDLSubtleAlertResponse.html#/c:objc(cs)SDLSubtleAlertResponse(py)tryAgainTime":{"name":"tryAgainTime","abstract":"<p>Amount of time (in milliseconds) that an app must wait before resending an alert. If provided, another system event or overlay currently has a higher priority than this alert. An app must not send an alert without waiting at least the amount of time dictated.","parent_name":"SDLSubtleAlertResponse"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(im)initWithAlertText1:alertText2:alertIcon:ttsChunks:duration:softButtons:cancelID:":{"name":"-initWithAlertText1:alertText2:alertIcon:ttsChunks:duration:softButtons:cancelID:","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertText1":{"name":"alertText1","abstract":"<p>The first line of the alert text field","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertText2":{"name":"alertText2","abstract":"<p>The second line of the alert text field","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)alertIcon":{"name":"alertIcon","abstract":"<p>Image to be displayed for the corresponding alert. See Image. If omitted on supported displays, no (or the default if applicable) icon should be displayed.</p>","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks of type TTSChunk. See TTSChunk. The array must have at least one item.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)duration":{"name":"duration","abstract":"<p>Timeout in milliseconds. Typical timeouts are 3-5 seconds. If omitted, timeout is set to 5s.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)softButtons":{"name":"softButtons","abstract":"<p>App defined SoftButtons. If omitted on supported displays, the displayed alert shall not have any SoftButtons.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubtleAlert.html#/c:objc(cs)SDLSubtleAlert(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific alert to allow cancellation through the <code>CancelInteraction</code> RPC.","parent_name":"SDLSubtleAlert"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModes:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The result of requesting to subscribe to the GPSData.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The result of requesting to subscribe to the vehicle speed in kilometers per hour.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The result of requesting to subscribe to the number of revolutions per minute of the engine.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The result of requesting to subscribe to the fuel level in the tank (percentage)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The result of requesting to subscribe to the fuel level state.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The result of requesting to subscribe to the fuel range.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The result of requesting to subscribe to the instantaneous fuel consumption in microlitres.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The result of requesting to subscribe to the tireStatus.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>The result of requesting to subscribe to the odometer in km.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The result of requesting to subscribe to the status of the seat belts.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The result of requesting to subscribe to the body information including power modes.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The result of requesting to subscribe to the device status including signal and battery strength.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The result of requesting to subscribe to the status of the brake pedal.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The result of requesting to subscribe to the status of the wipers.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>The result of requesting to subscribe to the status of the head lamps.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The result of requesting to subscribe to the estimated percentage of remaining oil life of the engine.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>The result of requesting to subscribe to the torque value for engine (in Nm) on non-diesel variants.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>The result of requesting to subscribe to the accelerator pedal position (percentage depressed)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>The result of requesting to subscribe to the current angle of the steering wheel (in deg)</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>The result of requesting to subscribe to the emergency call info</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The result of requesting to subscribe to the airbag status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>The result of requesting to subscribe to the emergency event</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"<p>The result of requesting to subscribe to the cluster modes</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>The result of requesting to subscribe to the myKey status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The result of requesting to subscribe to the electronic parking brake status</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The result of requesting to subscribe to the turn signal</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The result of requesting to subscribe to the cloud app vehicle ID</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for subscribing to all possible vehicle data items.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gps":{"name":"gps","abstract":"<p>A boolean value. If true, subscribes GPS data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)speed":{"name":"speed","abstract":"<p>A boolean value. If true, subscribes Speed data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"<p>A boolean value. If true, subscribes RPM data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>A boolean value. If true, subscribes Fuel Level data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>A boolean value. If true, subscribes Fuel Level State data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>A boolean value. If true, subscribes Fuel Range data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>A boolean value. If true, subscribes Instant Fuel Consumption data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>A boolean value. If true, subscribes Tire Pressure status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"<p>A boolean value. If true, subscribes Odometer data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>A boolean value. If true, subscribes Belt Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>A boolean value. If true, subscribes Body Information data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>A boolean value. If true, subscribes Device Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>A boolean value. If true, subscribes Driver Braking data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>A boolean value. If true, subscribes Wiper Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>A boolean value. If true, subscribes Head Lamp Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>A boolean value. If true, subscribes to Engine Oil Life data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>A boolean value. If true, subscribes Engine Torque data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>A boolean value. If true, subscribes Acc Pedal Position data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>A boolean value. If true, subscribes Steering Wheel Angle data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>A boolean value. If true, subscribes eCall Info data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>A boolean value. If true, subscribes Airbag Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>A boolean value. If true, subscribes Emergency Event data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>A boolean value. If true, subscribes Cluster Mode Status data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"<p>A boolean value. If true, subscribes myKey data.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, subscribes to the electronic parking brake status.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, subscribes to the turn signal status.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, subscribes to the cloud app vehicle ID.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data value for any given OEM custom vehicle data name.</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Construct a SDLSubscribeButton with a handler callback when an event occurs.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithButtonName:handler:":{"name":"-initWithButtonName:handler:","abstract":"<p>Construct a SDLSubscribeButton with a handler callback when an event occurs with a button name.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)handler":{"name":"handler","abstract":"<p>A handler that will let you know when the button you subscribed to is selected.</p>","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)buttonName":{"name":"buttonName","abstract":"<p>The name of the button to subscribe to","parent_name":"SDLSubscribeButton"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)scale":{"name":"scale","abstract":"<p>The scaling factor the app should use to change the size of the projecting view.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)displayViewportResolution":{"name":"displayViewportResolution","abstract":"<p>The screen resolution of the connected display. The units are pixels.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(py)appViewportFrame":{"name":"appViewportFrame","abstract":"<p>The frame of the app&rsquo;s projecting view. This is calculated by dividing the display&rsquo;s viewport resolution by the scale. The units are points.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)init":{"name":"-init","abstract":"<p>Creates a default streaming video scale manager.","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)initWithScale:displayViewportResolution:":{"name":"-initWithScale:displayViewportResolution:","abstract":"<p>Convenience init for creating the manager with a scale and connected display viewport resolution.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)scaleTouchEventCoordinates:":{"name":"-scaleTouchEventCoordinates:","abstract":"<p>Scales the coordinates of an <code>OnTouchEvent</code> from the display&rsquo;s coordinate system to the app&rsquo;s viewport coordinate system. If the scale value is less than 1.0, the touch events will be returned without being scaled.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)scaleHapticRect:":{"name":"-scaleHapticRect:","abstract":"<p>Scales a haptic rectangle from the app&rsquo;s viewport coordinate system to the display&rsquo;s coordinate system. If the scale value is less than 1.0, the haptic rectangle will be returned without being scaled.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)makeScaledResolution":{"name":"-makeScaledResolution","abstract":"<p>Create and return the current display resolution respecting the scale factor</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager. This method is used internally.</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingVideoScaleManager.html#/c:objc(cs)SDLStreamingVideoScaleManager(cm)scale:size:":{"name":"+scale:size:","abstract":"<p>Calculate a new size based on the given size and the scale factor</p>","parent_name":"SDLStreamingVideoScaleManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)touchManager":{"name":"touchManager","abstract":"<p>Touch Manager responsible for providing touch event notifications.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioManager":{"name":"audioManager","abstract":"<p>Audio Manager responsible for managing streaming audio.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)rootViewController":{"name":"rootViewController","abstract":"<p>This property is used for SDLCarWindow, the ability to stream any view controller. To start, you must set an initial view controller on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaConfiguration.html\">SDLStreamingMediaConfiguration</a></code> <code>rootViewController</code>. After streaming begins, you can replace that view controller with a new root by placing the new view controller into this property.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)focusableItemManager":{"name":"focusableItemManager","abstract":"<p>A haptic interface that can be updated to reparse views within the window you&rsquo;ve provided. Send a <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLDidUpdateProjectionView\">SDLDidUpdateProjectionView</a></code> notification or call the <code>updateInterfaceLayout</code> method to reparse. The &ldquo;output&rdquo; of this haptic interface occurs in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)touchManager\">touchManager</a></code> property where it will call the delegate.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)streamingSupported":{"name":"streamingSupported","abstract":"<p>Whether or not video streaming is supported</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoConnected":{"name":"videoConnected","abstract":"<p>Whether or not the video session is connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoEncrypted":{"name":"videoEncrypted","abstract":"<p>Whether or not the video session is encrypted. This may be different than the requestedEncryptionType.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioConnected":{"name":"audioConnected","abstract":"<p>Whether or not the audio session is connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioEncrypted":{"name":"audioEncrypted","abstract":"<p>Whether or not the audio session is encrypted. This may be different than the requestedEncryptionType.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoStreamingPaused":{"name":"videoStreamingPaused","abstract":"<p>Whether or not the video stream is paused due to either the application being backgrounded, the HMI state being either NONE or BACKGROUND, or the video stream not being ready.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)screenSize":{"name":"screenSize","abstract":"<p>The current screen resolution of the connected display in pixels.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoFormat":{"name":"videoFormat","abstract":"<p>This is the agreed upon format of video encoder that is in use, or nil if not currently connected.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)supportedFormats":{"name":"supportedFormats","abstract":"<p>A list of all supported video formats by this manager</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)pixelBufferPool":{"name":"pixelBufferPool","abstract":"<p>The pixel buffer pool reference returned back from an active VTCompressionSessionRef encoder.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)requestedEncryptionType":{"name":"requestedEncryptionType","abstract":"<p>The requested encryption type when a session attempts to connect. This setting applies to both video and audio sessions.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)showVideoBackgroundDisplay":{"name":"showVideoBackgroundDisplay","abstract":"<p>When YES, the StreamingMediaManager will send a black screen with &ldquo;Video Backgrounded String&rdquo;. Defaults to YES.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)initWithConnectionManager:configuration:systemCapabilityManager:":{"name":"-initWithConnectionManager:configuration:systemCapabilityManager:","abstract":"<p>Create a new streaming media manager for navigation and projection apps with a specified configuration.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startWithProtocol:":{"name":"-startWithProtocol:","abstract":"<p>Start the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLManager.html\">SDLManager</a></code>.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopAudio":{"name":"-stopAudio","abstract":"<p>Stop the audio feature of the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopVideo":{"name":"-stopVideo","abstract":"<p>Stop the video feature of the manager. This method is used internally.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:":{"name":"-sendVideoData:","abstract":"<p>This method receives raw image data and will run iOS8+&lsquo;s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:presentationTimestamp:":{"name":"-sendVideoData:presentationTimestamp:","abstract":"<p>This method receives raw image data and will run iOS8+&lsquo;s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"<p>This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback.</p>","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)maximumDesiredEncryption":{"name":"maximumDesiredEncryption","abstract":"<p>What encryption level video/audio streaming should be. The default is SDLStreamingEncryptionFlagAuthenticateAndEncrypt.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)customVideoEncoderSettings":{"name":"customVideoEncoderSettings","abstract":"<p>Properties to use for applications that utilize the video encoder for streaming. See VTCompressionProperties.h for more details. For example, you can set kVTCompressionPropertyKey_ExpectedFrameRate to set your framerate. Setting the framerate this way will also set the framerate if you use CarWindow automatic streaming.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)dataSource":{"name":"dataSource","abstract":"<p>Usable to change run time video stream setup behavior. Only use this and modify the results if you <em>really</em> know what you&rsquo;re doing. The head unit defaults are generally good.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)rootViewController":{"name":"rootViewController","abstract":"<p>Set the initial view controller your video streaming content is within.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)carWindowRenderingType":{"name":"carWindowRenderingType","abstract":"<p>Declares if CarWindow will use layer rendering or view rendering. Defaults to layer rendering.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)enableForcedFramerateSync":{"name":"enableForcedFramerateSync","abstract":"<p>When YES, the StreamingMediaManager will run a CADisplayLink with the framerate set to the video encoder settings kVTCompressionPropertyKey_ExpectedFrameRate. This then forces TouchManager (and CarWindow, if used) to sync their callbacks to the framerate. If using CarWindow, this <em>must</em> be YES. If NO, <code>enableSyncedPanning</code> on SDLTouchManager will be set to NO. Defaults to YES.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)allowMultipleViewControllerOrientations":{"name":"allowMultipleViewControllerOrientations","abstract":"<p>When YES, the StreamingMediaManager will disable its internal checks that the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)rootViewController\">rootViewController</a></code> only has one <code>supportedOrientation</code>. Having multiple orientations can cause streaming issues. If you wish to disable this check, set it to YES. Defaults to NO.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)supportedLandscapeStreamingRange":{"name":"supportedLandscapeStreamingRange","abstract":"<p>Set a landscape image dimension range and/or aspect ratio range that your rootViewController supports. If the module&rsquo;s screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to <code>nil</code>, the default is to support all landscape streaming ranges. If you wish to disable support for streaming in landscape mode, set a <code>disabled</code> video streaming range.","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)supportedPortraitStreamingRange":{"name":"supportedPortraitStreamingRange","abstract":"<p>Set a portrait image dimension range and/or aspect ratio range that your rootViewController supports. If the module&rsquo;s screen size for your app changes during streaming (i.e. to a collapsed view, split screen, preview mode or picture-in-picture), your rootViewController will be resized to the new screen size. If left unset or set to <code>nil</code>, the default is to support all portrait streaming ranges. If you wish to disable support for streaming in portrait mode, set a <code>disabled</code> video streaming range.","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)delegate":{"name":"delegate","abstract":"<p>The configuration delegate, this is an object conforming to the SDLStreamingVideoDelegate protocol. If video streaming parameters change then this object will be called on.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)init":{"name":"-init","abstract":"<p>Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you&rsquo;d like custom video encoder settings, you can set the property manually.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)secureConfiguration":{"name":"+secureConfiguration","abstract":"<p>Create a secure video streaming configuration. Security managers will be provided from SDLEncryptionConfiguration and the encryption flag will be set to SDLStreamingEncryptionFlagAuthenticateAndEncrypt. If you&rsquo;d like custom video encoder settings, you can set the property manually.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithEncryptionFlag:videoSettings:dataSource:rootViewController:":{"name":"-initWithEncryptionFlag:videoSettings:dataSource:rootViewController:","abstract":"<p>Manually set all the properties to the streaming media configuration</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:":{"name":"-initWithEncryptionFlag:videoSettings:supportedLandscapeRange:supportedPortraitRange:dataSource:delegate:rootViewController:","abstract":"<p>Manually set all the properties to the streaming media configuration</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)insecureConfiguration":{"name":"+insecureConfiguration","abstract":"<p>Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you&rsquo;d like custom video encoder settings, you can set the property manually. This is equivalent to <code>init</code>.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingInsecureConfigurationWithInitialViewController:":{"name":"+autostreamingInsecureConfigurationWithInitialViewController:","abstract":"<p>Create a CarWindow insecure configuration with a view controller</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingSecureConfigurationWithInitialViewController:":{"name":"+autostreamingSecureConfigurationWithInitialViewController:","abstract":"<p>Create a CarWindow secure configuration with a view controller.</p>","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(im)initWithCountryCode:fccFacilityId:":{"name":"-initWithCountryCode:fccFacilityId:","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)countryCode":{"name":"countryCode","abstract":"<p>@abstract Binary Representation of ITU Country Code. USA Code is 001.</p>","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)fccFacilityId":{"name":"fccFacilityId","abstract":"<p>@abstract Binary representation of unique facility ID assigned by the FCC","parent_name":"SDLStationIDNumber"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithTimeInterval:":{"name":"-initWithTimeInterval:","abstract":"<p>Create a time struct with a time interval (time in seconds). Fractions of the second will be eliminated and rounded down.</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithHours:minutes:seconds:":{"name":"-initWithHours:minutes:seconds:","abstract":"<p>Create a time struct with hours, minutes, and seconds</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)hours":{"name":"hours","abstract":"<p>The hour of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)minutes":{"name":"minutes","abstract":"<p>The minute of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)seconds":{"name":"seconds","abstract":"<p>The second of the media clock</p>","parent_name":"SDLStartTime"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(im)initWithEscSystem:trailerSwayControl:":{"name":"-initWithEscSystem:trailerSwayControl:","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(py)escSystem":{"name":"escSystem","abstract":"<p>true if vehicle stability control is ON, else false</p>","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLStabilityControlsStatus.html#/c:objc(cs)SDLStabilityControlsStatus(py)trailerSwayControl":{"name":"trailerSwayControl","abstract":"<p>true if vehicle trailer sway control is ON, else false</p>","parent_name":"SDLStabilityControlsStatus"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTS:":{"name":"-initWithTTS:","abstract":"<p>Convenience init to create a speak message</p>","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTSChunks:":{"name":"-initWithTTSChunks:","abstract":"<p>Convenience init to create a speak message</p>","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of TTSChunk structs which, taken together, specify the phrase to be spoken</p>","parent_name":"SDLSpeak"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)name":{"name":"name","abstract":"<p>The name of this soft button state</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)artwork":{"name":"artwork","abstract":"<p>The artwork to be used with this button or nil if it is text-only</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)text":{"name":"text","abstract":"<p>The text to be used with this button or nil if it is image-only</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)highlighted":{"name":"highlighted","abstract":"<p>Whether or not the button should be highlighted on the UI</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)systemAction":{"name":"systemAction","abstract":"<p>A special system action</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)softButton":{"name":"softButton","abstract":"<p>An SDLSoftButton describing this state</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:image:":{"name":"-initWithStateName:text:image:","abstract":"<p>Create the soft button state. Either the text or artwork or both may be set.</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:artwork:":{"name":"-initWithStateName:text:artwork:","abstract":"<p>Create the soft button state. Either the text or artwork or both may be set.</p>","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)name":{"name":"name","abstract":"<p>The name of this button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states":{"name":"states","abstract":"<p>All states available to this button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentState":{"name":"currentState","abstract":"<p>The name of the current state of this soft button</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentStateSoftButton":{"name":"currentStateSoftButton","abstract":"<p>Describes an on-screen button which may be presented in various contexts, e.g. templates or alerts</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)eventHandler":{"name":"eventHandler","abstract":"<p>The handler to be called when the button is in the current state and is pressed</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:states:initialStateName:handler:":{"name":"-initWithName:states:initialStateName:handler:","abstract":"<p>Create a multi-state (or single-state, but you should use initWithName:state: instead for that case) soft button. For example, a button that changes its image or text, such as a repeat or shuffle button.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:state:handler:":{"name":"-initWithName:state:handler:","abstract":"<p>Create a single-state soft button. For example, a button that brings up a Perform Interaction menu.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:text:artwork:handler:":{"name":"-initWithName:text:artwork:handler:","abstract":"<p>Create a single-state soft button. For example, a button that brings up a Perform Interaction menu.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToStateNamed:":{"name":"-transitionToStateNamed:","abstract":"<p>Transition the soft button to another state in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states\">states</a></code> property. The wrapper considers all transitions valid (assuming a state with that name exists).</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToNextState":{"name":"-transitionToNextState","abstract":"<p>Transition the soft button to the next state of the array set when in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states\">states</a></code> property</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)stateWithName:":{"name":"-stateWithName:","abstract":"<p>Return a state from the state array with a specific name.</p>","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"<p>The button supports a short press.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"<p>The button supports a LONG press.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"<p>The button supports &ldquo;button down&rdquo; and &ldquo;button up&rdquo;.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)imageSupported":{"name":"imageSupported","abstract":"<p>The button supports referencing a static or dynamic image.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)textSupported":{"name":"textSupported","abstract":"<p>The button supports the use of text. If not included, the default value should be considered true that the button will support text.</p>","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Convenience init</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithType:text:image:highlighted:buttonId:systemAction:handler:":{"name":"-initWithType:text:image:highlighted:buttonId:systemAction:handler:","abstract":"<p>Convenience init</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)handler":{"name":"handler","abstract":"<p>A handler that may optionally be run when the SDLSoftButton has a corresponding notification occur.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)type":{"name":"type","abstract":"<p>Describes whether this soft button displays only text, only an image, or both</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)text":{"name":"text","abstract":"<p>Optional text to display (if defined as TEXT or BOTH type)</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)image":{"name":"image","abstract":"<p>Optional image struct for SoftButton (if defined as IMAGE or BOTH type)</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)isHighlighted":{"name":"isHighlighted","abstract":"<p>Displays in an alternate mode, e.g. with a colored background or foreground. Depends on the IVI system.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)softButtonID":{"name":"softButtonID","abstract":"<p>Value which is returned via OnButtonPress / OnButtonEvent</p>","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)systemAction":{"name":"systemAction","abstract":"<p>Parameter indicating whether selecting a SoftButton shall call a specific system action. This is intended to allow Notifications to bring the callee into full / focus; or in the case of persistent overlays, the overlay can persist when a SoftButton is pressed.</p>","parent_name":"SDLSoftButton"},"Classes/SDLSliderResponse.html#/c:objc(cs)SDLSliderResponse(py)sliderPosition":{"name":"sliderPosition","abstract":"<p>The selected position of the slider.</p>","parent_name":"SDLSliderResponse"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooters:timeout:cancelID:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooters:timeout:cancelID:","abstract":"<p>Convenience init with all parameters.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:":{"name":"-initWithNumTicks:position:","abstract":"<p>Creates a slider with only the number of ticks and position. Note that this is not enough to get a SUCCESS response. You must supply additional data. See below for required parameters.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooter:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooter:timeout:","abstract":"<p>Creates a slider with all required data and a static footer (or no footer).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooters:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooters:timeout:","abstract":"<p>Creates an slider with all required data and a dynamic footer (or no footer).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)numTicks":{"name":"numTicks","abstract":"<p>Represents a number of selectable items on a horizontal axis.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)position":{"name":"position","abstract":"<p>Initial position of slider control (cannot exceed numTicks).</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderHeader":{"name":"sliderHeader","abstract":"<p>Text header to display.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderFooter":{"name":"sliderFooter","abstract":"<p>Text footer to display.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)timeout":{"name":"timeout","abstract":"<p>App defined timeout. Indicates how long of a timeout from the last action (i.e. sliding control resets timeout). If omitted, the value is set to 10 seconds.</p>","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific slider to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLSlider"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)status":{"name":"status","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)monitoringSystemStatus":{"name":"monitoringSystemStatus","abstract":"<p>The status of TPMS for this particular tire</p>","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)pressure":{"name":"pressure","abstract":"<p>The pressure value of this particular tire in kPa (kilopascals)</p>","parent_name":"SDLSingleTireStatus"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(im)initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:":{"name":"-initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:","abstract":"<p>Convenience init to create navigation directions</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText1":{"name":"navigationText1","abstract":"<p>The first line of text in a multi-line overlay screen.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText2":{"name":"navigationText2","abstract":"<p>The second line of text in a multi-line overlay screen.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)eta":{"name":"eta","abstract":"<p>Estimated Time of Arrival time at final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)timeToDestination":{"name":"timeToDestination","abstract":"<p>The amount of time needed to reach the final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)totalDistance":{"name":"totalDistance","abstract":"<p>The distance to the final destination</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)turnIcon":{"name":"turnIcon","abstract":"<p>An icon to show with the turn description</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)nextTurnIcon":{"name":"nextTurnIcon","abstract":"<p>An icon to show with the next turn description</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuver":{"name":"distanceToManeuver","abstract":"<p>Distance (in meters) until next maneuver. May be used to calculate progress bar.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuverScale":{"name":"distanceToManeuverScale","abstract":"<p>Distance (in meters) from previous maneuver to next maneuver. May be used to calculate progress bar.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)maneuverComplete":{"name":"maneuverComplete","abstract":"<p>If and when a maneuver has completed while an AlertManeuver is active, the app must send this value set to TRUE in order to clear the AlertManeuver overlay. If omitted the value will be assumed as FALSE.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)softButtons":{"name":"softButtons","abstract":"<p>Three dynamic SoftButtons available (first SoftButton is fixed to &ldquo;Turns&rdquo;). If omitted on supported displays, the currently displayed SoftButton values will not change.</p>","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowAppMenu.html#/c:objc(cs)SDLShowAppMenu(im)initWithMenuID:":{"name":"-initWithMenuID:","abstract":"<p>Creates a ShowAppMenu RPC to open the app menu directly to a AddSubMenu RPC&rsquo;s submenu.</p>","parent_name":"SDLShowAppMenu"},"Classes/SDLShowAppMenu.html#/c:objc(cs)SDLShowAppMenu(py)menuID":{"name":"menuID","abstract":"<p>A Menu ID that identifies the AddSubMenu to open if it correlates with the AddSubMenu menuID parameter. If not set the top level menu will be opened.</p>","parent_name":"SDLShowAppMenu"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:":{"name":"-initWithMainField1:mainField2:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:":{"name":"-initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:","abstract":"<p>Convenience init to set template elements with the following parameters</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaTrack:graphic:secondaryGraphic:softButtons:customPresets:metadataTags:templateTitle:windowID:templateConfiguration:","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField1":{"name":"mainField1","abstract":"<p>The text displayed in a single-line display, or in the upper display","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField2":{"name":"mainField2","abstract":"<p>The text displayed on the second display line of a two-line display</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField3":{"name":"mainField3","abstract":"<p>The text displayed on the first display line of the second page</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField4":{"name":"mainField4","abstract":"<p>The text displayed on the second display line of the second page</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)alignment":{"name":"alignment","abstract":"<p>The alignment that Specifies how mainField1 and mainField2 text","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)statusBar":{"name":"statusBar","abstract":"<p>Text in the Status Bar</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaClock":{"name":"mediaClock","abstract":"<p>Text value for MediaClock field. Has to be properly formatted by Mobile App according to the module&rsquo;s capabilities. If this text is set, any automatic media clock updates previously set with SetMediaClockTimer will be stopped.","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaTrack":{"name":"mediaTrack","abstract":"<p>The text in the track field</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)graphic":{"name":"graphic","abstract":"<p>An image to be shown on supported displays</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"<p>An image to be shown on supported displays</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)softButtons":{"name":"softButtons","abstract":"<p>The the Soft buttons defined by the App</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)customPresets":{"name":"customPresets","abstract":"<p>The Custom Presets defined by the App</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)metadataTags":{"name":"metadataTags","abstract":"<p>Text Field Metadata</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)windowID":{"name":"windowID","abstract":"<p>This is the unique ID assigned to the window that this RPC is intended. If this param is not included, it will be assumed that this request is specifically for the main window on the main display. - see: PredefinedWindows enum.</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)templateConfiguration":{"name":"templateConfiguration","abstract":"<p>Used to set an alternate template layout to a window.</p>","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)templateTitle":{"name":"templateTitle","abstract":"<p>The title of the current template.</p>","parent_name":"SDLShow"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countUpFromStartTime:toEndTime:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countUpFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts up, e.g from 0:00 to 4:18.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countDownFromStartTime:toEndTime:playPauseIndicator:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+countDownFromStartTime:toEndTime:playPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Create a media clock timer that counts down, e.g. from 4:18 to 0:00</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)pauseWithPlayPauseIndicator:":{"name":"+pauseWithPlayPauseIndicator:","abstract":"<p>Pause an existing (counting up / down) media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:":{"name":"+updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:","abstract":"<p>Update a pause time (or pause and update the time) on a media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTime:endTime:playPauseIndicator:":{"name":"+updatePauseWithNewStartTime:endTime:playPauseIndicator:","abstract":"<p>Update a pause time (or pause and update the time) on a media clock timer</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)resumeWithPlayPauseIndicator:":{"name":"+resumeWithPlayPauseIndicator:","abstract":"<p>Resume a paused media clock timer. It resumes at the same time at which it was paused.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"+resumeWithPlayPauseIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","abstract":"<p>Resume a paused media clock timer. It resumes at the same time at which it was paused.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)clearWithPlayPauseIndicator:":{"name":"+clearWithPlayPauseIndicator:","abstract":"<p>Remove a media clock timer from the screen</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:":{"name":"-initWithUpdateMode:","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:startTime:endTime:playPauseIndicator:":{"name":"-initWithUpdateMode:startTime:endTime:playPauseIndicator:","abstract":"<p>Create a SetMediaClockTimer RPC with all available parameters. It&rsquo;s recommended to use the specific initializers above.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:":{"name":"-initWithUpdateMode:startTime:endTime:audioStreamingIndicator:forwardSeekIndicator:backSeekIndicator:countRate:","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)startTime":{"name":"startTime","abstract":"<p>A Start Time with specifying hour, minute, second values</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)endTime":{"name":"endTime","abstract":"<p>An END time of type SDLStartTime, specifying hour, minute, second values</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)updateMode":{"name":"updateMode","abstract":"<p>The media clock/timer update mode (COUNTUP/COUNTDOWN/PAUSE/RESUME)</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)audioStreamingIndicator":{"name":"audioStreamingIndicator","abstract":"<p>The audio streaming indicator used for a play/pause button.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)forwardSeekIndicator":{"name":"forwardSeekIndicator","abstract":"<p>Used to control the forward seek button to either skip forward a set amount of time or to the next track.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)backSeekIndicator":{"name":"backSeekIndicator","abstract":"<p>Used to control the back seek button to either skip back a set amount of time or to the previous track.</p>","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)countRate":{"name":"countRate","abstract":"<p>The value of this parameter is the amount that the media clock timer will advance per 1.0 seconds of real time. Values less than 1.0 will therefore advance the timer slower than real-time, while values greater than 1.0 will advance the timer faster than real-time. e.g. If this parameter is set to <code>0.5</code>, the timer will advance one second per two seconds real-time, or at 50% speed. If this parameter is set to <code>2.0</code>, the timer will advance two seconds per one second real-time, or at 200% speed.","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetInteriorVehicleDataResponse.html#/c:objc(cs)SDLSetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"<p>The new module data for the requested module</p>","parent_name":"SDLSetInteriorVehicleDataResponse"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(im)initWithModuleData:":{"name":"-initWithModuleData:","abstract":"<p>Convenience init to change settings of a module</p>","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"<p>The module data to set for the requested RC module.</p>","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:","abstract":"<p>Initialize SetGlobalProperties with all possible items</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithUserLocation:helpPrompt:timeoutPrompt:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:":{"name":"-initWithUserLocation:helpPrompt:timeoutPrompt:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:menuLayout:","abstract":"<p>Convenience init for setting all possible global properties</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Help prompt for when the user asks for help with an interface prompt</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Help prompt for when an interface prompt times out</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelpTitle":{"name":"vrHelpTitle","abstract":"<p>Sets a voice recognition Help Title</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelp":{"name":"vrHelp","abstract":"<p>Sets the items listed in the VR help screen used in an interaction started by Push to Talk</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuTitle":{"name":"menuTitle","abstract":"<p>Text for the menu button label</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuIcon":{"name":"menuIcon","abstract":"<p>Icon for the menu button</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)keyboardProperties":{"name":"keyboardProperties","abstract":"<p>On-screen keyboard (perform interaction) configuration</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)userLocation":{"name":"userLocation","abstract":"<p>Location of the user&rsquo;s seat. Default is driver&rsquo;s seat location if it is not set yet</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuLayout":{"name":"menuLayout","abstract":"<p>The main menu layout. If this is sent while a menu is already on-screen, the head unit will change the display to the new layout type. See available menu layouts on DisplayCapabilities.menuLayoutsAvailable. Defaults to the head unit default.</p>","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>The display capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>The button capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>The soft button capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>The preset bank capabilities of the new template layout</p>","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:":{"name":"-initWithPredefinedLayout:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithLayout:":{"name":"-initWithLayout:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:dayColorScheme:nightColorScheme:":{"name":"-initWithPredefinedLayout:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithLayout:dayColorScheme:nightColorScheme:":{"name":"-initWithLayout:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init to set a display layout</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)displayLayout":{"name":"displayLayout","abstract":"<p>A display layout. Predefined or dynamically created screen layout.","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;light&rdquo; or &ldquo;day&rdquo; color scheme. The OEM may only support this theme if their head unit only has a light color scheme.</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;dark&rdquo; or &ldquo;night&rdquo; color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.</p>","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init.</p>","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(py)properties":{"name":"properties","abstract":"<p>The new cloud application properties.</p>","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init to set an image icon from a file name. The file must already be uploaded to the head unit.</p>","parent_name":"SDLSetAppIcon"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(py)syncFileName":{"name":"syncFileName","abstract":"<p>A file reference name","parent_name":"SDLSetAppIcon"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:":{"name":"-initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:","abstract":"<p>Create a <code>SendLocation</code> request with an address object, without Lat/Long coordinates.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:","abstract":"<p>Create a <code>SendLocation</code> request with Lat/Long coordinate, not an address object</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:","abstract":"<p>Create a <code>SendLocation</code> request with Lat/Long coordinate and an address object and let the nav system decide how to parse it</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>The longitudinal coordinate of the location. Either the latitude / longitude OR the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address\">address</a></code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>The latitudinal coordinate of the location. Either the latitude / longitude OR the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address\">address</a></code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationName":{"name":"locationName","abstract":"<p>Name / title of intended location</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationDescription":{"name":"locationDescription","abstract":"<p>Description of the intended location / establishment</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)addressLines":{"name":"addressLines","abstract":"<p>Location address for display purposes only.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)phoneNumber":{"name":"phoneNumber","abstract":"<p>Phone number of intended location / establishment</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationImage":{"name":"locationImage","abstract":"<p>Image / icon of intended location</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)deliveryMode":{"name":"deliveryMode","abstract":"<p>Mode in which the sendLocation request is sent</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)timeStamp":{"name":"timeStamp","abstract":"<p>Arrival time of Location. If multiple SendLocations are sent, this will be used for sorting as well.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address":{"name":"address","abstract":"<p>Address to be used for setting destination. Either the latitude / longitude OR the <code>address</code> must be provided.</p>","parent_name":"SDLSendLocation"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(im)initWithHapticRectData:":{"name":"-initWithHapticRectData:","abstract":"<p>Constructs a new SDLSendHapticData object indicated by the hapticSpatialData parameter</p>","parent_name":"SDLSendHapticData"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(py)hapticRectData":{"name":"hapticRectData","abstract":"<p>Array of spatial data structures that represent the locations of all user controls present on the HMI. This data should be updated if/when the application presents a new screen. When a request is sent, if successful, it will replace all spatial data previously sent through RPC. If an empty array is sent, the existing spatial data will be cleared</p>","parent_name":"SDLSendHapticData"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(im)initWithType:":{"name":"-initWithType:","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(im)initWithType:seekTime:":{"name":"-initWithType:seekTime:","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(cm)seekIndicatorWithSeekTime:":{"name":"+seekIndicatorWithSeekTime:","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(py)type":{"name":"type","abstract":"<p>The type of seek indicator to be displayed on the module UI</p>","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeekStreamingIndicator.html#/c:objc(cs)SDLSeekStreamingIndicator(py)seekTime":{"name":"seekTime","abstract":"<p>If the type is TIME, this number of seconds may be present alongside the skip indicator. It will indicate the number of seconds that the currently playing media will skip forward or backward.","parent_name":"SDLSeekStreamingIndicator"},"Classes/SDLSeatStatus.html#/c:objc(cs)SDLSeatStatus(im)initWithSeatLocation:conditionActive:":{"name":"-initWithSeatLocation:conditionActive:","parent_name":"SDLSeatStatus"},"Classes/SDLSeatStatus.html#/c:objc(cs)SDLSeatStatus(py)seatLocation":{"name":"seatLocation","abstract":"<p>The location of the seat on the vehicle grid</p>","parent_name":"SDLSeatStatus"},"Classes/SDLSeatStatus.html#/c:objc(cs)SDLSeatStatus(py)conditionActive":{"name":"conditionActive","abstract":"<p>If the seat condition is active (see the containing object parameter, such as &lsquo;seatsOccupied&rsquo;)</p>","parent_name":"SDLSeatStatus"},"Classes/SDLSeatOccupancy.html#/c:objc(cs)SDLSeatOccupancy(im)initWithSeatsOccupied:seatsBelted:":{"name":"-initWithSeatsOccupied:seatsBelted:","parent_name":"SDLSeatOccupancy"},"Classes/SDLSeatOccupancy.html#/c:objc(cs)SDLSeatOccupancy(py)seatsOccupied":{"name":"seatsOccupied","abstract":"<p>Seat status array containing location and whether the seats are occupied.","parent_name":"SDLSeatOccupancy"},"Classes/SDLSeatOccupancy.html#/c:objc(cs)SDLSeatOccupancy(py)seatsBelted":{"name":"seatsBelted","abstract":"<p>Seat status array containing location and whether the seats are belted.","parent_name":"SDLSeatOccupancy"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:action:":{"name":"-initWithId:action:","abstract":"<p>@abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:label:action:":{"name":"-initWithId:label:action:","abstract":"<p>@abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)id":{"name":"id","abstract":"<p>@abstract id of the action to be performed.</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)label":{"name":"label","abstract":"<p>@abstract label of the action to be performed.</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)action":{"name":"action","abstract":"<p>@abstract type of action to be performed</p>","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(im)initWithSeats:cols:rows:levels:":{"name":"-initWithSeats:cols:rows:levels:","abstract":"<p>Constructs a newly allocated SDLSeatLocationCapability object with all parameters</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)cols":{"name":"cols","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)rows":{"name":"rows","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)levels":{"name":"levels","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocationCapability.html#/c:objc(cs)SDLSeatLocationCapability(py)seats":{"name":"seats","abstract":"<p>Contains a list of SeatLocation in the vehicle, the first element is the driver&rsquo;s seat","parent_name":"SDLSeatLocationCapability"},"Classes/SDLSeatLocation.html#/c:objc(cs)SDLSeatLocation(py)grid":{"name":"grid","abstract":"<p>Optional</p>","parent_name":"SDLSeatLocation"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithHeatingEnabled:coolingEnabled:heatingLevel:coolingLevel:horizontalPosition:verticalPosition:frontVerticalPosition:backVerticalPosition:backTiltAngle:headSupportHorizontalPosition:headSupportVerticalPosition:massageEnabled:massageMode:massageCushionFirmness:memory:":{"name":"-initWithHeatingEnabled:coolingEnabled:heatingLevel:coolingLevel:horizontalPosition:verticalPosition:frontVerticalPosition:backVerticalPosition:backTiltAngle:headSupportHorizontalPosition:headSupportVerticalPosition:massageEnabled:massageMode:massageCushionFirmness:memory:","abstract":"<p>Convenience init for setting all possible seat control data</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Constructs a newly allocated SDLSeatControlData object with cushion and firmness</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:":{"name":"-initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:","abstract":"<p>Constructs a newly allocated SDLSeatControlData object with cushion and firmness</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)id":{"name":"id","abstract":"<p>@abstract id of seat that is a remote controllable seat.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingEnabled":{"name":"heatingEnabled","abstract":"<p>@abstract Whether or not heating is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingEnabled":{"name":"coolingEnabled","abstract":"<p>@abstract Whether or not cooling is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingLevel":{"name":"heatingLevel","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingLevel":{"name":"coolingLevel","abstract":"<p>@abstract cooling level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)horizontalPosition":{"name":"horizontalPosition","abstract":"<p>@abstract horizontal Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)verticalPosition":{"name":"verticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)frontVerticalPosition":{"name":"frontVerticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backVerticalPosition":{"name":"backVerticalPosition","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backTiltAngle":{"name":"backTiltAngle","abstract":"<p>@abstract heating level in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportHorizontalPosition":{"name":"headSupportHorizontalPosition","abstract":"<p>@abstract head Support Horizontal Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportVerticalPosition":{"name":"headSupportVerticalPosition","abstract":"<p>@abstract head Support Vertical Position in integer</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageEnabled":{"name":"massageEnabled","abstract":"<p>@abstract Whether or not massage is enabled.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageMode":{"name":"massageMode","abstract":"<p>@abstract Array of massage mode data.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageCushionFirmness":{"name":"massageCushionFirmness","abstract":"<p>@abstract Array of firmness of a cushion.</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)memory":{"name":"memory","abstract":"<p>@abstract type of action to be performed</p>","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:moduleInfo:":{"name":"-initWithName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with moduleName and moduleInfo</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:moduleInfo:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:":{"name":"-initWithName:moduleInfo:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:","abstract":"<p>Constructs a newly allocated SDLSeatControlCapabilities object with all parameters</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the seat control module.","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingEnabledAvailable":{"name":"heatingEnabledAvailable","abstract":"<p>@abstract Whether or not heating is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingEnabledAvailable":{"name":"coolingEnabledAvailable","abstract":"<p>@abstract Whether or not cooling is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingLevelAvailable":{"name":"heatingLevelAvailable","abstract":"<p>@abstract Whether or not heating level is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingLevelAvailable":{"name":"coolingLevelAvailable","abstract":"<p>@abstract Whether or not cooling level is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)horizontalPositionAvailable":{"name":"horizontalPositionAvailable","abstract":"<p>@abstract Whether or not horizontal Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)verticalPositionAvailable":{"name":"verticalPositionAvailable","abstract":"<p>@abstract Whether or not vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)frontVerticalPositionAvailable":{"name":"frontVerticalPositionAvailable","abstract":"<p>@abstract Whether or not front Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backVerticalPositionAvailable":{"name":"backVerticalPositionAvailable","abstract":"<p>@abstract Whether or not back Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backTiltAngleAvailable":{"name":"backTiltAngleAvailable","abstract":"<p>@abstract Whether or not backTilt Angle Available is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportHorizontalPositionAvailable":{"name":"headSupportHorizontalPositionAvailable","abstract":"<p>@abstract Whether or not head Supports for Horizontal Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportVerticalPositionAvailable":{"name":"headSupportVerticalPositionAvailable","abstract":"<p>@abstract Whether or not head Supports for Vertical Position is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageEnabledAvailable":{"name":"massageEnabledAvailable","abstract":"<p>@abstract Whether or not massage Enabled is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageModeAvailable":{"name":"massageModeAvailable","abstract":"<p>@abstract Whether or not massage Mode is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageCushionFirmnessAvailable":{"name":"massageCushionFirmnessAvailable","abstract":"<p>@abstract Whether or not massage Cushion Firmness is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)memoryAvailable":{"name":"memoryAvailable","abstract":"<p>@abstract Whether or not memory is Available.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>@abstract Information about a RC module, including its id.</p>","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:":{"name":"-initWithMessage:","abstract":"<p>Convenience init for creating a scrolling message with text.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:timeout:softButtons:cancelID:":{"name":"-initWithMessage:timeout:softButtons:cancelID:","abstract":"<p>Convenience init for creating a scrolling message with text and buttons.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)scrollableMessageBody":{"name":"scrollableMessageBody","abstract":"<p>Body of text that can include newlines and tabs.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)timeout":{"name":"timeout","abstract":"<p>App defined timeout. Indicates how long of a timeout from the last action (i.e. scrolling message resets timeout). If not set, a default value of 30 seconds is used by Core.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)softButtons":{"name":"softButtons","abstract":"<p>Buttons for the displayed scrollable message. If omitted on supported displays, only the system defined &ldquo;Close&rdquo; SoftButton will be displayed.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific scrollable message to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLScrollableMessage"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)resolution":{"name":"resolution","abstract":"<p>The resolution of the prescribed screen area</p>","parent_name":"SDLScreenParams"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)touchEventAvailable":{"name":"touchEventAvailable","abstract":"<p>Types of screen touch events available in screen area</p>","parent_name":"SDLScreenParams"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1":{"name":"textField1","abstract":"<p>The top text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2":{"name":"textField2","abstract":"<p>The second text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3":{"name":"textField3","abstract":"<p>The third text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4":{"name":"textField4","abstract":"<p>The fourth text field within a template layout. Pass an empty string <code>\\@&quot;&quot;</code> to clear the text field.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)mediaTrackTextField":{"name":"mediaTrackTextField","abstract":"<p>The media text field available within the media layout. Often less emphasized than textField(1-4)</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)primaryGraphic":{"name":"primaryGraphic","abstract":"<p>The primary graphic within a template layout</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"<p>A secondary graphic used in some template layouts</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textAlignment":{"name":"textAlignment","abstract":"<p>What alignment textField(1-4) should use</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1Type":{"name":"textField1Type","abstract":"<p>The type of data textField1 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2Type":{"name":"textField2Type","abstract":"<p>The type of data textField2 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3Type":{"name":"textField3Type","abstract":"<p>The type of data textField3 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4Type":{"name":"textField4Type","abstract":"<p>The type of data textField4 describes</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)title":{"name":"title","abstract":"<p>The title of the current template layout.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)softButtonObjects":{"name":"softButtonObjects","abstract":"<p>The current list of soft buttons within a template layout. Set this array to change the displayed soft buttons.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)menuConfiguration":{"name":"menuConfiguration","abstract":"<p>Configures the layout of the menu and sub-menus. If set after a menu already exists, the existing main menu layout will be updated.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)menu":{"name":"menu","abstract":"<p>The current list of menu cells displayed in the app&rsquo;s menu.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)dynamicMenuUpdatesMode":{"name":"dynamicMenuUpdatesMode","abstract":"<p>Change the mode of the dynamic menu updater to be enabled, disabled, or enabled on known compatible head units.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The current list of voice commands available for the user to speak and be recognized by the IVI&rsquo;s voice recognition engine.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)keyboardConfiguration":{"name":"keyboardConfiguration","abstract":"<p>The default keyboard configuration, this can be additionally customized by each SDLKeyboardDelegate.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)preloadedChoices":{"name":"preloadedChoices","abstract":"<p>Cells will be hashed by their text, image names, and VR command text. When assembling an SDLChoiceSet, you can pull objects from here, or recreate them. The preloaded versions will be used so long as their text, image names, and VR commands are the same.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)initWithConnectionManager:fileManager:systemCapabilityManager:":{"name":"-initWithConnectionManager:fileManager:systemCapabilityManager:","abstract":"<p>Initialize a screen manager</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager:":{"name":"-initWithConnectionManager:fileManager:systemCapabilityManager:permissionManager:","abstract":"<p>Initialize a screen manager</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>Starts the manager and all sub-managers</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)stop":{"name":"-stop","abstract":"<p>Stops the manager.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)beginUpdates":{"name":"-beginUpdates","abstract":"<p>Delays all screen updates until endUpdatesWithCompletionHandler: is called.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdates":{"name":"-endUpdates","abstract":"<p>Pairs with <code>beginUpdates:</code> to batch text, graphic, and layout changes into a single update with a callback when the update is complete.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdatesWithCompletionHandler:":{"name":"-endUpdatesWithCompletionHandler:","abstract":"<p>Pairs with <code>beginUpdates:</code> to batch text, graphic, and layout changes into a single update with a callback when the update is complete.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)changeLayout:withCompletionHandler:":{"name":"-changeLayout:withCompletionHandler:","abstract":"<p>Change the current layout to a new layout and optionally update the layout&rsquo;s night and day color schemes. The values set for the text, graphics, buttons and template title persist between layout changes. To update the text, graphics, buttons and template title at the same time as the template, batch all the updates between <code>beginUpdates</code> and <code>endUpdates</code>. If the layout update fails while batching, then the updated text, graphics, buttons or template title will also not be updated.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)softButtonObjectNamed:":{"name":"-softButtonObjectNamed:","abstract":"<p>Retrieve a SoftButtonObject based on its name.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)subscribeButton:withUpdateHandler:":{"name":"-subscribeButton:withUpdateHandler:","abstract":"<p>Subscribes to a subscribe button. The update handler will be called when the button has been selected. If there is an error subscribing to the subscribe button it will be returned in the <code>error</code> parameter of the updateHandler.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)subscribeButton:withObserver:selector:":{"name":"-subscribeButton:withObserver:selector:","abstract":"<p>Subscribes to a subscribe button. The selector will be called when the button has been selected. If there is an error subscribing to the subscribe button it will be returned in the <code>error</code> parameter of the selector.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)unsubscribeButton:withObserver:withCompletionHandler:":{"name":"-unsubscribeButton:withObserver:withCompletionHandler:","abstract":"<p>Unsubscribes to a subscribe button. Please note that if a subscribe button has multiple subscribers the observer will no longer get notifications, however, the app will still be subscribed to the hard button until the last subscriber is removed.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)preloadChoices:withCompletionHandler:":{"name":"-preloadChoices:withCompletionHandler:","abstract":"<p>Preload cells to the head unit. This will <em>greatly</em> reduce the time taken to present a choice set. Any already matching a choice already on the head unit will be ignored. You <em>do not</em> need to wait until the completion handler is called to present a choice set containing choices being loaded. The choice set will wait until the preload completes and then immediately present.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)deleteChoices:":{"name":"-deleteChoices:","abstract":"<p>Delete loaded cells from the head unit. If the cells don&rsquo;t exist on the head unit they will be ignored.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentChoiceSet:mode:":{"name":"-presentChoiceSet:mode:","abstract":"<p>Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you&rsquo;re lazy&hellip;for real though, it&rsquo;s kind of confusing to the user and isn&rsquo;t recommended.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentSearchableChoiceSet:mode:withKeyboardDelegate:":{"name":"-presentSearchableChoiceSet:mode:withKeyboardDelegate:","abstract":"<p>Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you&rsquo;re lazy&hellip;for real though, it&rsquo;s kind of confusing to the user and isn&rsquo;t recommended.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentKeyboardWithInitialText:delegate:":{"name":"-presentKeyboardWithInitialText:delegate:","abstract":"<p>Present a keyboard-only interface to the user and receive input. The user will be able to input text in the keyboard when in a non-driver distraction situation.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)dismissKeyboardWithCancelID:":{"name":"-dismissKeyboardWithCancelID:","abstract":"<p>Cancels the keyboard-only interface if it is currently showing. If the keyboard has not yet been sent to Core, it will not be sent.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)openMenu":{"name":"-openMenu","abstract":"<p>Present the top-level of your application menu. This method should be called if the menu needs to be opened programmatically because the built in menu button is hidden.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)openSubmenu:":{"name":"-openSubmenu:","abstract":"<p>Present the application menu. This method should be called if the menu needs to be opened programmatically because the built in menu button is hidden. You must update the menu with the proper cells before calling this method. This RPC will fail if the cell does not contain a sub menu, or is not in the menu array.</p>","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentAlert:withCompletionHandler:":{"name":"-presentAlert:withCompletionHandler:","abstract":"<p>Present the alert on the screen. To replace a currently presenting alert with a new alert, you must first call <code>cancel</code> on the currently presenting alert before sending the new alert. Otherwise the newest alert will only be presented when the module dismisses the currently presented alert (either due to the timeout or the user selecting a button on the alert). Please note that cancelling a currently presented alert will only work on modules supporting RPC Spec v.5.0+.</p>","parent_name":"SDLScreenManager"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(im)initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:":{"name":"-initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:","abstract":"<p>Convenience init to SISData</p>","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationShortName":{"name":"stationShortName","abstract":"<p>@abstract Identifies the 4-alpha-character station call sign","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationIDNumber":{"name":"stationIDNumber","abstract":"<p>@abstract Used for network Application.","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLongName":{"name":"stationLongName","abstract":"<p>@abstract Identifies the station call sign or other identifying","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLocation":{"name":"stationLocation","abstract":"<p>@abstract Provides the 3-dimensional geographic station location</p>","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationMessage":{"name":"stationMessage","abstract":"<p>@abstract May be used to convey textual information of general interest","parent_name":"SDLSISData"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(im)initWithLocation:status:":{"name":"-initWithLocation:status:","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(im)initWithLocation:status:state:":{"name":"-initWithLocation:status:state:","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(py)location":{"name":"location","abstract":"<p>The location of the roof on the vehicle grid</p>","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(py)status":{"name":"status","abstract":"<p>The status of the roof (e.g. if it is detachable)</p>","parent_name":"SDLRoofStatus"},"Classes/SDLRoofStatus.html#/c:objc(cs)SDLRoofStatus(py)state":{"name":"state","abstract":"<p>The state of the roof if it has a window</p>","parent_name":"SDLRoofStatus"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init to reset global properties.</p>","parent_name":"SDLResetGlobalProperties"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(py)properties":{"name":"properties","abstract":"<p>An array of one or more GlobalProperty enumeration elements","parent_name":"SDLResetGlobalProperties"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(im)initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:":{"name":"-initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:","abstract":"<p>Constructs a newly allocated SDLRemoteControlCapabilities object with given parameters</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)climateControlCapabilities":{"name":"climateControlCapabilities","abstract":"<p>If included, the platform supports RC climate controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)radioControlCapabilities":{"name":"radioControlCapabilities","abstract":"<p>If included, the platform supports RC radio controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>If included, the platform supports RC button controls with the included button names.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)seatControlCapabilities":{"name":"seatControlCapabilities","abstract":"<p>If included, the platform supports seat controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)audioControlCapabilities":{"name":"audioControlCapabilities","abstract":"<p>If included, the platform supports audio controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)hmiSettingsControlCapabilities":{"name":"hmiSettingsControlCapabilities","abstract":"<p>If included, the platform supports hmi setting controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)lightControlCapabilities":{"name":"lightControlCapabilities","abstract":"<p>If included, the platform supports light controls.</p>","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(im)initWithModuleType:moduleId:":{"name":"-initWithModuleType:moduleId:","abstract":"<p>Convenience init to release a controlled module</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(py)moduleType":{"name":"moduleType","abstract":"<p>The module type that the app requests to control.</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLReleaseInteriorVehicleDataModule.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModule(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLReleaseInteriorVehicleDataModule"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)sdlMsgVersion":{"name":"sdlMsgVersion","abstract":"<p>Specifies the negotiated version number of the SmartDeviceLink protocol that is to be supported by the mobile application.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)language":{"name":"language","abstract":"<p>The currently active VR+TTS language on the module. See &ldquo;Language&rdquo; for options.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>The currently active display language on the module. See &ldquo;Language&rdquo; for options.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"<p>Contains information about the display&rsquo;s capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"<p>Contains information about the head unit button capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"<p>Contains information about the head unit soft button capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"<p>If returned, the platform supports custom on-screen Presets</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"<p>Contains information about the HMI zone capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)speechCapabilities":{"name":"speechCapabilities","abstract":"<p>Contains information about the text-to-speech capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)prerecordedSpeech":{"name":"prerecordedSpeech","abstract":"<p>Contains a list of prerecorded speech items present on the platform.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vrCapabilities":{"name":"vrCapabilities","abstract":"<p>Contains information about the VR capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"<p>Describes different audio type configurations for PerformAudioPassThru, e.g. {8kHz,8-bit,PCM}. The audio is recorded in monaural.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)pcmStreamCapabilities":{"name":"pcmStreamCapabilities","abstract":"<p>Describes different audio type configurations for the audio PCM stream service, e.g. {8kHz,8-bit,PCM}</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vehicleType":{"name":"vehicleType","abstract":"<p>Specifies the vehicle&rsquo;s type. See VehicleType.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)supportedDiagModes":{"name":"supportedDiagModes","abstract":"<p>Specifies the white-list of supported diagnostic modes (0x00-0xFF) capable for DiagnosticMessage requests. If a mode outside this list is requested, it will be rejected.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"<p>Specifies the HMI capabilities.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)sdlVersion":{"name":"sdlVersion","abstract":"<p>The version of SDL Core running on the connected head unit</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)systemSoftwareVersion":{"name":"systemSoftwareVersion","abstract":"<p>The software version of the system that implements the SmartDeviceLink core.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)iconResumed":{"name":"iconResumed","abstract":"<p>Existence of apps icon at system. If true, apps icon was resumed at system. If false, apps icon is not resumed at system.</p>","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithLifecycleConfiguration:":{"name":"-initWithLifecycleConfiguration:","abstract":"<p>Convenience init for registering the application with a lifecycle configuration.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:":{"name":"-initWithAppName:appId:languageDesired:","abstract":"<p>Convenience init for registering the application with an app name, app id, and desired language.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:":{"name":"-initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:","abstract":"<p>Convenience init for registering the application with all possible options.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)sdlMsgVersion":{"name":"sdlMsgVersion","abstract":"<p>Specifies the version number of the SmartDeviceLink protocol that is supported by the mobile application.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appName":{"name":"appName","abstract":"<p>The mobile application&rsquo;s name. This name is displayed in the SDL Mobile Applications menu. It also serves as the unique identifier of the application for SmartDeviceLink. Applications with the same name will be rejected.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ttsName":{"name":"ttsName","abstract":"<p>Text-to-speech string for voice recognition of the mobile application name. Meant to overcome any failing on speech engine in properly pronouncing / understanding app name.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"<p>Provides an abbreviated version of the app name (if needed), that will be displayed on head units that support very few characters. If not provided, the appName is used instead (and will be truncated if too long). It&rsquo;s recommended that this string be no longer than 5 characters.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)vrSynonyms":{"name":"vrSynonyms","abstract":"<p>Defines additional voice recognition commands</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)isMediaApplication":{"name":"isMediaApplication","abstract":"<p>Indicates if the application is a media or a non-media application. Media applications will appear in the head unit&rsquo;s media source list and can use the <code>MEDIA</code> template.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)languageDesired":{"name":"languageDesired","abstract":"<p>App&rsquo;s starting VR+TTS language. If there is a mismatch with the head unit, the app will be able to change its language with ChangeRegistration prior to app being brought into focus.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hmiDisplayLanguageDesired":{"name":"hmiDisplayLanguageDesired","abstract":"<p>Current app&rsquo;s expected display language. If there is a mismatch with the head unit, the app will be able to change its language with ChangeRegistration prior to app being brought into focus.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appHMIType":{"name":"appHMIType","abstract":"<p>List of all applicable app HMI types stating which HMI classifications to be given to the app.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hashID":{"name":"hashID","abstract":"<p>ID used to uniquely identify a previous state of all app data that can persist through connection cycles (e.g. ignition cycles). This registered data (commands, submenus, choice sets, etc.) can be reestablished without needing to explicitly re-send each piece. If omitted, then the previous state of an app&rsquo;s commands, etc. will not be restored.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)deviceInfo":{"name":"deviceInfo","abstract":"<p>Information about the connecting device.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appID":{"name":"appID","abstract":"<p>ID used to validate app with policy table entries.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)fullAppID":{"name":"fullAppID","abstract":"<p>A full UUID appID used to validate app with policy table entries.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appInfo":{"name":"appInfo","abstract":"<p>Contains detailed information about the registered application.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;light&rdquo; or &ldquo;day&rdquo; color scheme. The OEM may only support this theme if their head unit only has a light color scheme.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to be used on a head unit using a &ldquo;dark&rdquo; or &ldquo;night&rdquo; color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.</p>","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithX:y:width:height:":{"name":"-initWithX:y:width:height:","abstract":"<p>Create a Rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithCGRect:":{"name":"-initWithCGRect:","abstract":"<p>Create a Rectangle from a CGRect</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)x":{"name":"x","abstract":"<p>The X-coordinate of the user control</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)y":{"name":"y","abstract":"<p>The Y-coordinate of the user control</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)width":{"name":"width","abstract":"<p>The width of the user control&rsquo;s bounding rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)height":{"name":"height","abstract":"<p>The height of the user control&rsquo;s bounding rectangle</p>","parent_name":"SDLRectangle"},"Classes/SDLReadDIDResponse.html#/c:objc(cs)SDLReadDIDResponse(py)didResult":{"name":"didResult","abstract":"<p>Array of requested DID results (with data if available).</p>","parent_name":"SDLReadDIDResponse"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(im)initWithECUName:didLocation:":{"name":"-initWithECUName:didLocation:","abstract":"<p>Convenience init</p>","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)ecuName":{"name":"ecuName","abstract":"<p>An ID of the vehicle module","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)didLocation":{"name":"didLocation","abstract":"<p>Raw data from vehicle data DID location(s)","parent_name":"SDLReadDID"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:":{"name":"-initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initFMWithFrequencyInteger:frequencyFraction:hdChannel:":{"name":"-initFMWithFrequencyInteger:frequencyFraction:hdChannel:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initAMWithFrequencyInteger:hdChannel:":{"name":"-initAMWithFrequencyInteger:hdChannel:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initXMWithFrequencyInteger:":{"name":"-initXMWithFrequencyInteger:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyInteger":{"name":"frequencyInteger","abstract":"<p>The integer part of the frequency ie for 101.7 this value should be 101</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyFraction":{"name":"frequencyFraction","abstract":"<p>The fractional part of the frequency for 101.7 is 7</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)band":{"name":"band","abstract":"<p>Radio band value</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)rdsData":{"name":"rdsData","abstract":"<p>Read only parameter. See RDSData data type for details.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)availableHDs":{"name":"availableHDs","abstract":"<p>number of HD sub-channels if available</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)availableHDChannels":{"name":"availableHDChannels","abstract":"<p>the list of available hd sub-channel indexes, empty list means no Hd channel is available, read-only</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdChannel":{"name":"hdChannel","abstract":"<p>Current HD sub-channel if available</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalStrength":{"name":"signalStrength","abstract":"<p>Signal Strength Value</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalChangeThreshold":{"name":"signalChangeThreshold","abstract":"<p>If the signal strength falls below the set value for this parameter, the radio will tune to an alternative frequency</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)radioEnable":{"name":"radioEnable","abstract":"<p>True if the radio is on, false is the radio is off. When the radio is disabled, no data other than radioEnable is included in a GetInteriorVehicleData response</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)state":{"name":"state","abstract":"<p>Read only parameter. See RadioState data type for details.</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdRadioEnable":{"name":"hdRadioEnable","abstract":"<p>True if the hd radio is on, false is the radio is off</p>","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)sisData":{"name":"sisData","abstract":"<p>Read Read-only Station Information Service (SIS) data provides basic information","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(im)initWithModuleName:moduleInfo:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDChannelsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:":{"name":"-initWithModuleName:moduleInfo:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDChannelsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:","abstract":"<p>Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>The short friendly name of the radio control module.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioEnableAvailable":{"name":"radioEnableAvailable","abstract":"<p>Availability of the control of enable/disable radio.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioBandAvailable":{"name":"radioBandAvailable","abstract":"<p>Availability of the control of radio band.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioFrequencyAvailable":{"name":"radioFrequencyAvailable","abstract":"<p>Availability of the control of radio frequency.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdChannelAvailable":{"name":"hdChannelAvailable","abstract":"<p>Availability of the control of HD radio channel.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)rdsDataAvailable":{"name":"rdsDataAvailable","abstract":"<p>Availability of the getting Radio Data System (RDS) data.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)availableHDsAvailable":{"name":"availableHDsAvailable","abstract":"<p>Availability of the getting the number of available HD channels.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)availableHDChannelsAvailable":{"name":"availableHDChannelsAvailable","abstract":"<p>Availability of the list of available HD sub-channel indexes.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)stateAvailable":{"name":"stateAvailable","abstract":"<p>Availability of the getting the Radio state.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalStrengthAvailable":{"name":"signalStrengthAvailable","abstract":"<p>Availability of the getting the signal strength.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalChangeThresholdAvailable":{"name":"signalChangeThresholdAvailable","abstract":"<p>Availability of the getting the signal Change Threshold</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdRadioEnableAvailable":{"name":"hdRadioEnableAvailable","abstract":"<p>Availability of the control of enable/disable HD radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)siriusXMRadioAvailable":{"name":"siriusXMRadioAvailable","abstract":"<p>Availability of sirius XM radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)sisDataAvailable":{"name":"sisDataAvailable","abstract":"<p>Availability of the getting HD radio Station Information Service (SIS) data.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(py)store":{"name":"store","abstract":"<p>The store that contains RPC data</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(py)payloadProtected":{"name":"payloadProtected","abstract":"<p>Declares if the RPC payload ought to be protected</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)initWithDictionary:":{"name":"-initWithDictionary:","abstract":"<p>Convenience init</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)serializeAsDictionary:":{"name":"-serializeAsDictionary:","abstract":"<p>Converts struct to JSON formatted data</p>","parent_name":"SDLRPCStruct"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(py)response":{"name":"response","abstract":"<p>The response to be included within the userinfo dictionary</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)initWithName:object:rpcResponse:":{"name":"-initWithName:object:rpcResponse:","abstract":"<p>Create an NSNotification object containing an SDLRPCResponse</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseMemberOfClass:":{"name":"-isResponseMemberOfClass:","abstract":"<p>Returns whether or not the containing response is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseKindOfClass:":{"name":"-isResponseKindOfClass:","abstract":"<p>Returns whether or not the containing response is a kind of class, including subclasses.</p>","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)correlationID":{"name":"correlationID","abstract":"<p>The correlation id of the corresponding SDLRPCRequest.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)success":{"name":"success","abstract":"<p>Whether or not the SDLRPCRequest was successful.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)resultCode":{"name":"resultCode","abstract":"<p>The result of the SDLRPCRequest. If the request failed, the result code contains the failure reason.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)info":{"name":"info","abstract":"<p>More detailed success or error message.</p>","parent_name":"SDLRPCResponse"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(py)request":{"name":"request","abstract":"<p>The request to be included in the userinfo dictionary</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)initWithName:object:rpcRequest:":{"name":"-initWithName:object:rpcRequest:","abstract":"<p>Create an NSNotification object containing an SDLRPCRequest</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestMemberOfClass:":{"name":"-isRequestMemberOfClass:","abstract":"<p>Returns whether or not the containing request is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestKindOfClass:":{"name":"-isRequestKindOfClass:","abstract":"<p>Returns whether or not the containing request is a kind of class, including subclasses.</p>","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequest.html#/c:objc(cs)SDLRPCRequest(py)correlationID":{"name":"correlationID","abstract":"<p>A unique id assigned to message sent to Core. The Correlation ID is used to map a request to its response.</p>","parent_name":"SDLRPCRequest"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcAllowed":{"name":"rpcAllowed","abstract":"<p>Whether or not the RPC is allowed.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(py)rpcParameters":{"name":"rpcParameters","abstract":"<p>Holds a dictionary of RPC parameters and objects of an NSNumber<BOOL> specifying if that RPC parameter is currently allowed</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCPermissionStatus.html#/c:objc(cs)SDLRPCPermissionStatus(im)initWithRPCName:isRPCAllowed:rpcParameters:":{"name":"-initWithRPCName:isRPCAllowed:rpcParameters:","abstract":"<p>Initializes a SDLRPCPermissionStatus object.</p>","parent_name":"SDLRPCPermissionStatus"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(py)notification":{"name":"notification","abstract":"<p>The notification within the userinfo dictionary</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)initWithName:object:rpcNotification:":{"name":"-initWithName:object:rpcNotification:","abstract":"<p>Create an NSNotification object caontaining an SDLRPCNotification</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationMemberOfClass:":{"name":"-isNotificationMemberOfClass:","abstract":"<p>Returns whether or not the containing notification is equal to a class, not including subclasses.</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationKindOfClass:":{"name":"-isNotificationKindOfClass:","abstract":"<p>Returns whether or not the containing notification is a kind of class, including subclasses.</p>","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)initWithName:":{"name":"-initWithName:","abstract":"<p>Convenience init</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setFunctionName:":{"name":"-setFunctionName:","abstract":"<p>Sets the function name.</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setParameters:value:":{"name":"-setParameters:value:","abstract":"<p>Sets a key-value pair using the function name as the key.</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)bulkData":{"name":"bulkData","abstract":"<p>The data in the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)name":{"name":"name","abstract":"<p>The name of the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)parameters":{"name":"parameters","abstract":"<p>The JSON-RPC parameters</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)messageType":{"name":"messageType","abstract":"<p>The type of data in the message</p>","parent_name":"SDLRPCMessage"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithRed:green:blue:":{"name":"-initWithRed:green:blue:","abstract":"<p>Create an SDL color object with red / green / blue values between 0-255</p>","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithColor:":{"name":"-initWithColor:","abstract":"<p>Create an SDL color object with a UIColor object.</p>","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)red":{"name":"red","abstract":"<p>The red value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)green":{"name":"green","abstract":"<p>The green value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)blue":{"name":"blue","abstract":"<p>The blue value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(im)initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:":{"name":"-initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:","abstract":"<p>Convenience init</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programService":{"name":"programService","abstract":"<p>Program Service Name</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)radioText":{"name":"radioText","abstract":"<p>Radio Text</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)clockText":{"name":"clockText","abstract":"<p>The clock text in UTC format as YYYY-MM-DDThh:mm:ss.sTZD</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programIdentification":{"name":"programIdentification","abstract":"<p>Program Identification - the call sign for the radio station</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programType":{"name":"programType","abstract":"<p>The program type - The region should be used to differentiate between EU","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficProgramIdentification":{"name":"trafficProgramIdentification","abstract":"<p>Traffic Program Identification - Identifies a station that offers traffic</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficAnnouncementIdentification":{"name":"trafficAnnouncementIdentification","abstract":"<p>Traffic Announcement Identification - Indicates an ongoing traffic announcement</p>","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)region":{"name":"region","abstract":"<p>Region</p>","parent_name":"SDLRDSData"},"Classes/SDLPutFileResponse.html#/c:objc(cs)SDLPutFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>Provides the total local space available in SDL Core for the registered app. If the transfer has systemFile enabled, then the value will be set to 0 automatically.</p>","parent_name":"SDLPutFileResponse"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)init":{"name":"-init","abstract":"<p>Init</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:":{"name":"-initWithFileName:fileType:","abstract":"<p>Convenience init for creating a putfile with a name and file format.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:":{"name":"-initWithFileName:fileType:persistentFile:","abstract":"<p>Convenience init for creating a putfile with a name, file format, and persistence.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:","abstract":"<p>Convenience init for creating a putfile that is part of a multiple frame payload.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:","abstract":"<p>Convenience init for creating a putfile that is part of a multiple frame payload. A CRC checksum is calculated for the bulk data.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)sdlFileName":{"name":"sdlFileName","abstract":"<p>File reference name</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)fileType":{"name":"fileType","abstract":"<p>A FileType value representing a selected file type</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)persistentFile":{"name":"persistentFile","abstract":"<p>A value to indicates if the file is meant to persist between sessions / ignition cycles. If set to TRUE, then the system will aim to persist this file through session / cycles. While files with this designation will have priority over others, they are subject to deletion by the system at any time. In the event of automatic deletion by the system, the app will receive a rejection and have to resend the file. If omitted, the value will be set to false.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)systemFile":{"name":"systemFile","abstract":"<p>Indicates if the file is meant to be passed through core to elsewhere on the system. If set to TRUE, then the system will instead pass the data thru as it arrives to a predetermined area outside of core.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)offset":{"name":"offset","abstract":"<p>Offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)length":{"name":"length","abstract":"<p>Length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded</p>","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)crc":{"name":"crc","abstract":"<p>Additional CRC32 checksum to protect data integrity up to 512 Mbits.</p>","parent_name":"SDLPutFile"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(im)initWithAppServiceRecord:":{"name":"-initWithAppServiceRecord:","abstract":"<p>Convenience init.</p>","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(py)appServiceRecord":{"name":"appServiceRecord","abstract":"<p>If the request was successful, this object will be the current status of the service record for the published service. This will include the Core supplied service ID.</p>","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(im)initWithAppServiceManifest:":{"name":"-initWithAppServiceManifest:","abstract":"<p>Convenience init.</p>","parent_name":"SDLPublishAppService"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(py)appServiceManifest":{"name":"appServiceManifest","abstract":"<p>The manifest of the service that wishes to be published.","parent_name":"SDLPublishAppService"},"Classes/SDLPresetBankCapabilities.html#/c:objc(cs)SDLPresetBankCapabilities(py)onScreenPresetsAvailable":{"name":"onScreenPresetsAvailable","abstract":"<p>If Onscreen custom presets are available.</p>","parent_name":"SDLPresetBankCapabilities"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(im)initWithFirstTouch:secondTouch:":{"name":"-initWithFirstTouch:secondTouch:","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)firstTouch":{"name":"firstTouch","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)secondTouch":{"name":"secondTouch","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)distance":{"name":"distance","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)center":{"name":"center","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)isValid":{"name":"isValid","abstract":"<p>@abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(im)initWithDialNumber:":{"name":"-initWithDialNumber:","abstract":"<p>Convenience init for defining the phone capability</p>","parent_name":"SDLPhoneCapability"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(py)dialNumberEnabled":{"name":"dialNumberEnabled","abstract":"<p>Whether or not the DialNumber RPC is enabled.</p>","parent_name":"SDLPhoneCapability"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(py)requiresEncryption":{"name":"requiresEncryption","abstract":"<p>Flag indicating if the app requires an encryption service to be active.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>Start the manager with a completion block that will be called when startup completes. This is used internally. To use an SDLPermissionManager, you should use the manager found on <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLManager.html\">SDLManager</a></code>.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager. This method is used internally.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)isRPCNameAllowed:":{"name":"-isRPCNameAllowed:","abstract":"<p>Determine if an individual RPC is allowed for the current HMI level</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)groupStatusOfRPCPermissions:":{"name":"-groupStatusOfRPCPermissions:","abstract":"<p>Determine if all RPCs are allowed for the current HMI level</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)statusesOfRPCPermissions:":{"name":"-statusesOfRPCPermissions:","abstract":"<p>Retrieve a dictionary with keys that are the passed in RPC names, and objects of an NSNumber<BOOL> specifying if that RPC is currently allowed</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)subscribeToRPCPermissions:groupType:withHandler:":{"name":"-subscribeToRPCPermissions:groupType:withHandler:","abstract":"<p>Subscribe to specified RPC names, with a callback that will be called whenever the value changes. The callback will only return immediately if the groupType is set to SDLPermissionGroupTypeAny or if the groupType is set to SDLPermissionGroupTypeAllAllowed and all RPCs in the rpcNames parameter are allowed.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeAllObservers":{"name":"-removeAllObservers","abstract":"<p>Remove every current observer</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeObserverForIdentifier:":{"name":"-removeObserverForIdentifier:","abstract":"<p>Remove block observers for the specified RPC</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)rpcNameRequiresEncryption:":{"name":"-rpcNameRequiresEncryption:","abstract":"<p>Check whether or not an RPC needs encryption.</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)isPermissionParameterAllowed:parameter:":{"name":"-isPermissionParameterAllowed:parameter:","abstract":"<p>Check whether a parameter of an RPC is allowed</p>","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC in the policy table.</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)hmiPermissions":{"name":"hmiPermissions","abstract":"<p>HMI Permissions for the individual RPC; i.e. which HMI levels may it be used in</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)parameterPermissions":{"name":"parameterPermissions","abstract":"<p>RPC parameters for the individual RPC</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)requireEncryption":{"name":"requireEncryption","abstract":"<p>Describes whether or not the RPC needs encryption</p>","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(py)rpcName":{"name":"rpcName","abstract":"<p>Name of the individual RPC.","parent_name":"SDLPermissionElement"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(py)parameterPermissions":{"name":"parameterPermissions","abstract":"<p>RPC parameters for the individual RPC</p>","parent_name":"SDLPermissionElement"},"Classes/SDLPermissionElement.html#/c:objc(cs)SDLPermissionElement(im)initWithRPCName:parameterPermissions:":{"name":"-initWithRPCName:parameterPermissions:","abstract":"<p>Creates a new permission element.</p>","parent_name":"SDLPermissionElement"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)choiceID":{"name":"choiceID","abstract":"<p>ID of the choice that was selected in response to PerformInteraction. Only is valid if general result is &ldquo;success:true&rdquo;.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)manualTextEntry":{"name":"manualTextEntry","abstract":"<p>Manually entered text selection, e.g. through keyboard. Can be returned in lieu of choiceID, depending on the trigger source.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)triggerSource":{"name":"triggerSource","abstract":"<p>A <em>SDLTriggerSource</em> object which will be shown in the HMI. Only is valid if resultCode is SUCCESS.</p>","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialText:interactionMode:interactionChoiceSetIDList:cancelID:":{"name":"-initWithInitialText:interactionMode:interactionChoiceSetIDList:cancelID:","abstract":"<p>Convenience init for creating a basic display or voice-recognition menu.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialText:initialPrompt:interactionMode:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:timeout:vrHelp:interactionLayout:cancelID:":{"name":"-initWithInitialText:initialPrompt:interactionMode:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:timeout:vrHelp:interactionLayout:cancelID:","abstract":"<p>Convenience init for setting all parameters of a display or voice-recognition menu.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialText":{"name":"initialText","abstract":"<p>Text to be displayed first.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>This is the TTS prompt spoken to the user at the start of an interaction.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionMode":{"name":"interactionMode","abstract":"<p>For application-requested interactions, this mode indicates the method in which the user is notified and uses the interaction. Users can choose either only by voice (VR_ONLY), by tactile selection from the menu (MANUAL_ONLY), or by either mode (BOTH).</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionChoiceSetIDList":{"name":"interactionChoiceSetIDList","abstract":"<p>List of interaction choice set IDs to use with an interaction.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Help text. This is the spoken text when a user speaks &ldquo;help&rdquo; while the interaction is occurring.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Timeout text. This text is spoken when a VR interaction times out.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeout":{"name":"timeout","abstract":"<p>Timeout in milliseconds. Applies only to the menu portion of the interaction. The VR timeout will be handled by the platform. If omitted a standard value of 10 seconds is used.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)vrHelp":{"name":"vrHelp","abstract":"<p>Suggested voice recognition help items to display on-screen during a perform interaction. If omitted on supported displays, the default generated list of suggested choices shall be displayed.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionLayout":{"name":"interactionLayout","abstract":"<p>For tactile interaction modes (MANUAL_ONLY, or BOTH), the layout mode of how the choices are presented.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific perform interaction to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:","abstract":"<p>Convenience init to perform an audio pass thru</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>initial prompt which will be spoken before opening the audio pass","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText1":{"name":"audioPassThruDisplayText1","abstract":"<p>a line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText2":{"name":"audioPassThruDisplayText2","abstract":"<p>A line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)samplingRate":{"name":"samplingRate","abstract":"<p>A samplingRate</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)maxDuration":{"name":"maxDuration","abstract":"<p>the maximum duration of audio recording in milliseconds</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)bitsPerSample":{"name":"bitsPerSample","abstract":"<p>the quality the audio is recorded - 8 bit or 16 bit</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioType":{"name":"audioType","abstract":"<p>an audioType</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)muteAudio":{"name":"muteAudio","abstract":"<p>a Boolean value representing if the current audio source should be","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioDataHandler":{"name":"audioDataHandler","abstract":"<p>A handler that will be called whenever an <code>onAudioPassThru</code> notification is received.</p>","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(im)initWithServiceSpecificResult:":{"name":"-initWithServiceSpecificResult:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(py)serviceSpecificResult":{"name":"serviceSpecificResult","abstract":"<p>The service can provide specific result strings to the consumer through this param.</p>","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:":{"name":"-initWithServiceUri:serviceID:originApp:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:requestServiceActive:":{"name":"-initWithServiceUri:serviceID:originApp:requestServiceActive:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceUri":{"name":"serviceUri","abstract":"<p>Fully qualified URI based on a predetermined scheme provided by the app service. SDL makes no guarantee that this URI is correct.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceID":{"name":"serviceID","abstract":"<p>The service ID that the app consumer wishes to send this URI.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)originApp":{"name":"originApp","abstract":"<p>This string is the appID of the app requesting the app service provider take the specific action.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)requestServiceActive":{"name":"requestServiceActive","abstract":"<p>This flag signals the requesting consumer would like this service to become the active primary service of the destination&rsquo;s type.</p>","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)allowed":{"name":"allowed","abstract":"<p>A set of all parameters that are permitted for this given RPC.</p>","parent_name":"SDLParameterPermissions"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"<p>A set of all parameters that are prohibited for this given RPC.</p>","parent_name":"SDLParameterPermissions"},"Classes/SDLOnWayPointChange.html#/c:objc(cs)SDLOnWayPointChange(py)waypoints":{"name":"waypoints","abstract":"<p>Location address for display purposes only</p>","parent_name":"SDLOnWayPointChange"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for setting all possible values on vehicle data items.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gps":{"name":"gps","abstract":"<p>The car current GPS coordinates</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)speed":{"name":"speed","abstract":"<p>The vehicle speed in kilometers per hour</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)rpm":{"name":"rpm","abstract":"<p>The number of revolutions per minute of the engine.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The fuel level in the tank (percentage)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The fuel level state</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The instantaneous fuel consumption in microlitres</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)vin":{"name":"vin","abstract":"<p>The Vehicle Identification Number</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>The current pressure warnings for the user&rsquo;s vehicle</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)odometer":{"name":"odometer","abstract":"<p>Odometer reading in km</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>The status of the seat belts</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The body information including power modes</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The IVI system status including signal and battery strength</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>The status of the brake pedal</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>Status of the head lamps</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The estimated percentage (0% - 100%) of remaining oil life of the engine</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>Torque value for engine (in Nm) on non-diesel variants</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>Accelerator pedal position (percentage depressed)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>Current angle of the steering wheel (in deg)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>Emergency Call notification and confirmation data</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The status of the air bags</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>Information related to an emergency event (and if it occurred)</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>The status modes of the cluster</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)myKey":{"name":"myKey","abstract":"<p>Information related to the MyKey feature</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The status of the electronic parking brake</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>See StabilityControlsStatus</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>The status of the turn signal</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The cloud app vehicle ID</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data item for any given OEM custom vehicle data name.</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLOnVehicleData"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(im)initWithMenuID:":{"name":"-initWithMenuID:","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(im)initWithMenuID:updateSubCells:":{"name":"-initWithMenuID:updateSubCells:","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(py)menuID":{"name":"menuID","abstract":"<p>This menuID must match a menuID in the current menu structure","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateSubMenu.html#/c:objc(cs)SDLOnUpdateSubMenu(py)updateSubCells":{"name":"updateSubCells","abstract":"<p>If not set, assume false. If true, the app should send AddCommands with parentIDs matching the menuID. These AddCommands will then be attached to the submenu and displayed if the submenu is selected.</p>","parent_name":"SDLOnUpdateSubMenu"},"Classes/SDLOnUpdateFile.html#/c:objc(cs)SDLOnUpdateFile(im)initWithFileName:":{"name":"-initWithFileName:","parent_name":"SDLOnUpdateFile"},"Classes/SDLOnUpdateFile.html#/c:objc(cs)SDLOnUpdateFile(py)fileName":{"name":"fileName","abstract":"<p>File reference name.","parent_name":"SDLOnUpdateFile"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)type":{"name":"type","abstract":"<p>The type of touch event.</p>","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)event":{"name":"event","abstract":"<p>List of all individual touches involved in this event.</p>","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTBTClientState.html#/c:objc(cs)SDLOnTBTClientState(py)state":{"name":"state","abstract":"<p>Current State of TBT client</p>","parent_name":"SDLOnTBTClientState"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestType":{"name":"requestType","abstract":"<p>The type of system request.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"<p>A request subType used when the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestType\">requestType</a></code> is <code>OEM_SPECIFIC</code>.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)url":{"name":"url","abstract":"<p>Optional URL for HTTP requests. If blank, the binary data shall be forwarded to the app. If not blank, the binary data shall be forwarded to the url with a provided timeout in seconds.</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)timeout":{"name":"timeout","abstract":"<p>Optional timeout for HTTP requests Required if a URL is provided</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)fileType":{"name":"fileType","abstract":"<p>Optional file type (meant for HTTP file requests).</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks</p>","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(im)initWithSystemCapability:":{"name":"-initWithSystemCapability:","abstract":"<p>Convenience init for required parameters</p>","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(py)systemCapability":{"name":"systemCapability","abstract":"<p>The system capability that has been updated.</p>","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)URL":{"name":"URL","abstract":"<p>The url</p>","parent_name":"SDLOnSyncPData"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)Timeout":{"name":"Timeout","abstract":"<p>How long until a timeout</p>","parent_name":"SDLOnSyncPData"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allocatedModules":{"name":"allocatedModules","abstract":"<p>@abstract Contains a list (zero or more) of module types that","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)freeModules":{"name":"freeModules","abstract":"<p>@abstract Contains a list (zero or more) of module types that are free to access for the application.</p>","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allowed":{"name":"allowed","abstract":"<p>Issued by SDL to notify the application about remote control status change on SDL","parent_name":"SDLOnRCStatus"},"Classes/SDLOnPermissionsChange.html#/c:objc(cs)SDLOnPermissionsChange(py)permissionItem":{"name":"permissionItem","abstract":"<p>Describes change in permissions for a given set of RPCs</p>","parent_name":"SDLOnPermissionsChange"},"Classes/SDLOnPermissionsChange.html#/c:objc(cs)SDLOnPermissionsChange(py)requireEncryption":{"name":"requireEncryption","abstract":"<p>Describes whether or not the app needs the encryption permission</p>","parent_name":"SDLOnPermissionsChange"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)language":{"name":"language","abstract":"<p>Current SDL voice engine (VR+TTS) language</p>","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>Current display language</p>","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)event":{"name":"event","abstract":"<p>The type of keyboard input</p>","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)data":{"name":"data","abstract":"<p>The current keyboard string input from the user</p>","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnInteriorVehicleData.html#/c:objc(cs)SDLOnInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"<p>The subscribed module data that changed</p>","parent_name":"SDLOnInteriorVehicleData"},"Classes/SDLOnHashChange.html#/c:objc(cs)SDLOnHashChange(py)hashID":{"name":"hashID","abstract":"<p>Calculated hash ID to be referenced during RegisterAppInterface request.</p>","parent_name":"SDLOnHashChange"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)hmiLevel":{"name":"hmiLevel","abstract":"<p>SDLHMILevel in effect for the application</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)audioStreamingState":{"name":"audioStreamingState","abstract":"<p>Current state of audio streaming for the application. When this parameter has a value of NOT_AUDIBLE, the application must stop streaming audio to SDL.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)videoStreamingState":{"name":"videoStreamingState","abstract":"<p>Current availability of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)systemContext":{"name":"systemContext","abstract":"<p>Whether a user-initiated interaction is in-progress (VRSESSION or MENU), or not (MAIN)</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)windowID":{"name":"windowID","abstract":"<p>This is the unique ID assigned to the window that this RPC is intended for. If this param is not included, it will be assumed that this request is specifically for the main window on the main display. - see: PredefinedWindows enum.</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(im)initWithHMILevel:systemContext:audioStreamingState:videoStreamingState:windowID:":{"name":"-initWithHMILevel:systemContext:audioStreamingState:videoStreamingState:windowID:","abstract":"<p>Initialize an SDLOnHMIStatus RPC with initial parameters</p>","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)data":{"name":"data","abstract":"<p>Contains base64 encoded string of SyncP packets.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)URL":{"name":"URL","abstract":"<p>If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded to the provided URL.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)Timeout":{"name":"Timeout","abstract":"<p>If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded with the provided timeout in seconds.</p>","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)state":{"name":"state","abstract":"<p>The driver distraction state (i.e. whether driver distraction rules are in effect, or not)</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)lockScreenDismissalEnabled":{"name":"lockScreenDismissalEnabled","abstract":"<p>If enabled, the lock screen will be able to be dismissed while connected to SDL, allowing users the ability to interact with the app.</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)lockScreenDismissalWarning":{"name":"lockScreenDismissalWarning","abstract":"<p>Warning message to be displayed on the lock screen when dismissal is enabled. This warning should be used to ensure that the user is not the driver of the vehicle, ex. <code>Swipe up to dismiss, acknowledging that you are not the driver.</code>. This parameter must be present if &ldquo;lockScreenDismissalEnabled&rdquo; is set to true.</p>","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)cmdID":{"name":"cmdID","abstract":"<p>The command ID of the command the user selected. This is the command ID value provided by the application in the SDLAddCommand operation that created the command.</p>","parent_name":"SDLOnCommand"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)triggerSource":{"name":"triggerSource","abstract":"<p>Indicates whether command was selected via voice or via a menu selection (using the OK button).</p>","parent_name":"SDLOnCommand"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonName":{"name":"buttonName","abstract":"<p>The button&rsquo;s name</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press event</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)customButtonID":{"name":"customButtonID","abstract":"<p>If ButtonName is &ldquo;CUSTOM_BUTTON&rdquo;, this references the integer ID passed by a custom button. (e.g. softButton ID)</p>","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonName":{"name":"buttonName","abstract":"<p>The name of the button</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonEventMode":{"name":"buttonEventMode","abstract":"<p>Indicates whether this is an UP or DOWN event</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)customButtonID":{"name":"customButtonID","abstract":"<p>If ButtonName is &ldquo;CUSTOM_BUTTON&rdquo;, this references the integer ID passed by a custom button. (e.g. softButton ID)</p>","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(im)initWithServiceData:":{"name":"-initWithServiceData:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(py)serviceData":{"name":"serviceData","abstract":"<p>The updated app service data.</p>","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppInterfaceUnregistered.html#/c:objc(cs)SDLOnAppInterfaceUnregistered(py)reason":{"name":"reason","abstract":"<p>The reason application&rsquo;s interface was terminated</p>","parent_name":"SDLOnAppInterfaceUnregistered"},"Classes/SDLOnAppCapabilityUpdated.html#/c:objc(cs)SDLOnAppCapabilityUpdated(im)initWithAppCapability:":{"name":"-initWithAppCapability:","parent_name":"SDLOnAppCapabilityUpdated"},"Classes/SDLOnAppCapabilityUpdated.html#/c:objc(cs)SDLOnAppCapabilityUpdated(py)appCapability":{"name":"appCapability","abstract":"<p>The app capability that has been updated</p>","parent_name":"SDLOnAppCapabilityUpdated"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:","abstract":"<p>Convenience init to describe an oasis address</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:","abstract":"<p>Convenience init to describe an oasis address with all parameters</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryName":{"name":"countryName","abstract":"<p>Name of the country (localized)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryCode":{"name":"countryCode","abstract":"<p>countryCode of the country(ISO 3166-2)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)postalCode":{"name":"postalCode","abstract":"<p>postalCode of location (PLZ, ZIP, PIN, CAP etc.)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)administrativeArea":{"name":"administrativeArea","abstract":"<p>Portion of country (e.g. state)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subAdministrativeArea":{"name":"subAdministrativeArea","abstract":"<p>Portion of administrativeArea (e.g. county)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)locality":{"name":"locality","abstract":"<p>Hypernym for city/village</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subLocality":{"name":"subLocality","abstract":"<p>Hypernym for district</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)thoroughfare":{"name":"thoroughfare","abstract":"<p>Hypernym for street, road etc.</p>","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subThoroughfare":{"name":"subThoroughfare","abstract":"<p>Portion of thoroughfare (e.g. house number)</p>","parent_name":"SDLOasisAddress"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allResponseNames":{"name":"+allResponseNames","abstract":"<p>All of the possible SDL RPC Response notification names</p>","parent_name":"SDLNotificationConstants"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allButtonEventNotifications":{"name":"+allButtonEventNotifications","abstract":"<p>All of the possible SDL Button event notification names</p>","parent_name":"SDLNotificationConstants"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(im)initWithAcceptsWayPoints:":{"name":"-initWithAcceptsWayPoints:","abstract":"<p>Convenience init.</p>","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(py)acceptsWayPoints":{"name":"acceptsWayPoints","abstract":"<p>Informs the subscriber if this service can actually accept way points.</p>","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:":{"name":"-initWithTimestamp:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:":{"name":"-initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)timestamp":{"name":"timestamp","abstract":"<p>This is the timestamp of when the data was generated. This is to ensure any time or distance given in the data can accurately be adjusted if necessary.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)origin":{"name":"origin","abstract":"<p>The start location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destination":{"name":"destination","abstract":"<p>The final destination location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destinationETA":{"name":"destinationETA","abstract":"<p>The estimated time of arrival at the final destination location.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)instructions":{"name":"instructions","abstract":"<p>This array should be ordered with all remaining instructions. The start of this array should always contain the next instruction.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionETA":{"name":"nextInstructionETA","abstract":"<p>The estimated time of arrival at the next destination.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistance":{"name":"nextInstructionDistance","abstract":"<p>The distance to this instruction from current location. This should only be updated ever .1 unit of distance. For more accuracy the consumer can use the GPS location of itself and the next instruction.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistanceScale":{"name":"nextInstructionDistanceScale","abstract":"<p>Distance till next maneuver (starting from) from previous maneuver.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)prompt":{"name":"prompt","abstract":"<p>This is a prompt message that should be conveyed to the user through either display or voice (TTS). This param will change often as it should represent the following: approaching instruction, post instruction, alerts that affect the current navigation session, etc.</p>","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:":{"name":"-initWithLocationDetails:action:","abstract":"<p>Convenience init for required parameters</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:":{"name":"-initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)locationDetails":{"name":"locationDetails","abstract":"<p>The location details.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)action":{"name":"action","abstract":"<p>The navigation action.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)eta":{"name":"eta","abstract":"<p>The estimated time of arrival.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)bearing":{"name":"bearing","abstract":"<p>The angle at which this instruction takes place. For example, 0 would mean straight, &lt;=45 is bearing right, &gt;= 135 is sharp right, between 45 and 135 is a regular right, and 180 is a U-Turn, etc. </p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)junctionType":{"name":"junctionType","abstract":"<p>The navigation junction type.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)drivingSide":{"name":"drivingSide","abstract":"<p>Used to infer which side of the road this instruction takes place. For a U-Turn (action=TURN, bearing=180) this will determine which direction the turn should take place.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)details":{"name":"details","abstract":"<p>This is a string representation of this instruction, used to display instructions to the users. This is not intended to be read aloud to the users, see the param prompt in <code>NavigationServiceData</code> for that.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)image":{"name":"image","abstract":"<p>An image representation of this instruction.</p>","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(im)initWithSendLocation:waypoints:":{"name":"-initWithSendLocation:waypoints:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)sendLocationEnabled":{"name":"sendLocationEnabled","abstract":"<p>Whether or not the SendLocation RPC is enabled.</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)getWayPointsEnabled":{"name":"getWayPointsEnabled","abstract":"<p>Whether or not Waypoint related RPCs are enabled.</p>","parent_name":"SDLNavigationCapability"},"Classes/SDLMyKey.html#/c:objc(cs)SDLMyKey(py)e911Override":{"name":"e911Override","abstract":"<p>Indicates whether e911 override is on. References signal &ldquo;MyKey_e911Override_St&rdquo;. See VehicleDataStatus.</p>","parent_name":"SDLMyKey"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(im)initWithMajorVersion:minorVersion:patchVersion:":{"name":"-initWithMajorVersion:minorVersion:patchVersion:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)majorVersion":{"name":"majorVersion","abstract":"<p>The major version indicates versions that is not-compatible to previous versions</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)minorVersion":{"name":"minorVersion","abstract":"<p>The minor version indicates a change to a previous version that should still allow to be run on an older version (with limited functionality)</p>","parent_name":"SDLMsgVersion"},"Classes/SDLMsgVersion.html#/c:objc(cs)SDLMsgVersion(py)patchVersion":{"name":"patchVersion","abstract":"<p>Allows backward-compatible fixes to the API without increasing the minor version of the interface</p>","parent_name":"SDLMsgVersion"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)moduleId":{"name":"moduleId","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)location":{"name":"location","abstract":"<p>Location of a module.","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)serviceArea":{"name":"serviceArea","abstract":"<p>Service area of a module.","parent_name":"SDLModuleInfo"},"Classes/SDLModuleInfo.html#/c:objc(cs)SDLModuleInfo(py)allowMultipleAccess":{"name":"allowMultipleAccess","abstract":"<p>Allow multiple users/apps to access the module or not</p>","parent_name":"SDLModuleInfo"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithRadioControlData:":{"name":"-initWithRadioControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with radio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithClimateControlData:":{"name":"-initWithClimateControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with climate control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithAudioControlData:":{"name":"-initWithAudioControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with audio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithLightControlData:":{"name":"-initWithLightControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with light control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithHMISettingsControlData:":{"name":"-initWithHMISettingsControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with hmi settings data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithSeatControlData:":{"name":"-initWithSeatControlData:","abstract":"<p>Constructs a newly allocated SDLModuleData object with seat control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)moduleType":{"name":"moduleType","abstract":"<p>The moduleType indicates which type of data should be changed and identifies which data object exists in this struct.</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)radioControlData":{"name":"radioControlData","abstract":"<p>The radio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)climateControlData":{"name":"climateControlData","abstract":"<p>The climate control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)seatControlData":{"name":"seatControlData","abstract":"<p>The seat control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)audioControlData":{"name":"audioControlData","abstract":"<p>The audio control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)lightControlData":{"name":"lightControlData","abstract":"<p>The light control data</p>","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)hmiSettingsControlData":{"name":"hmiSettingsControlData","abstract":"<p>The hmi control data</p>","parent_name":"SDLModuleData"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:":{"name":"-initWithTextFieldTypes:mainField2:","abstract":"<p>Constructs a newly allocated SDLMetadataType object with NSArrays</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:mainField3:mainField4:":{"name":"-initWithTextFieldTypes:mainField2:mainField3:mainField4:","abstract":"<p>Constructs a newly allocated SDLMetadataType with all parameters</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField1":{"name":"mainField1","abstract":"<p>The type of data contained in the &ldquo;mainField1&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField2":{"name":"mainField2","abstract":"<p>The type of data contained in the &ldquo;mainField2&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField3":{"name":"mainField3","abstract":"<p>The type of data contained in the &ldquo;mainField3&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField4":{"name":"mainField4","abstract":"<p>The type of data contained in the &ldquo;mainField4&rdquo; text field.</p>","parent_name":"SDLMetadataTags"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:":{"name":"-initWithMenuName:","abstract":"<p>Convenience init with required parameters.</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:parentId:position:":{"name":"-initWithMenuName:parentId:position:","abstract":"<p>Convenience init with all parameters.</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:parentID:position:secondaryText:tertiaryText:":{"name":"-initWithMenuName:parentID:position:secondaryText:tertiaryText:","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)parentID":{"name":"parentID","abstract":"<p>The unique ID of an existing submenu to which a command will be added</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)position":{"name":"position","abstract":"<p>The position within the items of the parent Command Menu</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)menuName":{"name":"menuName","abstract":"<p>The menu name which appears in menu, representing this command</p>","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)secondaryText":{"name":"secondaryText","abstract":"<p>Optional secondary text to display","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Optional tertiary text to display","parent_name":"SDLMenuParams"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(py)mainMenuLayout":{"name":"mainMenuLayout","abstract":"<p>Changes the default main menu layout. Defaults to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLMenuLayoutList\">SDLMenuLayoutList</a></code>.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(py)defaultSubmenuLayout":{"name":"defaultSubmenuLayout","abstract":"<p>Changes the default submenu layout. To change this for an individual submenu, set the <code>menuLayout</code> property on the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html\">SDLMenuCell</a></code> initializer for creating a cell with sub-cells. Defaults to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbConstants.html#/c:@SDLMenuLayoutList\">SDLMenuLayoutList</a></code>.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuConfiguration.html#/c:objc(cs)SDLMenuConfiguration(im)initWithMainMenuLayout:defaultSubmenuLayout:":{"name":"-initWithMainMenuLayout:defaultSubmenuLayout:","abstract":"<p>Initialize a new menu configuration with a main menu layout and a default submenu layout which can be overridden per-submenu if desired.</p>","parent_name":"SDLMenuConfiguration"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)title":{"name":"title","abstract":"<p>The cell&rsquo;s text to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)icon":{"name":"icon","abstract":"<p>The cell&rsquo;s icon to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>The strings the user can say to activate this voice command</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)handler":{"name":"handler","abstract":"<p>The handler that will be called when the command is activated</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)subCells":{"name":"subCells","abstract":"<p>If this is non-nil, this cell will be a sub-menu button, displaying the subcells in a menu when pressed.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)submenuLayout":{"name":"submenuLayout","abstract":"<p>The layout in which the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)subCells\">subCells</a></code> will be displayed.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)uniqueTitle":{"name":"uniqueTitle","abstract":"<p>Primary text of the cell to be displayed on the module. Used to distinguish cells with the same <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)title\">title</a></code> but other fields are different. This is autogenerated by the screen manager. This will not be used when connected to modules supporting RPC 7.1+ because duplicate titles are supported.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)secondaryText":{"name":"secondaryText","abstract":"<p>The cell&rsquo;s secondary text to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>The cell&rsquo;s tertiary text to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)secondaryArtwork":{"name":"secondaryArtwork","abstract":"<p>The cell&rsquo;s secondary icon to be displayed</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:voiceCommands:handler:":{"name":"-initWithTitle:icon:voiceCommands:handler:","abstract":"<p>Create a menu cell that has no subcells.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:submenuLayout:subCells:":{"name":"-initWithTitle:icon:submenuLayout:subCells:","abstract":"<p>Create a menu cell that has subcells and when selected will go into a deeper part of the menu</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler:":{"name":"-initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:voiceCommands:handler:","abstract":"<p>Create a menu cell that has no subcells.</p>","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells:":{"name":"-initWithTitle:secondaryText:tertiaryText:icon:secondaryArtwork:submenuLayout:subCells:","abstract":"<p>Create a menu cell that has subcells and when selected will go into a deeper part of the menu</p>","parent_name":"SDLMenuCell"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(im)initWithMediaType:mediaImage:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:":{"name":"-initWithMediaType:mediaImage:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:","abstract":"<p>Convenience init</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaImage":{"name":"mediaImage","abstract":"<p>Sets the media image associated with the currently playing media","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaType":{"name":"mediaType","abstract":"<p>The type of the currently playing or paused track.</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaTitle":{"name":"mediaTitle","abstract":"<p>Music: The name of the current track","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaArtist":{"name":"mediaArtist","abstract":"<p>Music: The name of the current album artist","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaAlbum":{"name":"mediaAlbum","abstract":"<p>Music: The name of the current album","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)playlistName":{"name":"playlistName","abstract":"<p>Music: The name of the playlist or radio station, if the user is playing from a playlist, otherwise, Null","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)isExplicit":{"name":"isExplicit","abstract":"<p>Whether or not the content currently playing (e.g. the track, episode, or book) contains explicit content.</p>","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackProgress":{"name":"trackPlaybackProgress","abstract":"<p>Music: The current progress of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackDuration":{"name":"trackPlaybackDuration","abstract":"<p>Music: The total duration of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackProgress":{"name":"queuePlaybackProgress","abstract":"<p>Music: The current progress of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackDuration":{"name":"queuePlaybackDuration","abstract":"<p>Music: The total duration of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueCurrentTrackNumber":{"name":"queueCurrentTrackNumber","abstract":"<p>Music: The current number (1 based) of the track in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueTotalTrackCount":{"name":"queueTotalTrackCount","abstract":"<p>Music: The total number of tracks in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(im)initWithMassageMode:massageZone:":{"name":"-initWithMassageMode:massageZone:","abstract":"<p>@abstract Constructs a newly allocated SDLMassageModeData object with massageMode and massageZone</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageMode":{"name":"massageMode","abstract":"<p>@abstract mode of a massage zone</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageZone":{"name":"massageZone","abstract":"<p>@abstract zone of a multi-contour massage seat.</p>","parent_name":"SDLMassageModeData"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(im)initWithMassageCushion:firmness:":{"name":"-initWithMassageCushion:firmness:","abstract":"<p>Constructs a newly allocated SDLMassageCushionFirmness object with cushion and firmness</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)cushion":{"name":"cushion","abstract":"<p>@abstract cushion of a multi-contour massage seat.</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)firmness":{"name":"firmness","abstract":"<p>@abstract zone of a multi-contour massage seat.</p>","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)configuration":{"name":"configuration","abstract":"<p>The configuration the manager was set up with.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)hmiLevel":{"name":"hmiLevel","abstract":"<p>The current HMI level of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)audioStreamingState":{"name":"audioStreamingState","abstract":"<p>The current audio streaming state of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemContext":{"name":"systemContext","abstract":"<p>The current system context of the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)fileManager":{"name":"fileManager","abstract":"<p>The file manager to be used by the running app.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)permissionManager":{"name":"permissionManager","abstract":"<p>The permission manager monitoring RPC permissions.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)streamManager":{"name":"streamManager","abstract":"<p>The streaming media manager to be used for starting video sessions.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)screenManager":{"name":"screenManager","abstract":"<p>The screen manager for sending UI related RPCs.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemCapabilityManager":{"name":"systemCapabilityManager","abstract":"<p>Centralized manager for retrieving all system capabilities.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)registerResponse":{"name":"registerResponse","abstract":"<p>The response of a register call after it has been received.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)authToken":{"name":"authToken","abstract":"<p>The auth token, if received. This should be used to log into a user account. Primarily used for cloud apps with companion app stores.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)delegate":{"name":"delegate","abstract":"<p>The manager&rsquo;s delegate.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)pendingRPCTransactions":{"name":"pendingRPCTransactions","abstract":"<p>The currently pending RPC request send transactions</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)initWithConfiguration:delegate:":{"name":"-initWithConfiguration:delegate:","abstract":"<p>Initialize the manager with a configuration. Call <code>startWithHandler</code> to begin waiting for a connection.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)startWithReadyHandler:":{"name":"-startWithReadyHandler:","abstract":"<p>Start the manager, which will tell it to start looking for a connection. Once one does, it will automatically run the setup process and call the readyBlock when done.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)stop":{"name":"-stop","abstract":"<p>Stop the manager, it will disconnect if needed and no longer look for a connection. You probably don&rsquo;t need to call this method ever.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)startRPCEncryption":{"name":"-startRPCEncryption","abstract":"<p>Start the encryption lifecycle manager, which will attempt to open a secure service.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRPC:":{"name":"-sendRPC:","abstract":"<p>Send an RPC of type <code>Response</code>, <code>Notification</code> or <code>Request</code>. Responses and notifications sent to Core do not a response back from Core. Each request sent to Core does get a response, so if you need the response and/or error, call <code>sendRequest:withResponseHandler:</code> instead.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:":{"name":"-sendRequest:","abstract":"<p>Send an RPC request and don&rsquo;t bother with the response or error. If you need the response or error, call sendRequest:withCompletionHandler: instead.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:withResponseHandler:":{"name":"-sendRequest:withResponseHandler:","abstract":"<p>Send an RPC request and set a completion handler that will be called with the response when the response returns.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequests:progressHandler:completionHandler:":{"name":"-sendRequests:progressHandler:completionHandler:","abstract":"<p>Send all of the requests given as quickly as possible, but in order. Call the completionHandler after all requests have either failed or given a response.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendSequentialRequests:progressHandler:completionHandler:":{"name":"-sendSequentialRequests:progressHandler:completionHandler:","abstract":"<p>Send all of the requests one at a time, with the next one going out only after the previous one has received a response. Call the completionHandler after all requests have either failed or given a response.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)subscribeToRPC:withBlock:":{"name":"-subscribeToRPC:withBlock:","abstract":"<p>Subscribe to callbacks about a particular RPC request, notification, or response with a block callback.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)subscribeToRPC:withObserver:selector:":{"name":"-subscribeToRPC:withObserver:selector:","abstract":"<p>Subscribe to callbacks about a particular RPC request, notification, or response with a selector callback.</p>","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)unsubscribeFromRPC:withObserver:":{"name":"-unsubscribeFromRPC:withObserver:","abstract":"<p>Unsubscribe to callbacks about a particular RPC request, notification, or response.</p>","parent_name":"SDLManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)modules":{"name":"modules","abstract":"<p>Active log modules</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)targets":{"name":"targets","abstract":"<p>Active log targets</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)filters":{"name":"filters","abstract":"<p>Active log filters</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)globalLogLevel":{"name":"globalLogLevel","abstract":"<p>Any modules that do not have an explicitly specified level will by default use this log level</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)formatType":{"name":"formatType","abstract":"<p>Active log format</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)asynchronous":{"name":"asynchronous","abstract":"<p>Whether or not verbose, debug, and warning logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"<p>Whether or not error logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)disableAssertions":{"name":"disableAssertions","abstract":"<p>Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)dateFormatter":{"name":"dateFormatter","abstract":"<p>Active date formatter</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)logQueue":{"name":"logQueue","abstract":"<p>The queue asynchronously logged logs are logged on. Say that 10 times fast.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)sharedManager":{"name":"+sharedManager","abstract":"<p>The singleton object</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)setConfiguration:":{"name":"+setConfiguration:","abstract":"<p>Sets a configuration to be used by the log manager&rsquo;s sharedManager. This is generally for internal use and you should set your configuration using SDLManager&rsquo;s startWithConfiguration: method.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)setConfiguration:":{"name":"-setConfiguration:","abstract":"<p>Sets a configuration to be used by the log manager. This is generally for internal use and you should set your configuration using SDLManager&rsquo;s startWithConfiguration: method.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log to the sharedManager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log to this log manager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"<p>Log to this sharedManager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"<p>Log to this log manager&rsquo;s active log targets. This is used internally to log. If you want to create a log, you should use macros such as <code>SDLLogD</code>.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"+logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"<p>Log to this sharedManager&rsquo;s active log targets. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"-logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"<p>Log to this manager&rsquo;s active log targets. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"+logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log an error to the sharedManager&rsquo;s active log targets and assert. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"-logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"<p>Log an error to this manager&rsquo;s active log targets and assert. This is used internally to log.</p>","parent_name":"SDLLogManager"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(py)filter":{"name":"filter","abstract":"<p>A block that takes in a log model and returns whether or not the log passes the filter and should therefore be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)initWithCustomFilter:":{"name":"-initWithCustomFilter:","abstract":"<p>Create a new filter with a custom filter block. The filter block will take a log model and return a BOOL of pass / fail.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingString:caseSensitive:":{"name":"+filterByDisallowingString:caseSensitive:","abstract":"<p>Returns a filter that only allows logs not containing the passed string within their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingString:caseSensitive:":{"name":"+filterByAllowingString:caseSensitive:","abstract":"<p>Returns a filter that only allows logs containing the passed string within their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingRegex:":{"name":"+filterByDisallowingRegex:","abstract":"<p>Returns a filter that only allows logs not passing the passed regex against their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingRegex:":{"name":"+filterByAllowingRegex:","abstract":"<p>Returns a filter that only allows logs passing the passed regex against their message.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingModules:":{"name":"+filterByDisallowingModules:","abstract":"<p>Returns a filter that only allows logs not within the specified file modules to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingModules:":{"name":"+filterByAllowingModules:","abstract":"<p>Returns a filter that only allows logs of the specified file modules to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingFileNames:":{"name":"+filterByDisallowingFileNames:","abstract":"<p>Returns a filter that only allows logs not within the specified files to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingFileNames:":{"name":"+filterByAllowingFileNames:","abstract":"<p>Returns a filter that only allows logs within the specified files to be logged.</p>","parent_name":"SDLLogFilter"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)name":{"name":"name","abstract":"<p>The name of the this module, e.g. &ldquo;Transport&rdquo;</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)files":{"name":"files","abstract":"<p>All of the files contained within this module. When a log is logged, the <code>__FILE__</code> (in Obj-C) or <code>#file</code> (in Swift) is automatically captured and checked to see if any module has a file in this set that matches. If it does, it will be logged using the module&rsquo;s log level and the module&rsquo;s name will be printed in the formatted log.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)logLevel":{"name":"logLevel","abstract":"<p>The custom level of the log. This is <code>SDLLogLevelDefault</code> (whatever the current global log level is) by default.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)init":{"name":"-init","abstract":"<p>This method is unavailable and may not be used.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:level:":{"name":"-initWithName:files:level:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name, set of files, and associated log level.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:":{"name":"-initWithName:files:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name and set of files. The logging level is the same as the current global logging file by using <code>SDLLogLevelDefault</code>.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(cm)moduleWithName:files:":{"name":"+moduleWithName:files:","abstract":"<p>Returns an initialized <code>SDLLogFileModule</code> that contains a custom name and set of files. The logging level is the same as the current global logging file by using <code>SDLLogLevelDefault</code>.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)containsFile:":{"name":"-containsFile:","abstract":"<p>Returns whether or not this module contains a given file.</p>","parent_name":"SDLLogFileModule"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)modules":{"name":"modules","abstract":"<p>Any custom logging modules used by the developer&rsquo;s code. Defaults to none.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)targets":{"name":"targets","abstract":"<p>Where the logs will attempt to output. Defaults to Console.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)filters":{"name":"filters","abstract":"<p>What log filters will run over this session. Defaults to none.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)formatType":{"name":"formatType","abstract":"<p>How detailed of logs will be output. Defaults to Default.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)asynchronous":{"name":"asynchronous","abstract":"<p>Whether or not logs will be run on a separate queue, asynchronously, allowing the following code to run before the log completes. Or if it will occur synchronously, which will prevent logs from being missed, but will slow down surrounding code. Defaults to YES.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"<p>Whether or not error logs will be dispatched to loggers asynchronously. Defaults to NO.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)disableAssertions":{"name":"disableAssertions","abstract":"<p>Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)globalLogLevel":{"name":"globalLogLevel","abstract":"<p>Any modules that do not have an explicitly specified level will by default use the global log level. Defaults to Error.","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>A default logger for production. This sets the format type to Default, the log level to Error, and the target to SDLLogTargetOSLog.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)debugConfiguration":{"name":"+debugConfiguration","abstract":"<p>A debug logger for use in development. This sets the format type to Detailed, the log level to Debug, and enables the Console and ASL loggers.</p>","parent_name":"SDLLogConfiguration"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)appIcon":{"name":"appIcon","abstract":"<p>The app&rsquo;s icon. This will be set by the lock screen configuration.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)vehicleIcon":{"name":"vehicleIcon","abstract":"<p>The vehicle&rsquo;s designated icon. This will be set by the lock screen manager when it is notified that a lock screen icon has been downloaded.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The designated background color set in the lock screen configuration, or the default SDL gray-blue.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)lockedLabelText":{"name":"lockedLabelText","abstract":"<p>The locked label string. This will be set by the lock screen manager to inform the user about the dismissible state.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(im)addDismissGestureWithCallback:":{"name":"-addDismissGestureWithCallback:","abstract":"<p>Adds a swipe gesture to the lock screen view controller.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(im)removeDismissGesture":{"name":"-removeDismissGesture","abstract":"<p>Remove swipe gesture to the lock screen view controller.</p>","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)displayMode":{"name":"displayMode","abstract":"<p>Describes when the lock screen will be displayed. Defaults to <code>SDLLockScreenConfigurationDisplayModeRequiredOnly</code>.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)enableDismissGesture":{"name":"enableDismissGesture","abstract":"<p>If YES, then the lock screen can be dismissed with a downward swipe on compatible head units. Requires a connection of SDL 6.0+ and the head unit to enable the feature. Defaults to YES.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)showDeviceLogo":{"name":"showDeviceLogo","abstract":"<p>If YES, then the lockscreen will show the vehicle&rsquo;s logo if the vehicle has made it available. If NO, then the lockscreen will not show the vehicle logo. Defaults to YES.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)backgroundColor":{"name":"backgroundColor","abstract":"<p>The background color of the lock screen. This could be a branding color, or leave at the default for a dark blue-gray.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)appIcon":{"name":"appIcon","abstract":"<p>Your app icon as it will appear on the lock screen.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)customViewController":{"name":"customViewController","abstract":"<p>A custom view controller that the lock screen will manage the presentation of.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)disabledConfiguration":{"name":"+disabledConfiguration","abstract":"<p>Use this configuration if you wish to manage a lock screen yourself. This may be useful if the automatic presentation feature of SDLLockScreenManager is failing for some reason.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfiguration":{"name":"+enabledConfiguration","abstract":"<p>Use this configuration for the basic default lock screen. A custom app icon will not be used.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithAppIcon:backgroundColor:":{"name":"+enabledConfigurationWithAppIcon:backgroundColor:","abstract":"<p>Use this configuration to provide a custom lock screen icon and a custom background color, or nil if you wish to use the default background color. This will use the default lock screen layout.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithViewController:":{"name":"+enabledConfigurationWithViewController:","abstract":"<p>Use this configuration if you wish to provide your own view controller for the lock screen. This view controller&rsquo;s presentation and dismissal will still be managed by the lock screen manager. Note that you may subclass SDLLockScreenViewController and pass it here to continue to have the vehicle icon set to your view controller by the manager.</p>","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:":{"name":"-initWithCoordinate:","abstract":"<p>Convenience init for location coordinate.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:":{"name":"-initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)coordinate":{"name":"coordinate","abstract":"<p>Latitude/Longitude of the location</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationName":{"name":"locationName","abstract":"<p>Name of location.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)addressLines":{"name":"addressLines","abstract":"<p>Location address for display purposes only.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationDescription":{"name":"locationDescription","abstract":"<p>Description intended location / establishment.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)phoneNumber":{"name":"phoneNumber","abstract":"<p>Phone number of location / establishment.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationImage":{"name":"locationImage","abstract":"<p>Image / icon of intended location.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)searchAddress":{"name":"searchAddress","abstract":"<p>Address to be used by navigation engines for search.</p>","parent_name":"SDLLocationDetails"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(im)initWithLatitudeDegrees:longitudeDegrees:":{"name":"-initWithLatitudeDegrees:longitudeDegrees:","abstract":"<p>Convenience init for location coordinates</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>Latitude of the location</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>Latitude of the location</p>","parent_name":"SDLLocationCoordinate"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)filenames":{"name":"filenames","abstract":"<p>An array of all filenames resident on the module for the given registered app. If omitted, then no files currently reside on the system.</p>","parent_name":"SDLListFilesResponse"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>Provides the total local space available on the module for the registered app.</p>","parent_name":"SDLListFilesResponse"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:":{"name":"-initWithId:status:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:density:color:":{"name":"-initWithId:status:density:color:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:lightStatus:lightDensity:lightColor:":{"name":"-initWithId:lightStatus:lightDensity:lightColor:","abstract":"<p>Constructs a newly allocated SDLLightState object with given parameters</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)id":{"name":"id","abstract":"<p>@abstract The name of a light or a group of lights</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)status":{"name":"status","abstract":"<p>@abstract Reflects the status of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)density":{"name":"density","abstract":"<p>@abstract Reflects the density of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)color":{"name":"color","abstract":"<p>@abstract Reflects the color of Light.</p>","parent_name":"SDLLightState"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(im)initWithLightStates:":{"name":"-initWithLightStates:","abstract":"<p>Constructs a newly allocated SDLLightControlData object with lightState</p>","parent_name":"SDLLightControlData"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(py)lightState":{"name":"lightState","abstract":"<p>@abstract An array of LightNames and their current or desired status.","parent_name":"SDLLightControlData"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(im)initWithModuleName:moduleInfo:supportedLights:":{"name":"-initWithModuleName:moduleInfo:supportedLights:","abstract":"<p>Constructs a newly allocated SDLLightControlCapabilities object with given parameters</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the light control module.","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)supportedLights":{"name":"supportedLights","abstract":"<p>@abstract An array of available LightCapabilities that are controllable.</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:":{"name":"-initWithName:","abstract":"<p>Constructs a newly allocated SDLLightCapabilities object with the name of the light or group of lights</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:densityAvailable:colorAvailable:statusAvailable:":{"name":"-initWithName:densityAvailable:colorAvailable:statusAvailable:","abstract":"<p>Constructs a newly allocated SDLLightCapabilities object with given parameters</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)name":{"name":"name","abstract":"<p>@abstract The name of a light or a group of lights</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)densityAvailable":{"name":"densityAvailable","abstract":"<p>@abstract Indicates if the light&rsquo;s density can be set remotely (similar to a dimmer).</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)colorAvailable":{"name":"colorAvailable","abstract":"<p>@abstract Indicates if the light&rsquo;s color can be set remotely by using the RGB color space.</p>","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)statusAvailable":{"name":"statusAvailable","abstract":"<p>@abstract Indicates if the status (ON/OFF) can be set remotely.","parent_name":"SDLLightCapabilities"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)appName":{"name":"appName","abstract":"<p>The full name of the app to that the configuration should be updated to.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)shortAppName":{"name":"shortAppName","abstract":"<p>An abbrevited application name that will be used on the app launching screen if the full one would be truncated.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)ttsName":{"name":"ttsName","abstract":"<p>A Text to Speech String for voice recognition of the mobile application name.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"<p>Additional voice recognition commands. May not interfere with any other app name or global commands.</p>","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(im)initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:":{"name":"-initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:","abstract":"<p>Initializes and returns a newly allocated lifecycle configuration update object with the specified app data.","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)defaultConfigurationWithAppName:fullAppId:":{"name":"+defaultConfigurationWithAppName:fullAppId:","abstract":"<p>A production configuration that runs using IAP. Additional functionality should be customized on the properties.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)debugConfigurationWithAppName:fullAppId:ipAddress:port:":{"name":"+debugConfigurationWithAppName:fullAppId:ipAddress:port:","abstract":"<p>A debug configuration that runs using TCP. Additional functionality should be customized on the properties.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugMode":{"name":"tcpDebugMode","abstract":"<p>Whether or not debug mode is enabled</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugIPAddress":{"name":"tcpDebugIPAddress","abstract":"<p>The ip address at which the library will look for a server</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugPort":{"name":"tcpDebugPort","abstract":"<p>The port at which the library will look for a server</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appName":{"name":"appName","abstract":"<p>The full name of the app</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appId":{"name":"appId","abstract":"<p>The app id. This must be the same as the app id received from the SDL developer portal.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)fullAppId":{"name":"fullAppId","abstract":"<p>The full app id. This must be the same as the full app id received from the SDL developer portal.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)resumeHash":{"name":"resumeHash","abstract":"<p>A hash id which should be passed to the remote system in the RegisterAppInterface</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)isMedia":{"name":"isMedia","abstract":"<p>This is an automatically set based on the app type</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appType":{"name":"appType","abstract":"<p>The application type</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)additionalAppTypes":{"name":"additionalAppTypes","abstract":"<p>Additional application types beyond <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appType\">appType</a></code></p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)language":{"name":"language","abstract":"<p>The default language to use</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)languagesSupported":{"name":"languagesSupported","abstract":"<p>An array of all the supported languages</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appIcon":{"name":"appIcon","abstract":"<p>The application icon to be used on an app launching screen</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)shortAppName":{"name":"shortAppName","abstract":"<p>An abbrevited application name that will be used on the app launching screen if the full one would be truncated</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)ttsName":{"name":"ttsName","abstract":"<p>A Text to Speech String for voice recognition of the mobile application name.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"<p>Additional voice recognition commands. May not interfere with any other app name or global commands.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)dayColorScheme":{"name":"dayColorScheme","abstract":"<p>The color scheme to use when the head unit is in a light / day situation.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)nightColorScheme":{"name":"nightColorScheme","abstract":"<p>The color scheme to use when the head unit is in a dark / night situation.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumProtocolVersion":{"name":"minimumProtocolVersion","abstract":"<p>The minimum protocol version that will be permitted to connect. This defaults to 1.0.0. If the protocol version of the head unit connected is below this version, the app will disconnect with an EndService protocol message and will not register.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumRPCVersion":{"name":"minimumRPCVersion","abstract":"<p>The minimum RPC version that will be permitted to connect. This defaults to 1.0.0. If the RPC version of the head unit connected is below this version, an UnregisterAppInterface will be sent.</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)allowedSecondaryTransports":{"name":"allowedSecondaryTransports","abstract":"<p>Which transports are permitted to be used as secondary transports. A secondary transport is a transport that is connected as an alternate, higher bandwidth transport for situations when a low-bandwidth primary transport (such as Bluetooth) will restrict certain features (such as video streaming navigation).</p>","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:":{"name":"-initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:","abstract":"<p>Create a Keyboard Properties RPC object</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:":{"name":"-initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:","abstract":"<p>Convenience init with all properties.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:":{"name":"-initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)language":{"name":"language","abstract":"<p>The keyboard language</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keyboardLayout":{"name":"keyboardLayout","abstract":"<p>Desired keyboard layout</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keypressMode":{"name":"keypressMode","abstract":"<p>Desired keypress mode.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)limitedCharacterList":{"name":"limitedCharacterList","abstract":"<p>Array of keyboard characters to enable. All omitted characters will be greyed out (disabled) on the keyboard. If omitted, the entire keyboard will be enabled.</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)autoCompleteText":{"name":"autoCompleteText","abstract":"<p>Deprecated, use autoCompleteList instead.","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)autoCompleteList":{"name":"autoCompleteList","abstract":"<p>Allows an app to show a list of possible autocomplete suggestions as the user types</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)maskInputCharacters":{"name":"maskInputCharacters","abstract":"<p>Allows an app to mask entered characters on HMI</p>","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)customKeys":{"name":"customKeys","abstract":"<p>Array of special characters to show in customizable keys. If omitted, keyboard will show default special characters","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardLayoutCapability.html#/c:objc(cs)SDLKeyboardLayoutCapability(im)initWithKeyboardLayout:numConfigurableKeys:":{"name":"-initWithKeyboardLayout:numConfigurableKeys:","parent_name":"SDLKeyboardLayoutCapability"},"Classes/SDLKeyboardLayoutCapability.html#/c:objc(cs)SDLKeyboardLayoutCapability(py)keyboardLayout":{"name":"keyboardLayout","abstract":"<p>The keyboard layout of this capability</p>","parent_name":"SDLKeyboardLayoutCapability"},"Classes/SDLKeyboardLayoutCapability.html#/c:objc(cs)SDLKeyboardLayoutCapability(py)numConfigurableKeys":{"name":"numConfigurableKeys","abstract":"<p>Number of keys available for special characters, App can customize as per their needs.","parent_name":"SDLKeyboardLayoutCapability"},"Classes/SDLKeyboardCapabilities.html#/c:objc(cs)SDLKeyboardCapabilities(im)initWithMaskInputCharactersSupported:supportedKeyboards:":{"name":"-initWithMaskInputCharactersSupported:supportedKeyboards:","parent_name":"SDLKeyboardCapabilities"},"Classes/SDLKeyboardCapabilities.html#/c:objc(cs)SDLKeyboardCapabilities(py)maskInputCharactersSupported":{"name":"maskInputCharactersSupported","abstract":"<p>Availability of capability to mask input characters using keyboard. True: Available, False: Not Available</p>","parent_name":"SDLKeyboardCapabilities"},"Classes/SDLKeyboardCapabilities.html#/c:objc(cs)SDLKeyboardCapabilities(py)supportedKeyboards":{"name":"supportedKeyboards","abstract":"<p>Capabilities of supported keyboard layouts by HMI.","parent_name":"SDLKeyboardCapabilities"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionWidth":{"name":"resolutionWidth","abstract":"<p>Resolution width</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionHeight":{"name":"resolutionHeight","abstract":"<p>Resolution height</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(im)initWithWidth:height:":{"name":"-initWithWidth:height:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLImageResolution"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)name":{"name":"name","abstract":"<p>The name that identifies the field.</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageTypeSupported":{"name":"imageTypeSupported","abstract":"<p>The image types that are supported in this field.</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageResolution":{"name":"imageResolution","abstract":"<p>The image resolution of this field</p>","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(im)initWithName:imageTypeSupported:imageResolution:":{"name":"-initWithName:imageTypeSupported:imageResolution:","abstract":"<p>Convenience initializer for the ImageField RPC struct</p>","parent_name":"SDLImageField"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:ofType:isTemplate:":{"name":"-initWithName:ofType:isTemplate:","abstract":"<p>Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:isTemplate:":{"name":"-initWithName:isTemplate:","abstract":"<p>Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticImageValue:":{"name":"-initWithStaticImageValue:","abstract":"<p>Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image&rsquo;s value.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticIconName:":{"name":"-initWithStaticIconName:","abstract":"<p>Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image&rsquo;s value.</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)value":{"name":"value","abstract":"<p>The static hex icon value or the binary image file name identifier (sent by SDLPutFile)</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)imageType":{"name":"imageType","abstract":"<p>Describes whether the image is static or dynamic</p>","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)isTemplate":{"name":"isTemplate","abstract":"<p>Indicates that this image can be (re)colored by the HMI to best fit the current color scheme.</p>","parent_name":"SDLImage"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)lowBeamsOn":{"name":"lowBeamsOn","abstract":"<p>Low beams are on or off.</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)highBeamsOn":{"name":"highBeamsOn","abstract":"<p>High beams are on or off</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)ambientLightSensorStatus":{"name":"ambientLightSensorStatus","abstract":"<p>Status of the ambient light senser</p>","parent_name":"SDLHeadLampStatus"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(im)initWithId:rect:":{"name":"-initWithId:rect:","abstract":"<p>Convenience init with all parameters</p>","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)id":{"name":"id","abstract":"<p>A user control spatial identifier</p>","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)rect":{"name":"rect","abstract":"<p>The position of the haptic rectangle to be highlighted. The center of this rectangle will be &ldquo;touched&rdquo; when a press occurs.</p>","parent_name":"SDLHapticRect"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(im)initWithDisplaymode:temperatureUnit:distanceUnit:":{"name":"-initWithDisplaymode:temperatureUnit:distanceUnit:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)displayMode":{"name":"displayMode","abstract":"<p>@abstract Display the Display Mode used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)temperatureUnit":{"name":"temperatureUnit","abstract":"<p>@abstract Display the temperature unit used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)distanceUnit":{"name":"distanceUnit","abstract":"<p>@abstract Display the distance unit used HMI setting</p>","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:moduleInfo:":{"name":"-initWithModuleName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with moduleName</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:moduleInfo:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:":{"name":"-initWithModuleName:moduleInfo:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:","abstract":"<p>Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the hmi setting module.","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)distanceUnitAvailable":{"name":"distanceUnitAvailable","abstract":"<p>@abstract Availability of the control of distance unit.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)temperatureUnitAvailable":{"name":"temperatureUnitAvailable","abstract":"<p>@abstract Availability of the control of temperature unit.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)displayModeUnitAvailable":{"name":"displayModeUnitAvailable","abstract":"<p>@abstract Availability of the control of HMI display mode.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)allowed":{"name":"allowed","abstract":"<p>A set of all HMI levels that are permitted for this given RPC</p>","parent_name":"SDLHMIPermissions"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"<p>A set of all HMI levels that are prohibited for this given RPC</p>","parent_name":"SDLHMIPermissions"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(im)initWithNavigation:phoneCall:videoStreaming:remoteControl:appServices:displays:seatLocation:driverDistraction:":{"name":"-initWithNavigation:phoneCall:videoStreaming:remoteControl:appServices:displays:seatLocation:driverDistraction:","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)navigation":{"name":"navigation","abstract":"<p>Availability of built in Nav. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)phoneCall":{"name":"phoneCall","abstract":"<p>Availability of built in phone. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)videoStreaming":{"name":"videoStreaming","abstract":"<p>Availability of built in video streaming. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)remoteControl":{"name":"remoteControl","abstract":"<p>Availability of built in remote control. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)appServices":{"name":"appServices","abstract":"<p>Availability of app services. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)displays":{"name":"displays","abstract":"<p>Availability of displays. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)seatLocation":{"name":"seatLocation","abstract":"<p>Availability of seatLocation. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)driverDistraction":{"name":"driverDistraction","abstract":"<p>Availability of driver distraction capability. True: Available, False: Not Available</p>","parent_name":"SDLHMICapabilities"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)col":{"name":"col","abstract":"<p>Required, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)row":{"name":"row","abstract":"<p>Required, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)level":{"name":"level","abstract":"<p>Optional, Integer, -1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)colspan":{"name":"colspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)rowspan":{"name":"rowspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGrid.html#/c:objc(cs)SDLGrid(py)levelspan":{"name":"levelspan","abstract":"<p>Optional, Integer, 1 - 100</p>","parent_name":"SDLGrid"},"Classes/SDLGetWayPointsResponse.html#/c:objc(cs)SDLGetWayPointsResponse(py)waypoints":{"name":"waypoints","abstract":"<p>Provides additional human readable info regarding the result.</p>","parent_name":"SDLGetWayPointsResponse"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(im)initWithType:":{"name":"-initWithType:","abstract":"<p>Convenience init to get waypoints.</p>","parent_name":"SDLGetWayPoints"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(py)waypointType":{"name":"waypointType","abstract":"<p>To request for either the destination","parent_name":"SDLGetWayPoints"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for initializing data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for initializing data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gps":{"name":"gps","abstract":"<p>The car current GPS coordinates</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)speed":{"name":"speed","abstract":"<p>The vehicle speed in kilometers per hour</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"<p>The number of revolutions per minute of the engine.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>The fuel level in the tank (percentage)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>The fuel level state</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>The instantaneous fuel consumption in microlitres</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)vin":{"name":"vin","abstract":"<p>The Vehicle Identification Number</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"<p>The current pressure warnings for the user&rsquo;s vehicle</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"<p>Odometer reading in km</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"<p>The status of the seat belts</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>The body information including power modes</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>The IVI system status including signal and battery strength</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"<p>The status of the brake pedal</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>The status of the wipers</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>Status of the head lamps</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>The estimated percentage (0% - 100%) of remaining oil life of the engine</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"<p>Torque value for engine (in Nm) on non-diesel variants</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>Accelerator pedal position (percentage depressed)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>Current angle of the steering wheel (in deg)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>Emergency Call notification and confirmation data</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>The status of the air bags</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>Information related to an emergency event (and if it occurred)</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>The status modes of the cluster</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"<p>Information related to the MyKey feature</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>The status of the electronic parking brake</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"<p>The status of the turn signal</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>The cloud app vehicle ID</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>The stability controls status</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data item for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:externalTemperature:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:handsOffSteering:windowStatus:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:":{"name":"-initWithGps:speed:rpm:instantFuelConsumption:fuelRange:climateData:turnSignal:vin:gearStatus:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:engineOilLife:electronicParkBrakeStatus:cloudAppVehicleID:stabilityControlsStatus:eCallInfo:airbagStatus:emergencyEvent:clusterModeStatus:myKey:windowStatus:handsOffSteering:seatOccupancy:","abstract":"<p>Convenience init for getting data for all possible vehicle data items.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gearStatus":{"name":"gearStatus","abstract":"<p>See GearStatus</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gps":{"name":"gps","abstract":"<p>A boolean value. If true, requests GPS data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)speed":{"name":"speed","abstract":"<p>A boolean value. If true, requests Speed data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)rpm":{"name":"rpm","abstract":"<p>A boolean value. If true, requests RPM data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"<p>A boolean value. If true, requests Fuel Level data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"<p>A boolean value. If true, requests Fuel Level State data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"<p>A boolean value. If true, requests Fuel Range data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"<p>A boolean value. If true, requests Instant Fuel Consumption data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)climateData":{"name":"climateData","abstract":"<p>See ClimateData</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius. This parameter is deprecated starting RPC Spec 7.1, please see climateData.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)vin":{"name":"vin","abstract":"<p>A boolean value. If true, requests the Vehicle Identification Number.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)prndl":{"name":"prndl","abstract":"<p>See PRNDL. This parameter is deprecated and it is now covered in <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gearStatus\">gearStatus</a></code></p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"<p>A boolean value. If true, requests Tire Pressure data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)odometer":{"name":"odometer","abstract":"<p>A boolean value. If true, requests Odometer data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"<p>A boolean value. If true, requests Belt Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"<p>A boolean value. If true, requests Body Information data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"<p>A boolean value. If true, requests Device Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"<p>A boolean value. If true, requests Driver Braking data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)windowStatus":{"name":"windowStatus","abstract":"<p>See WindowStatus</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"<p>A boolean value. If true, requests Wiper Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)handsOffSteering":{"name":"handsOffSteering","abstract":"<p>To indicate whether driver hands are off the steering wheel</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"<p>A boolean value. If true, requests Head Lamp Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"<p>A boolean value. If true, requests Engine Oil Life data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"<p>A boolean value. If true, requests Engine Torque data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"<p>A boolean value. If true, requests Acc Pedal Position data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"<p>A boolean value. If true, requests Steering Wheel Angle data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"<p>A boolean value. If true, requests Emergency Call Info data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"<p>A boolean value. If true, requests Air Bag Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"<p>A boolean value. If true, requests Emergency Event (if it occurred) data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"<p>A boolean value. If true, requests Cluster Mode Status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)myKey":{"name":"myKey","abstract":"<p>A boolean value. If true, requests MyKey data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"<p>A boolean value. If true, requests Electronic Parking Brake status data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"<p>A boolean value. If true, requests Turn Signal data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"<p>A boolean value. If true, requests the Cloud App Vehicle ID.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)stabilityControlsStatus":{"name":"stabilityControlsStatus","abstract":"<p>A boolean value. If true, requests StabilityControlsStatus data.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)setOEMCustomVehicleData:withVehicleDataState:":{"name":"-setOEMCustomVehicleData:withVehicleDataState:","abstract":"<p>Sets the OEM custom vehicle data state for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)getOEMCustomVehicleData:":{"name":"-getOEMCustomVehicleData:","abstract":"<p>Gets the OEM custom vehicle data value for any given OEM custom vehicle data name.</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)seatOccupancy":{"name":"seatOccupancy","abstract":"<p>See SeatOccupancy</p>","parent_name":"SDLGetVehicleData"},"Classes/SDLGetSystemCapabilityResponse.html#/c:objc(cs)SDLGetSystemCapabilityResponse(py)systemCapability":{"name":"systemCapability","abstract":"<p>The requested system capability, of the type that was sent in the request</p>","parent_name":"SDLGetSystemCapabilityResponse"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:":{"name":"-initWithType:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:subscribe:":{"name":"-initWithType:subscribe:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"<p>The type of system capability to get more information on</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)subscribe":{"name":"subscribe","abstract":"<p>Flag to subscribe to updates of the supplied service capability type. If true, the requester will be subscribed. If false, the requester will not be subscribed and be removed as a subscriber if it was previously subscribed.</p>","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"<p>The requested data</p>","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)isSubscribed":{"name":"isSubscribed","abstract":"<p>It is a conditional-mandatory parameter: must be returned in case &ldquo;subscribe&rdquo; parameter was present in the related request.</p>","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleDataConsentResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataConsentResponse(py)allowed":{"name":"allowed","abstract":"<p>This array has the same size as &ldquo;moduleIds&rdquo; in the request; each element corresponding to one moduleId","parent_name":"SDLGetInteriorVehicleDataConsentResponse"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(im)initWithModuleType:moduleIds:":{"name":"-initWithModuleType:moduleIds:","abstract":"<p>Convenience init to get consent to control a module</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(py)moduleType":{"name":"moduleType","abstract":"<p>The module type that the app requests to control.</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleDataConsent.html#/c:objc(cs)SDLGetInteriorVehicleDataConsent(py)moduleIds":{"name":"moduleIds","abstract":"<p>Ids of a module of same type, published by System Capability.</p>","parent_name":"SDLGetInteriorVehicleDataConsent"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initWithModuleType:moduleId:":{"name":"-initWithModuleType:moduleId:","abstract":"<p>Convenience init to get information of a particular module type with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndSubscribeToModuleType:moduleId:":{"name":"-initAndSubscribeToModuleType:moduleId:","abstract":"<p>Convenience init to get information and subscribe to a particular module type with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndUnsubscribeToModuleType:moduleId:":{"name":"-initAndUnsubscribeToModuleType:moduleId:","abstract":"<p>Convenience init to unsubscribe from particular module with a module ID.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)moduleType":{"name":"moduleType","abstract":"<p>The type of a RC module to retrieve module data from the vehicle.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)subscribe":{"name":"subscribe","abstract":"<p>If subscribe is true, the head unit will register OnInteriorVehicleData notifications for the requested module (moduleId and moduleType).","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(im)initWithOffset:length:fileType:crc:":{"name":"-initWithOffset:length:fileType:crc:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)fileType":{"name":"fileType","abstract":"<p>File type that is being sent in response.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)crc":{"name":"crc","abstract":"<p>Additional CRC32 checksum to protect data integrity up to 512 Mbits.</p>","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:":{"name":"-initWithFileName:appServiceId:fileType:","abstract":"<p>Convenience init for sending a small file.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:offset:length:":{"name":"-initWithFileName:appServiceId:fileType:offset:length:","abstract":"<p>Convenience init for sending a large file in multiple data chunks.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileName":{"name":"fileName","abstract":"<p>File name that should be retrieved.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)appServiceId":{"name":"appServiceId","abstract":"<p>ID of the service that should have uploaded the requested file.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileType":{"name":"fileType","abstract":"<p>Selected file type.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)offset":{"name":"offset","abstract":"<p>Optional offset in bytes for resuming partial data chunks.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)length":{"name":"length","abstract":"<p>Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.</p>","parent_name":"SDLGetFile"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)ecuHeader":{"name":"ecuHeader","abstract":"<p>2 byte ECU Header for DTC response (as defined in VHR_Layout_Specification_DTCs.pdf)</p>","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)dtc":{"name":"dtc","abstract":"<p>Array of all reported DTCs on module (ecuHeader contains information if list is truncated). Each DTC is represented by 4 bytes (3 bytes of data and 1 byte status as defined in VHR_Layout_Specification_DTCs.pdf).</p>","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:":{"name":"-initWithECUName:","abstract":"<p>Convenience init</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:mask:":{"name":"-initWithECUName:mask:","abstract":"<p>Convenience init with all properties</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)ecuName":{"name":"ecuName","abstract":"<p>a name of the module to receive the DTC form","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)dtcMask":{"name":"dtcMask","abstract":"<p>DTC Mask Byte to be sent in diagnostic request to module. NSNumber* dtcMask Minvalue:0; Maxvalue:255</p>","parent_name":"SDLGetDTCs"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(py)properties":{"name":"properties","abstract":"<p>The requested cloud application properties.</p>","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(py)appID":{"name":"appID","abstract":"<p>The id of the cloud app.</p>","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(im)initWithAppServiceData:":{"name":"-initWithAppServiceData:","abstract":"<p>Convenience init.</p>","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(py)serviceData":{"name":"serviceData","abstract":"<p>Contains all the current data of the app service.</p>","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"<p>Convenience init for service type.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndSubscribeToAppServiceType:":{"name":"-initAndSubscribeToAppServiceType:","abstract":"<p>Convenience init for subscribing to a service type.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndUnsubscribeToAppServiceType:":{"name":"-initAndUnsubscribeToAppServiceType:","abstract":"<p>Convenience init for unsubscribing to a service type</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See <code>AppServiceType</code> for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)subscribe":{"name":"subscribe","abstract":"<p>If true, the consumer is requesting to subscribe to all future updates from the service publisher. If false, the consumer doesn&rsquo;t wish to subscribe and should be unsubscribed if it was previously subscribed.</p>","parent_name":"SDLGetAppServiceData"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(im)initWithUserSelectedGear:actualGear:transmissionType:":{"name":"-initWithUserSelectedGear:actualGear:transmissionType:","abstract":"<p>Convenience initializer to assign all object properties</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)userSelectedGear":{"name":"userSelectedGear","abstract":"<p>Gear position selected by the user i.e. Park, Drive, Reverse</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)actualGear":{"name":"actualGear","abstract":"<p>Actual Gear in use by the transmission</p>","parent_name":"SDLGearStatus"},"Classes/SDLGearStatus.html#/c:objc(cs)SDLGearStatus(py)transmissionType":{"name":"transmissionType","abstract":"<p>Tells the transmission type</p>","parent_name":"SDLGearStatus"},"Classes/SDLGateStatus.html#/c:objc(cs)SDLGateStatus(im)initWithLocation:status:":{"name":"-initWithLocation:status:","parent_name":"SDLGateStatus"},"Classes/SDLGateStatus.html#/c:objc(cs)SDLGateStatus(py)location":{"name":"location","abstract":"<p>The location of the gate on the vehicle grid</p>","parent_name":"SDLGateStatus"},"Classes/SDLGateStatus.html#/c:objc(cs)SDLGateStatus(py)status":{"name":"status","abstract":"<p>The status of the gate</p>","parent_name":"SDLGateStatus"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"<p>longitude degrees</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"<p>latitude degrees</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcYear":{"name":"utcYear","abstract":"<p>utc year</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMonth":{"name":"utcMonth","abstract":"<p>utc month</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcDay":{"name":"utcDay","abstract":"<p>utc day</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcHours":{"name":"utcHours","abstract":"<p>utc hours</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMinutes":{"name":"utcMinutes","abstract":"<p>utc minutes</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcSeconds":{"name":"utcSeconds","abstract":"<p>utc seconds</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)compassDirection":{"name":"compassDirection","abstract":"<p>Optional, Potential Compass Directions</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)pdop":{"name":"pdop","abstract":"<p>The 3D positional dilution of precision.</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)hdop":{"name":"hdop","abstract":"<p>The horizontal dilution of precision</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)vdop":{"name":"vdop","abstract":"<p>the vertical dilution of precision</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)actual":{"name":"actual","abstract":"<p>What the coordinates are based on</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)satellites":{"name":"satellites","abstract":"<p>The number of satellites in view</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)dimension":{"name":"dimension","abstract":"<p>The supported dimensions of the GPS</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)altitude":{"name":"altitude","abstract":"<p>Altitude in meters</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)heading":{"name":"heading","abstract":"<p>Heading based on the GPS data.</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)speed":{"name":"speed","abstract":"<p>Speed in KPH</p>","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)shifted":{"name":"shifted","abstract":"<p>True, if GPS lat/long, time, and altitude have been purposefully shifted (requires a proprietary algorithm to unshift).","parent_name":"SDLGPSData"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(cm)sharedInstance":{"name":"+sharedInstance","abstract":"<p>The shared object for pulling function id information</p>","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionNameForId:":{"name":"-functionNameForId:","abstract":"<p>Gets the function name for a given SDL RPC function ID</p>","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionIdForName:":{"name":"-functionIdForName:","abstract":"<p>Gets the function ID for a given SDL RPC function name</p>","parent_name":"SDLFunctionID"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(im)initWithType:range:level:levelState:capacity:capacityUnit:":{"name":"-initWithType:range:level:levelState:capacity:capacityUnit:","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)capacity":{"name":"capacity","abstract":"<p>The absolute capacity of this fuel type.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)capacityUnit":{"name":"capacityUnit","abstract":"<p>The unit of the capacity of this fuel type such as liters for gasoline or kWh for batteries.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)level":{"name":"level","abstract":"<p>The relative remaining capacity of this fuel type (percentage).</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)levelState":{"name":"levelState","abstract":"<p>The fuel level state.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)type":{"name":"type","abstract":"<p>The vehicle&rsquo;s fuel type</p>","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)range":{"name":"range","abstract":"<p>The estimate range in KM the vehicle can travel based on fuel level and consumption.</p>","parent_name":"SDLFuelRange"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)artworkRetryCount":{"name":"artworkRetryCount","abstract":"<p>Defines the number of times the file manager will attempt to reupload <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLArtwork.html\">SDLArtwork</a></code> files in the event of a failed upload to Core.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)fileRetryCount":{"name":"fileRetryCount","abstract":"<p>Defines the number of times the file manager will attempt to reupload general <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLFile.html\">SDLFile</a></code>s in the event of a failed upload to Core.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>Creates a default file manager configuration.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)init":{"name":"-init","abstract":"<p>Use <code>defaultConfiguration</code> instead</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)initWithArtworkRetryCount:fileRetryCount:":{"name":"-initWithArtworkRetryCount:fileRetryCount:","abstract":"<p>Creates a file manager configuration with customized upload retry counts.</p>","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)remoteFileNames":{"name":"remoteFileNames","abstract":"<p>A set of all names of files known on the remote head unit. Known files can be used or deleted on the remote system.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)bytesAvailable":{"name":"bytesAvailable","abstract":"<p>The number of bytes still available for files for this app.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)currentState":{"name":"currentState","abstract":"<p>The state of the file manager.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)pendingTransactions":{"name":"pendingTransactions","abstract":"<p>The currently pending transactions (Upload, Delete, and List Files) in the file manager</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)suspended":{"name":"suspended","abstract":"<p>Whether or not the file manager is suspended. If suspended, the file manager can continue to queue uploads and deletes, but will not actually perform any of those until it is no longer suspended. This can be used for throttling down the file manager if other, important operations are taking place over the accessory connection.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)init":{"name":"-init","abstract":"<p>Initialize the class&hellip;or not, since this method is unavailable. Dependencies must be injected using initWithConnectionManager:</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)initWithConnectionManager:configuration:":{"name":"-initWithConnectionManager:configuration:","abstract":"<p>Creates a new file manager with a specified connection manager and configuration</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"<p>The manager stars up and attempts to fetch its initial list and transfer initial files.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)stop":{"name":"-stop","abstract":"<p>Cancels all file manager operations and deletes all associated data.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)hasUploadedFile:":{"name":"-hasUploadedFile:","abstract":"<p>Check if the remote system contains a file</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFileWithName:completionHandler:":{"name":"-deleteRemoteFileWithName:completionHandler:","abstract":"<p>Delete a file stored on the remote system</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFilesWithNames:completionHandler:":{"name":"-deleteRemoteFilesWithNames:completionHandler:","abstract":"<p>Deletes an array of files on the remote file system. The files are deleted in the order in which they are added to the array, with the first file to be deleted at index 0. The delete queue is sequential, meaning that once a delete request is sent to Core, the queue waits until a response is received from Core before the next delete request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFile:completionHandler:":{"name":"-uploadFile:completionHandler:","abstract":"<p>Upload a file to the remote file system. If a file with the [SDLFile name] already exists, this will overwrite that file. If you do not want that to happen, check remoteFileNames before uploading, or change allowOverwrite to NO.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:progressHandler:completionHandler:":{"name":"-uploadFiles:progressHandler:completionHandler:","abstract":"<p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:completionHandler:":{"name":"-uploadFiles:completionHandler:","abstract":"<p>Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)fileNeedsUpload:":{"name":"-fileNeedsUpload:","abstract":"<p>Check if an SDLFile needs to be uploaded to Core or not. This method differs from hasUploadedFile() because it takes the <code>isStaticIcon</code> and <code>overwrite</code> properties into consideration.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtwork:completionHandler:":{"name":"-uploadArtwork:completionHandler:","abstract":"<p>Uploads an artwork file to the remote file system and returns the name of the uploaded artwork once completed. If an artwork with the same name is already on the remote system, the artwork is not uploaded and the artwork name is simply returned.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:completionHandler:":{"name":"-uploadArtworks:completionHandler:","abstract":"<p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:progressHandler:completionHandler:":{"name":"-uploadArtworks:progressHandler:completionHandler:","abstract":"<p>Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once an upload request is sent to Core, the queue waits until a response is received from Core before the next upload request is sent.</p>","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(cm)temporaryFileDirectory":{"name":"+temporaryFileDirectory","abstract":"<p>A URL to the directory where temporary files are stored. When an SDLFile is created with NSData, it writes to a temporary file until the file manager finishes uploading it.</p>","parent_name":"SDLFileManager"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)persistent":{"name":"persistent","abstract":"<p>Whether or not the file should persist on disk between car ignition cycles.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)overwrite":{"name":"overwrite","abstract":"<p>Whether or not the file should overwrite an existing file on the remote disk with the same name.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)name":{"name":"name","abstract":"<p>The name the file should be stored under on the remote disk. This is how the file will be referenced in all later calls.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileURL":{"name":"fileURL","abstract":"<p>The url the local file is stored at while waiting to push it to the remote system. If the data has not been passed to the file URL, this will be nil.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)data":{"name":"data","abstract":"<p>The binary data of the SDLFile. If initialized with data, this will be a relatively quick call, but if initialized with a file URL, this is a rather expensive call the first time. The data will be cached in RAM after the first call.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileSize":{"name":"fileSize","abstract":"<p>The size of the binary data of the SDLFile.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileType":{"name":"fileType","abstract":"<p>The system will attempt to determine the type of file that you have passed in. It will default to BINARY if it does not recognize the file type or the file type is not supported by SDL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)inputStream":{"name":"inputStream","abstract":"<p>A stream to pull binary data from a SDLFile. The stream only pulls required data from the file on disk or in memory. This reduces memory usage while uploading a large file to the remote system as each chunk of data can be released immediately after it is uploaded.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)isStaticIcon":{"name":"isStaticIcon","abstract":"<p>Describes whether or not this file is represented by static icon data. The head unit will present its representation of the static icon concept when sent this data.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)init":{"name":"-init","abstract":"<p>Initializer unavailable</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithFileURL:name:persistent:":{"name":"-initWithFileURL:name:persistent:","abstract":"<p>The designated initializer for an SDL File. The only major property that is not set using this is &ldquo;overwrite&rdquo;, which defaults to NO.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileAtFileURL:name:":{"name":"+persistentFileAtFileURL:name:","abstract":"<p>Create an SDL file using a local file URL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileAtFileURL:name:":{"name":"+fileAtFileURL:name:","abstract":"<p>Create an SDL file using a local file URL.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithData:name:fileExtension:persistent:":{"name":"-initWithData:name:fileExtension:persistent:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileWithData:name:fileExtension:":{"name":"+persistentFileWithData:name:fileExtension:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileWithData:name:fileExtension:":{"name":"+fileWithData:name:fileExtension:","abstract":"<p>Create an SDL file using raw data. It is strongly preferred to pass a file URL instead of data, as it is currently held in memory until the file is sent.</p>","parent_name":"SDLFile"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(im)initWithChannelId:channelSetting:":{"name":"-initWithChannelId:channelSetting:","abstract":"<p>Convenience init</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelName":{"name":"channelName","abstract":"<p>@abstract Read-only channel / frequency name","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelSetting":{"name":"channelSetting","abstract":"<p>@abstract Reflects the setting, from 0%-100%.</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelId":{"name":"channelId","abstract":"<p>@abstract id of the channel.</p>","parent_name":"SDLEqualizerSettings"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(py)securityManagers":{"name":"securityManagers","abstract":"<p>A set of security managers used to encrypt traffic data. Each OEM has their own proprietary security manager.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(py)delegate":{"name":"delegate","abstract":"<p>A delegate callback that will tell you when an acknowledgement has occurred for starting as secure service.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"<p>Creates a default encryption configuration.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncryptionConfiguration.html#/c:objc(cs)SDLEncryptionConfiguration(im)initWithSecurityManagers:delegate:":{"name":"-initWithSecurityManagers:delegate:","abstract":"<p>Creates a secure configuration for each of the security managers provided.</p>","parent_name":"SDLEncryptionConfiguration"},"Classes/SDLEncodedSyncPData.html#/c:objc(cs)SDLEncodedSyncPData(py)data":{"name":"data","abstract":"<p>Contains base64 encoded string of SyncP packets.</p>","parent_name":"SDLEncodedSyncPData"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)emergencyEventType":{"name":"emergencyEventType","abstract":"<p>References signal &ldquo;VedsEvntType_D_Ltchd&rdquo;. See EmergencyEventType.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)fuelCutoffStatus":{"name":"fuelCutoffStatus","abstract":"<p>References signal &ldquo;RCM_FuelCutoff&rdquo;. See FuelCutoffStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)rolloverEvent":{"name":"rolloverEvent","abstract":"<p>References signal &ldquo;VedsEvntRoll_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)maximumChangeVelocity":{"name":"maximumChangeVelocity","abstract":"<p>References signal &ldquo;VedsMaxDeltaV_D_Ltchd&rdquo;. Change in velocity in KPH.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)multipleEvents":{"name":"multipleEvents","abstract":"<p>References signal &ldquo;VedsMultiEvnt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLEmergencyEvent"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallNotificationStatus":{"name":"eCallNotificationStatus","abstract":"<p>References signal &ldquo;eCallNotification_4A&rdquo;. See VehicleDataNotificationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)auxECallNotificationStatus":{"name":"auxECallNotificationStatus","abstract":"<p>References signal &ldquo;eCallNotification&rdquo;. See VehicleDataNotificationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallConfirmationStatus":{"name":"eCallConfirmationStatus","abstract":"<p>References signal &ldquo;eCallConfirmation&rdquo;. See ECallConfirmationStatus.</p>","parent_name":"SDLECallInfo"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(im)initWithSupportedDynamicImageFieldNames:supportsDynamicSubMenus:":{"name":"-initWithSupportedDynamicImageFieldNames:supportsDynamicSubMenus:","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(py)supportedDynamicImageFieldNames":{"name":"supportedDynamicImageFieldNames","abstract":"<p>An array of ImageFieldName values for which the system supports sending OnFileUpdate notifications. If you send an Image struct for that image field with a name without having uploaded the image data using PutFile that matches that name, the system will request that you upload the data with PutFile at a later point when the HMI needs it. The HMI will then display the image in the appropriate field. If not sent, assume false.","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDynamicUpdateCapabilities.html#/c:objc(cs)SDLDynamicUpdateCapabilities(py)supportsDynamicSubMenus":{"name":"supportsDynamicSubMenus","abstract":"<p>If true, the head unit supports dynamic sub-menus by sending OnUpdateSubMenu notifications. If true, you should not send AddCommands that attach to a parentID for an AddSubMenu until OnUpdateSubMenu is received with the menuID. At that point, you should send all AddCommands with a parentID that match the menuID. If not set, assume false.</p>","parent_name":"SDLDynamicUpdateCapabilities"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(im)initWithMenuLength:subMenuDepth:":{"name":"-initWithMenuLength:subMenuDepth:","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(py)menuLength":{"name":"menuLength","abstract":"<p>The number of items allowed in a Choice Set or Command menu while the driver is distracted","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDriverDistractionCapability.html#/c:objc(cs)SDLDriverDistractionCapability(py)subMenuDepth":{"name":"subMenuDepth","abstract":"<p>The depth of submenus allowed when the driver is distracted. e.g. 3 == top level menu -&gt; submenu -&gt; submenu; 1 == top level menu only","parent_name":"SDLDriverDistractionCapability"},"Classes/SDLDoorStatus.html#/c:objc(cs)SDLDoorStatus(im)initWithLocation:status:":{"name":"-initWithLocation:status:","parent_name":"SDLDoorStatus"},"Classes/SDLDoorStatus.html#/c:objc(cs)SDLDoorStatus(py)location":{"name":"location","abstract":"<p>The location of the door on the vehicle grid</p>","parent_name":"SDLDoorStatus"},"Classes/SDLDoorStatus.html#/c:objc(cs)SDLDoorStatus(py)status":{"name":"status","abstract":"<p>The status of the door</p>","parent_name":"SDLDoorStatus"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(im)initWithDisplayName:":{"name":"-initWithDisplayName:","abstract":"<p>Init with required properties</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(im)initWithDisplayName:windowCapabilities:windowTypeSupported:":{"name":"-initWithDisplayName:windowCapabilities:windowTypeSupported:","abstract":"<p>Init with all the properties</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)displayName":{"name":"displayName","abstract":"<p>Name of the display.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)windowTypeSupported":{"name":"windowTypeSupported","abstract":"<p>Informs the application how many windows the app is allowed to create per type.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapability.html#/c:objc(cs)SDLDisplayCapability(py)windowCapabilities":{"name":"windowCapabilities","abstract":"<p>Contains a list of capabilities of all windows related to the app. Once the app has registered the capabilities of all windows will be provided, but GetSystemCapability still allows requesting window capabilities of all windows.</p>","parent_name":"SDLDisplayCapability"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayType":{"name":"displayType","abstract":"<p>The type of display</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayName":{"name":"displayName","abstract":"<p>The name of the connected display</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)textFields":{"name":"textFields","abstract":"<p>An array of SDLTextField structures, each of which describes a field in the HMI which the application can write to using operations such as <em>SDLShow</em>, <em>SDLSetMediaClockTimer</em>, etc.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)imageFields":{"name":"imageFields","abstract":"<p>An array of SDLImageField elements</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)mediaClockFormats":{"name":"mediaClockFormats","abstract":"<p>An array of SDLMediaClockFormat elements, defining the valid string formats used in specifying the contents of the media clock field</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)graphicSupported":{"name":"graphicSupported","abstract":"<p>The display&rsquo;s persistent screen supports.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)templatesAvailable":{"name":"templatesAvailable","abstract":"<p>An array of all predefined persistent display templates available on the head unit.</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)screenParams":{"name":"screenParams","abstract":"<p>A set of all parameters related to a prescribed screen area (e.g. for video / touch input)</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)numCustomPresetsAvailable":{"name":"numCustomPresetsAvailable","abstract":"<p>The number of on-screen custom presets available (if any); otherwise omitted</p>","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(im)initWithNumber:":{"name":"-initWithNumber:","abstract":"<p>Convenience init to initiate a dial number request</p>","parent_name":"SDLDialNumber"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(py)number":{"name":"number","abstract":"<p>Up to 40 character string representing the phone number. All characters stripped except for &lsquo;0&rsquo;-&lsquo;9&rsquo;, &lsquo;*&rsquo;, &lsquo;#&rsquo;, &lsquo;,&rsquo;, &lsquo;;&rsquo;, and &lsquo;+&rsquo;</p>","parent_name":"SDLDialNumber"},"Classes/SDLDiagnosticMessageResponse.html#/c:objc(cs)SDLDiagnosticMessageResponse(py)messageDataResult":{"name":"messageDataResult","abstract":"<p>Array of bytes comprising CAN message result.</p>","parent_name":"SDLDiagnosticMessageResponse"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(im)initWithTargetId:length:data:":{"name":"-initWithTargetId:length:data:","abstract":"<p>Convenience init</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)targetID":{"name":"targetID","abstract":"<p>Name of target ECU</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageLength":{"name":"messageLength","abstract":"<p>Length of message (in bytes)</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageData":{"name":"messageData","abstract":"<p>Array of bytes comprising CAN message.</p>","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)voiceRecOn":{"name":"voiceRecOn","abstract":"<p>Indicates whether the voice recognition is on or off</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)btIconOn":{"name":"btIconOn","abstract":"<p>Indicates whether the bluetooth connection established</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)callActive":{"name":"callActive","abstract":"<p>Indicates whether a call is being active</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)phoneRoaming":{"name":"phoneRoaming","abstract":"<p>Indicates whether the phone is in roaming mode</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)textMsgAvailable":{"name":"textMsgAvailable","abstract":"<p>Indicates whether a textmessage is available</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)battLevelStatus":{"name":"battLevelStatus","abstract":"<p>Battery level status</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)stereoAudioOutputMuted":{"name":"stereoAudioOutputMuted","abstract":"<p>The status of the stereo audio output channel</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)monoAudioOutputMuted":{"name":"monoAudioOutputMuted","abstract":"<p>The status of the mono audio output channel</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)signalLevelStatus":{"name":"signalLevelStatus","abstract":"<p>Signal level status</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)primaryAudioSource":{"name":"primaryAudioSource","abstract":"<p>The current primary audio source of SDL (if selected).</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)eCallEventActive":{"name":"eCallEventActive","abstract":"<p>Indicates if an emergency call is active</p>","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(cm)currentDevice":{"name":"+currentDevice","abstract":"<p>Convenience init. Object will contain all information about the connected device automatically.</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)hardware":{"name":"hardware","abstract":"<p>Device model</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)firmwareRev":{"name":"firmwareRev","abstract":"<p>Device firmware version</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)os":{"name":"os","abstract":"<p>Device OS</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)osVersion":{"name":"osVersion","abstract":"<p>Device OS version</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)carrier":{"name":"carrier","abstract":"<p>Device mobile carrier</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)maxNumberRFCOMMPorts":{"name":"maxNumberRFCOMMPorts","abstract":"<p>Number of bluetooth RFCOMM ports available.</p>","parent_name":"SDLDeviceInfo"},"Classes/SDLDeleteWindow.html#/c:objc(cs)SDLDeleteWindow(im)initWithId:":{"name":"-initWithId:","parent_name":"SDLDeleteWindow"},"Classes/SDLDeleteWindow.html#/c:objc(cs)SDLDeleteWindow(py)windowID":{"name":"windowID","abstract":"<p>A unique ID to identify the window.</p>","parent_name":"SDLDeleteWindow"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to delete a submenu</p>","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(py)menuID":{"name":"menuID","abstract":"<p>the MenuID that identifies the SDLSubMenu to be delete","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to delete a choice set</p>","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"<p>a unique ID that identifies the Choice Set","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteFileResponse.html#/c:objc(cs)SDLDeleteFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"<p>The remaining available space for your application to store data on the remote system.</p>","parent_name":"SDLDeleteFileResponse"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"<p>Convenience init to delete a file</p>","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(py)syncFileName":{"name":"syncFileName","abstract":"<p>a file reference name","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(im)initWithId:":{"name":"-initWithId:","abstract":"<p>Convenience init to remove a command from the menu</p>","parent_name":"SDLDeleteCommand"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(py)cmdID":{"name":"cmdID","abstract":"<p>the Command ID that identifies the Command to be deleted from Command Menu","parent_name":"SDLDeleteCommand"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:":{"name":"-initWithHour:minute:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:":{"name":"-initWithHour:minute:second:millisecond:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:","abstract":"<p>Convenience init for creating a date</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:","abstract":"<p>Convenience init for creating a date with all properties</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)millisecond":{"name":"millisecond","abstract":"<p>Milliseconds part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)second":{"name":"second","abstract":"<p>Seconds part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)minute":{"name":"minute","abstract":"<p>Minutes part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)hour":{"name":"hour","abstract":"<p>Hour part of time</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)day":{"name":"day","abstract":"<p>Day of the month</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)month":{"name":"month","abstract":"<p>Month of the year</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)year":{"name":"year","abstract":"<p>The year in YYYY format</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneMinuteOffset":{"name":"timezoneMinuteOffset","abstract":"<p>Time zone offset in Min with regard to UTC</p>","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneHourOffset":{"name":"timezoneHourOffset","abstract":"<p>Time zone offset in Hours with regard to UTC</p>","parent_name":"SDLDateTime"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)resultCode":{"name":"resultCode","abstract":"<p>Individual DID result code.</p>","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)didLocation":{"name":"didLocation","abstract":"<p>Location of raw data from vehicle data DID</p>","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)data":{"name":"data","abstract":"<p>Raw DID-based data returned for requested element.</p>","parent_name":"SDLDIDResult"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(im)initWithId:windowName:windowType:":{"name":"-initWithId:windowName:windowType:","abstract":"<p>Constructor with the required parameters</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(im)initWithId:windowName:windowType:associatedServiceType:duplicateUpdatesFromWindowID:":{"name":"-initWithId:windowName:windowType:associatedServiceType:duplicateUpdatesFromWindowID:","abstract":"<p>Convenience constructor with all the parameters.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)windowID":{"name":"windowID","abstract":"<p>A unique ID to identify the window.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)windowName":{"name":"windowName","abstract":"<p>The window name to be used by the HMI.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)type":{"name":"type","abstract":"<p>The type of the window to be created. Main window or widget.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)associatedServiceType":{"name":"associatedServiceType","abstract":"<p>Allows an app to create a widget related to a specific service type.","parent_name":"SDLCreateWindow"},"Classes/SDLCreateWindow.html#/c:objc(cs)SDLCreateWindow(py)duplicateUpdatesFromWindowID":{"name":"duplicateUpdatesFromWindowID","abstract":"<p>Optional parameter. Specify whether the content sent to an existing window should be duplicated to the created window. If there isn&rsquo;t a window with the ID, the request will be rejected with <code>INVALID_DATA</code>.</p>","parent_name":"SDLCreateWindow"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(im)initWithId:choiceSet:":{"name":"-initWithId:choiceSet:","abstract":"<p>Convenience init for creating a choice set RPC</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"<p>A unique ID that identifies the Choice Set</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)choiceSet":{"name":"choiceSet","abstract":"<p>Array of choices, which the user can select by menu or voice recognition</p>","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lifecycleConfig":{"name":"lifecycleConfig","abstract":"<p>The lifecycle configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lockScreenConfig":{"name":"lockScreenConfig","abstract":"<p>The lock screen configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)loggingConfig":{"name":"loggingConfig","abstract":"<p>The log configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)streamingMediaConfig":{"name":"streamingMediaConfig","abstract":"<p>The streaming media configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)fileManagerConfig":{"name":"fileManagerConfig","abstract":"<p>The file manager configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)encryptionConfig":{"name":"encryptionConfig","abstract":"<p>The encryption configuration.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:fileManager:encryption:":{"name":"-initWithLifecycle:lockScreen:logging:fileManager:encryption:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, file manager and encryption configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:encryption:","abstract":"<p>Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media, file manager and encryption configurations.</p>","parent_name":"SDLConfiguration"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeActive":{"name":"powerModeActive","abstract":"<p>References signal &ldquo;PowerMode_UB&rdquo;.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeQualificationStatus":{"name":"powerModeQualificationStatus","abstract":"<p>References signal &ldquo;PowerModeQF&rdquo;. See PowerModeQualificationStatus.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)carModeStatus":{"name":"carModeStatus","abstract":"<p>References signal &ldquo;CarMode&rdquo;. See CarMode.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeStatus":{"name":"powerModeStatus","abstract":"<p>References signal &ldquo;PowerMode&rdquo;. See PowerMode.</p>","parent_name":"SDLClusterModeStatus"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:":{"name":"-initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)nicknames":{"name":"nicknames","abstract":"<p>An array of app names a cloud app is allowed to register with. If included in a <code>SetCloudAppProperties</code> request, this value will overwrite the existing &ldquo;nicknames&rdquo; field in the app policies section of the policy table.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)appID":{"name":"appID","abstract":"<p>The id of the cloud app.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)enabled":{"name":"enabled","abstract":"<p>If true, the cloud app will appear in the HMI&rsquo;s app list; if false, the cloud app will not appear in the HMI&rsquo;s app list.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)authToken":{"name":"authToken","abstract":"<p>Used to authenticate websocket connection on app activation.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)cloudTransportType":{"name":"cloudTransportType","abstract":"<p>Specifies the connection type Core should use. Currently the ones that work in SDL Core are <code>WS</code> or <code>WSS</code>, but an OEM can implement their own transport adapter to handle different values.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)hybridAppPreference":{"name":"hybridAppPreference","abstract":"<p>Specifies the user preference to use the cloud app version or mobile app version when both are available.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)endpoint":{"name":"endpoint","abstract":"<p>The websocket endpoint.</p>","parent_name":"SDLCloudAppProperties"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(im)initWithExternalTemperature:cabinTemperature:atmosphericPressure:":{"name":"-initWithExternalTemperature:cabinTemperature:atmosphericPressure:","parent_name":"SDLClimateData"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(py)externalTemperature":{"name":"externalTemperature","abstract":"<p>The external temperature in degrees celsius</p>","parent_name":"SDLClimateData"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(py)cabinTemperature":{"name":"cabinTemperature","abstract":"<p>Internal ambient cabin temperature in degrees celsius</p>","parent_name":"SDLClimateData"},"Classes/SDLClimateData.html#/c:objc(cs)SDLClimateData(py)atmosphericPressure":{"name":"atmosphericPressure","abstract":"<p>Current atmospheric pressure in mBar","parent_name":"SDLClimateData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(im)initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:climateEnable:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:climateEnable:","abstract":"<p>Convenience init for climate control data with all properties.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)fanSpeed":{"name":"fanSpeed","abstract":"<p>Speed of Fan in integer</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)currentTemperature":{"name":"currentTemperature","abstract":"<p>The Current Temperature in SDLTemperature</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)desiredTemperature":{"name":"desiredTemperature","abstract":"<p>Desired Temperature in SDLTemperature</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acEnable":{"name":"acEnable","abstract":"<p>Represents if AC is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)circulateAirEnable":{"name":"circulateAirEnable","abstract":"<p>Represents if circulation of air is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)autoModeEnable":{"name":"autoModeEnable","abstract":"<p>Represents if auto mode is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)defrostZone":{"name":"defrostZone","abstract":"<p>Represents the kind of defrost zone.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)dualModeEnable":{"name":"dualModeEnable","abstract":"<p>Represents if dual mode is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acMaxEnable":{"name":"acMaxEnable","abstract":"<p>Represents if ac max is enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)ventilationMode":{"name":"ventilationMode","abstract":"<p>Represents the kind of Ventilation zone.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedSteeringWheelEnable":{"name":"heatedSteeringWheelEnable","abstract":"<p>@abstract value false means disabled/turn off, value true means enabled/turn on.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedWindshieldEnable":{"name":"heatedWindshieldEnable","abstract":"<p>@abstract value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedRearWindowEnable":{"name":"heatedRearWindowEnable","abstract":"<p>@abstract value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedMirrorsEnable":{"name":"heatedMirrorsEnable","abstract":"<p>@abstract Value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)climateEnable":{"name":"climateEnable","abstract":"<p>@abstract Value false means disabled, value true means enabled.</p>","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:moduleInfo:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:":{"name":"-initWithModuleName:moduleInfo:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:climateEnableAvailable:","abstract":"<p>Convenience init to describe the climate control capabilities with all properties.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)moduleName":{"name":"moduleName","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)fanSpeedAvailable":{"name":"fanSpeedAvailable","abstract":"<p>Availability of the control of fan speed.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)desiredTemperatureAvailable":{"name":"desiredTemperatureAvailable","abstract":"<p>Availability of the control of desired temperature.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acEnableAvailable":{"name":"acEnableAvailable","abstract":"<p>Availability of the control of turn on/off AC.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acMaxEnableAvailable":{"name":"acMaxEnableAvailable","abstract":"<p>Availability of the control of enable/disable air conditioning is ON on the maximum level.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)circulateAirEnableAvailable":{"name":"circulateAirEnableAvailable","abstract":"<p>Availability of the control of enable/disable circulate Air mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)autoModeEnableAvailable":{"name":"autoModeEnableAvailable","abstract":"<p>Availability of the control of enable/disable auto mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)dualModeEnableAvailable":{"name":"dualModeEnableAvailable","abstract":"<p>Availability of the control of enable/disable dual mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZoneAvailable":{"name":"defrostZoneAvailable","abstract":"<p>Availability of the control of defrost zones.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZone":{"name":"defrostZone","abstract":"<p>A set of all defrost zones that are controllable.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationModeAvailable":{"name":"ventilationModeAvailable","abstract":"<p>Availability of the control of air ventilation mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationMode":{"name":"ventilationMode","abstract":"<p>A set of all ventilation modes that are controllable.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedSteeringWheelAvailable":{"name":"heatedSteeringWheelAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Steering Wheel.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedWindshieldAvailable":{"name":"heatedWindshieldAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Windshield.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedRearWindowAvailable":{"name":"heatedRearWindowAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Rear Window.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedMirrorsAvailable":{"name":"heatedMirrorsAvailable","abstract":"<p>@abstract Availability of the control (enable/disable) of heated Mirrors.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)climateEnableAvailable":{"name":"climateEnableAvailable","abstract":"<p>@abstract Availability of the control of enable/disable climate control.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout":{"name":"defaultTimeout","abstract":"<p>Set this to change the default timeout for all choice sets. If a timeout is not set on an individual choice set object (or if it is set to 0.0), then it will use this timeout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout\">timeout</a></code> for more details. If this is not set by you, it will default to 10 seconds. The minimum is 5 seconds, the maximum is 100 seconds. If this is set below the minimum, it will be capped at 5 seconds. If this is set above the maximum, it will be capped at 100 seconds.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultLayout":{"name":"defaultLayout","abstract":"<p>Set this to change the default layout for all choice sets. If a layout is not set on an individual choice set object, then it will use this layout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)layout\">layout</a></code> for more details. If this is not set by you, it will default to <code>SDLChoiceSetLayoutList</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)title":{"name":"title","abstract":"<p>Maps to PerformInteraction.initialText. The title of the choice set, and/or the initial text on a keyboard prompt.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)initialPrompt":{"name":"initialPrompt","abstract":"<p>Maps to PerformInteraction.initialPrompt. The initial prompt spoken to the user at the start of an interaction.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)layout":{"name":"layout","abstract":"<p>Maps to PerformInteraction.interactionLayout. Whether the presented choices are arranged as a set of tiles or a list.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout":{"name":"timeout","abstract":"<p>Maps to PerformInteraction.timeout. Timeout in seconds. Defaults to 0, which will use <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout\">defaultTimeout</a></code>. If this is set below the minimum, it will be capped at 5 seconds. Minimum 5 seconds, maximum 100 seconds. If this is set above the maximum, it will be capped at 100 seconds. Defaults to 0.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"<p>Maps to PerformInteraction.timeoutPrompt. This text is spoken when a VR interaction times out. If this set is presented in a manual (non-voice) only interaction, this will be ignored.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpPrompt":{"name":"helpPrompt","abstract":"<p>Maps to PerformInteraction.helpPrompt. This is the spoken string when a user speaks &ldquo;help&rdquo; when the interaction is occurring.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpList":{"name":"helpList","abstract":"<p>Maps to PerformInteraction.vrHelp. This is a list of help text presented to the user when they are in a voice recognition interaction from your choice set of options. If this set is presented in a touch only interaction, this will be ignored.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)delegate":{"name":"delegate","abstract":"<p>The delegate of this choice set, called when the user interacts with it.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)choices":{"name":"choices","abstract":"<p>The choices to be displayed to the user within this choice set. These choices could match those already preloaded via <code>SDLScreenManager preloadChoices:withCompletionHandler:</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)init":{"name":"-init","abstract":"<p>Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be <code>nil</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:choices:":{"name":"-initWithTitle:delegate:choices:","abstract":"<p>Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be <code>nil</code>.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:","abstract":"<p>Initializer with all possible properties.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:","abstract":"<p>Initializer with all possible properties.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)cancel":{"name":"-cancel","abstract":"<p>Cancels the choice set. If the choice set has not yet been sent to Core, it will not be sent. If the choice set is already presented on Core, the choice set will be immediately dismissed. Canceling an already presented choice set will only work if connected to Core versions 6.0+. On older versions of Core, the choice set will not be dismissed.</p>","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)text":{"name":"text","abstract":"<p>Maps to Choice.menuName. The primary text of the cell. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are not permitted and will result in the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> failing to initialize.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryText":{"name":"secondaryText","abstract":"<p>Maps to Choice.secondaryText. Optional secondary text of the cell, if available. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are permitted.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Maps to Choice.tertiaryText. Optional tertitary text of the cell, if available. Duplicates within an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceSet.html\">SDLChoiceSet</a></code> are permitted.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)voiceCommands":{"name":"voiceCommands","abstract":"<p>Maps to Choice.vrCommands. Optional voice commands the user can speak to activate the cell. If not set and the head unit requires it, this will be set to the number in the list that this item appears. However, this would be a very poor experience for a user if the choice set is presented as a voice only interaction or both interaction mode. Therefore, consider not setting this only when you know the choice set will be presented as a touch only interaction.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)artwork":{"name":"artwork","abstract":"<p>Maps to Choice.image. Optional image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryArtwork":{"name":"secondaryArtwork","abstract":"<p>Maps to Choice.secondaryImage. Optional secondary image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)uniqueText":{"name":"uniqueText","abstract":"<p>Primary text of the cell to be displayed on the module. Used to distinguish cells with the same <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)text\">text</a></code> but other fields are different. This is autogenerated by the screen manager. Attempting to use cells that are exactly the same (all text and artwork fields are the same) will not cause this to be used. This will not be used when connected to modules supporting RPC 7.1+.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)init":{"name":"-init","abstract":"<p>Initialize the cell with nothing. This is unavailable</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:":{"name":"-initWithText:","abstract":"<p>Initialize the cell with text and nothing else.</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:artwork:voiceCommands:":{"name":"-initWithText:artwork:voiceCommands:","abstract":"<p>Initialize the cell with text, optional artwork, and optional voice commands</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:":{"name":"-initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:","abstract":"<p>Initialize the cell with all optional items</p>","parent_name":"SDLChoiceCell"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:":{"name":"-initWithId:menuName:vrCommands:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with the required parameters</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:":{"name":"-initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with all parameters</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)choiceID":{"name":"choiceID","abstract":"<p>The application-scoped identifier that uniquely identifies this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)menuName":{"name":"menuName","abstract":"<p>Text which appears in menu, representing this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)vrCommands":{"name":"vrCommands","abstract":"<p>VR synonyms for this choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)image":{"name":"image","abstract":"<p>The image of the choice</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryText":{"name":"secondaryText","abstract":"<p>Secondary text to display; e.g. address of POI in a search result entry</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Tertiary text to display; e.g. distance to POI for a search result entry</p>","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryImage":{"name":"secondaryImage","abstract":"<p>Secondary image for choice</p>","parent_name":"SDLChoice"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:":{"name":"-initWithLanguage:hmiDisplayLanguage:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with required parameters</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:":{"name":"-initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:","abstract":"<p>Constructs a newly allocated SDLChangeRegistration object with all parameters</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)language":{"name":"language","abstract":"<p>The language the app wants to change to</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"<p>HMI display language</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)appName":{"name":"appName","abstract":"<p>Request a new app name registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ttsName":{"name":"ttsName","abstract":"<p>Request a new TTSName registration.</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"<p>Request a new app short name registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)vrSynonyms":{"name":"vrSynonyms","abstract":"<p>Request a new VR synonyms registration</p>","parent_name":"SDLChangeRegistration"},"Classes/SDLCarWindowViewController.html#/c:objc(cs)SDLCarWindowViewController(py)supportedOrientation":{"name":"supportedOrientation","abstract":"<p>The supported interface orientation you wish to use. Defaults to MaskPortrait.</p>","parent_name":"SDLCarWindowViewController"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithFunctionID:":{"name":"-initWithFunctionID:","abstract":"<p>Convenience init for dismissing the currently presented modal view (either an alert, slider, scrollable message, or perform interaction).</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithFunctionID:cancelID:":{"name":"-initWithFunctionID:cancelID:","abstract":"<p>Convenience init for dismissing a specific view.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithAlertCancelID:":{"name":"-initWithAlertCancelID:","abstract":"<p>Convenience init for dismissing an alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithSliderCancelID:":{"name":"-initWithSliderCancelID:","abstract":"<p>Convenience init for dismissing a slider.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithScrollableMessageCancelID:":{"name":"-initWithScrollableMessageCancelID:","abstract":"<p>Convenience init for dismissing a scrollable message.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithPerformInteractionCancelID:":{"name":"-initWithPerformInteractionCancelID:","abstract":"<p>Convenience init for dismissing a perform interaction.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(im)initWithSubtleAlertCancelID:":{"name":"-initWithSubtleAlertCancelID:","abstract":"<p>Convenience init for dismissing a subtle alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)alert":{"name":"+alert","abstract":"<p>Convenience init for dismissing the currently presented alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)slider":{"name":"+slider","abstract":"<p>Convenience init for dismissing the currently presented slider.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)scrollableMessage":{"name":"+scrollableMessage","abstract":"<p>Convenience init for dismissing the currently presented scrollable message.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)performInteraction":{"name":"+performInteraction","abstract":"<p>Convenience init for dismissing the currently presented perform interaction.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(cm)subtleAlert":{"name":"+subtleAlert","abstract":"<p>Convenience init for dismissing the currently presented subtle alert.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(py)cancelID":{"name":"cancelID","abstract":"<p>The ID of the specific interaction to dismiss. If not set, the most recent of the RPC type set in functionID will be dismissed.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLCancelInteraction.html#/c:objc(cs)SDLCancelInteraction(py)functionID":{"name":"functionID","abstract":"<p>The ID of the type of interaction to dismiss.</p>","parent_name":"SDLCancelInteraction"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(im)initWithButtonName:moduleType:moduleId:buttonPressMode:":{"name":"-initWithButtonName:moduleType:moduleId:buttonPressMode:","abstract":"<p>Constructs a newly allocated SDLButtonPress object with the given parameters</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)moduleType":{"name":"moduleType","abstract":"<p>The module where the button should be pressed.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)moduleId":{"name":"moduleId","abstract":"<p>Id of a module, published by System Capability.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonName":{"name":"buttonName","abstract":"<p>The name of supported RC climate or radio button.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"<p>Indicates whether this is a LONG or SHORT button press event.</p>","parent_name":"SDLButtonPress"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)name":{"name":"name","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"<p>A NSNumber value indicates whether the button supports a SHORT press</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"<p>A NSNumber value indicates whether the button supports a LONG press</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"<p>A NSNumber value indicates whether the button supports &ldquo;button down&rdquo; and &ldquo;button up&rdquo;</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLButtonCapabilities"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(im)initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:":{"name":"-initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(im)initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:doorStatuses:gateStatuses:roofStatuses:":{"name":"-initWithParkBrakeActive:ignitionStableStatus:ignitionStatus:doorStatuses:gateStatuses:roofStatuses:","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)parkBrakeActive":{"name":"parkBrakeActive","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStableStatus":{"name":"ignitionStableStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStatus":{"name":"ignitionStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)driverDoorAjar":{"name":"driverDoorAjar","abstract":"<p>References signal &ldquo;DrStatDrv_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)passengerDoorAjar":{"name":"passengerDoorAjar","abstract":"<p>References signal &ldquo;DrStatPsngr_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearLeftDoorAjar":{"name":"rearLeftDoorAjar","abstract":"<p>References signal &ldquo;DrStatRl_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearRightDoorAjar":{"name":"rearRightDoorAjar","abstract":"<p>References signal &ldquo;DrStatRr_B_Actl&rdquo;. Deprecated starting with RPC Spec 7.1.0.</p>","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)doorStatuses":{"name":"doorStatuses","abstract":"<p>Provides status for doors if Ajar/Closed/Locked","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)gateStatuses":{"name":"gateStatuses","abstract":"<p>Provides status for trunk/hood/etc. if Ajar/Closed/Locked","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)roofStatuses":{"name":"roofStatuses","abstract":"<p>Provides status for roof/convertible roof/sunroof/moonroof etc., if Closed/Ajar/Removed etc.","parent_name":"SDLBodyInformation"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBeltDeployed":{"name":"driverBeltDeployed","abstract":"<p>References signal &ldquo;VedsDrvBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBeltDeployed":{"name":"passengerBeltDeployed","abstract":"<p>References signal &ldquo;VedsPasBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBuckleBelted":{"name":"passengerBuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1PasBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBuckleBelted":{"name":"driverBuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1DrvBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow2BuckleBelted":{"name":"leftRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2lBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerChildDetected":{"name":"passengerChildDetected","abstract":"<p>References signal &ldquo;VedsRw1PasChld_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow2BuckleBelted":{"name":"rightRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2rBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow2BuckleBelted":{"name":"middleRow2BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw2mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow3BuckleBelted":{"name":"middleRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow3BuckleBelted":{"name":"leftRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3lBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow3BuckleBelted":{"name":"rightRow3BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw3rBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRearInflatableBelted":{"name":"leftRearInflatableBelted","abstract":"<p>References signal &ldquo;VedsRw2lRib_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRearInflatableBelted":{"name":"rightRearInflatableBelted","abstract":"<p>References signal &ldquo;VedsRw2rRib_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BeltDeployed":{"name":"middleRow1BeltDeployed","abstract":"<p>References signal &ldquo;VedsRw1mBelt_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BuckleBelted":{"name":"middleRow1BuckleBelted","abstract":"<p>References signal &ldquo;VedsRw1mBckl_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLBeltStatus"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)delegate":{"name":"delegate","abstract":"<p>The delegate describing when files are done playing or any errors that occur</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)playing":{"name":"playing","abstract":"<p>Whether or not we are currently playing audio</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)queue":{"name":"queue","abstract":"<p>The queue of audio files that will be played in sequence</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)init":{"name":"-init","abstract":"<p>Init should only occur with dependencies. use <code>initWithManager:</code></p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)initWithManager:":{"name":"-initWithManager:","abstract":"<p>Create an audio stream manager with a reference to the parent stream manager.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithFileURL:":{"name":"-pushWithFileURL:","abstract":"<p>Push a new file URL onto the queue after converting it into the correct PCM format for streaming binary data. Call <code>playNextWhenReady</code> to start playing the next completed pushed file.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithData:":{"name":"-pushWithData:","abstract":"<p>Push a new audio buffer onto the queue. Call <code>playNextWhenReady</code> to start playing the pushed audio buffer.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)playNextWhenReady":{"name":"-playNextWhenReady","abstract":"<p>Play the next item in the queue. If an item is currently playing, it will continue playing and this item will begin playing after it is completed.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)stop":{"name":"-stop","abstract":"<p>Stop playing the queue after the current item completes and clear the queue. If nothing is playing, the queue will be cleared.</p>","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)samplingRate":{"name":"samplingRate","abstract":"<p>The sampling rate for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)bitsPerSample":{"name":"bitsPerSample","abstract":"<p>The sample depth in bit for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)audioType":{"name":"audioType","abstract":"<p>The audiotype for AudioPassThru</p>","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)inputFileURL":{"name":"inputFileURL","abstract":"<p>If initialized with a file URL, the file URL it came from</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)outputFileURL":{"name":"outputFileURL","abstract":"<p>If initialized with a file URL, where the transcoder should produce the transcoded PCM audio file</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)estimatedDuration":{"name":"estimatedDuration","abstract":"<p>In seconds. UINT32_MAX if unknown.</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)data":{"name":"data","abstract":"<p>The PCM audio data to be transferred and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)fileSize":{"name":"fileSize","abstract":"<p>The size of the PCM audio data in bytes</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(im)initWithInputFileURL:outputFileURL:estimatedDuration:":{"name":"-initWithInputFileURL:outputFileURL:estimatedDuration:","abstract":"<p>Initialize an audio file to be queued and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(im)initWithData:":{"name":"-initWithData:","abstract":"<p>Initialize a buffer of PCM audio data to be queued and played</p>","parent_name":"SDLAudioFile"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(py)audioData":{"name":"audioData","abstract":"<p>The text-to-speech prompts that will used and/or audio files that will be played. The audio prompts and files will be played in the same order they are added.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)initWithAudioFile:":{"name":"-initWithAudioFile:","abstract":"<p>Initialize with an SDLFile holding data or pointing to a file on the file system. When this object is passed to an <code>Alert</code> or <code>Speak</code>, the file will be uploaded if it is not already, then played if the system supports that feature.","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)initWithSpeechSynthesizerString:":{"name":"-initWithSpeechSynthesizerString:","abstract":"<p>Initialize with a string to be spoken by the system speech synthesizer.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)initWithPhoneticSpeechSynthesizerString:phoneticType:":{"name":"-initWithPhoneticSpeechSynthesizerString:phoneticType:","abstract":"<p>Initialize with a string to be spoken by the system speech synthesizer using a phonetic string.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)init":{"name":"-init","abstract":"<p>Use another init method instead.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)addAudioFiles:":{"name":"-addAudioFiles:","abstract":"<p>Add additional SDLFiles holding data or pointing to a file on the file system. When this object is passed to an <code>Alert</code> or <code>Speak</code>, the file will be uploaded if it is not already, then played if the system supports that feature.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)addSpeechSynthesizerStrings:":{"name":"-addSpeechSynthesizerStrings:","abstract":"<p>Create additional strings to be spoken by the system speech synthesizer.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioData.html#/c:objc(cs)SDLAudioData(im)addPhoneticSpeechSynthesizerStrings:phoneticType:":{"name":"-addPhoneticSpeechSynthesizerStrings:phoneticType:","abstract":"<p>Create additional strings to be spoken by the system speech synthesizer using a phonetic string.</p>","parent_name":"SDLAudioData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(im)initWithSource:keepContext:volume:equalizerSettings:":{"name":"-initWithSource:keepContext:volume:equalizerSettings:","abstract":"<p>Constructs a newly allocated SDLAudioControlData object with given parameters</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)source":{"name":"source","abstract":"<p>@abstract In a getter response or a notification,","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)keepContext":{"name":"keepContext","abstract":"<p>@abstract This parameter shall not be present in any getter responses or notifications.","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)volume":{"name":"volume","abstract":"<p>@abstract Reflects the volume of audio, from 0%-100%.</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)equalizerSettings":{"name":"equalizerSettings","abstract":"<p>@abstract Defines the list of supported channels (band) and their current/desired settings on HMI</p>","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:moduleInfo:":{"name":"-initWithModuleName:moduleInfo:","abstract":"<p>Constructs a newly allocated SDLAudioControlCapabilities object with audio control module name (max 100 chars)</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:moduleInfo:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:":{"name":"-initWithModuleName:moduleInfo:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:","abstract":"<p>Constructs a newly allocated SDLAudioControlCapabilities object with given parameters</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"<p>@abstract The short friendly name of the audio control module.","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)sourceAvailable":{"name":"sourceAvailable","abstract":"<p>@abstract Availability of the control of audio source.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)keepContextAvailable":{"name":"keepContextAvailable","abstract":"<p>Availability of the keepContext parameter.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)volumeAvailable":{"name":"volumeAvailable","abstract":"<p>@abstract Availability of the control of audio volume.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerAvailable":{"name":"equalizerAvailable","abstract":"<p>@abstract Availability of the control of Equalizer Settings.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerMaxChannelId":{"name":"equalizerMaxChannelId","abstract":"<p>@abstract Must be included if equalizerAvailable=true,","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)moduleInfo":{"name":"moduleInfo","abstract":"<p>Information about a RC module, including its id.</p>","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)isTemplate":{"name":"isTemplate","abstract":"<p>Describes whether or not the image is a template that can be (re)colored by the SDL HMI. To make the artwork a template, set the <code>UIImage</code>s rendering mode to <code>UIImageRenderingModeAlwaysTemplate</code>. In order for templates to work successfully, the icon must be one solid color with a clear background. The artwork should be created using the PNG image format.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)imageRPC":{"name":"imageRPC","abstract":"<p>The Image RPC representing this artwork. Generally for use internally, you should instead pass an artwork to a Screen Manager method.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:name:asImageFormat:":{"name":"+artworkWithImage:name:asImageFormat:","abstract":"<p>Convenience helper to create an ephemeral artwork from an image.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:asImageFormat:":{"name":"+artworkWithImage:asImageFormat:","abstract":"<p>Convenience helper to create an ephemeral artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithStaticIcon:":{"name":"+artworkWithStaticIcon:","abstract":"<p>Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:name:asImageFormat:":{"name":"+persistentArtworkWithImage:name:asImageFormat:","abstract":"<p>Convenience helper to create a persistent artwork from an image.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:asImageFormat:":{"name":"+persistentArtworkWithImage:asImageFormat:","abstract":"<p>Convenience helper to create a persistent artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:name:persistent:asImageFormat:":{"name":"-initWithImage:name:persistent:asImageFormat:","abstract":"<p>Create a file for transmission to the remote system from a UIImage.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:persistent:asImageFormat:":{"name":"-initWithImage:persistent:asImageFormat:","abstract":"<p>Create a file for transmission to the remote system from a UIImage. A unique name will be assigned to the image. This name is a string representation of the image&rsquo;s data which is created by hashing the data using the MD5 algorithm.</p>","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithStaticIcon:":{"name":"-initWithStaticIcon:","abstract":"<p>Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.</p>","parent_name":"SDLArtwork"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(im)initWithAppServices:":{"name":"-initWithAppServices:","abstract":"<p>Convenience init.</p>","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(py)appServices":{"name":"appServices","abstract":"<p>An array of currently available services. If this is an update to the capability the affected services will include an update reason in that item.</p>","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(im)initWithServiceID:serviceManifest:servicePublished:serviceActive:":{"name":"-initWithServiceID:serviceManifest:servicePublished:serviceActive:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceID":{"name":"serviceID","abstract":"<p>A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceManifest":{"name":"serviceManifest","abstract":"<p>Manifest for the service that this record is for.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)servicePublished":{"name":"servicePublished","abstract":"<p>If true, the service is published and available. If false, the service has likely just been unpublished, and should be considered unavailable.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceActive":{"name":"serviceActive","abstract":"<p>If true, the service is the active primary service of the supplied service type. It will receive all potential RPCs that are passed through to that service type. If false, it is not the primary service of the supplied type. See servicePublished for its availability.</p>","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"<p>Convenience init for serviceType.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithMediaServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:":{"name":"-initWithMediaServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:","abstract":"<p>Convenience init for a media service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithWeatherServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:weatherServiceManifest:":{"name":"-initWithWeatherServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:weatherServiceManifest:","abstract":"<p>Convenience init for a weather service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithNavigationServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:navigationServiceManifest:":{"name":"-initWithNavigationServiceName:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:navigationServiceManifest:","abstract":"<p>Convenience init for a navigation service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithServiceName:serviceType:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:":{"name":"-initWithServiceName:serviceType:serviceIcon:allowAppConsumers:maxRPCSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceName":{"name":"serviceName","abstract":"<p>Unique name of this service.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See AppServiceType for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceIcon":{"name":"serviceIcon","abstract":"<p>The file name of the icon to be associated with this service. Most likely the same as the appIcon.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)allowAppConsumers":{"name":"allowAppConsumers","abstract":"<p>If true, app service consumers beyond the IVI system will be able to access this service. If false, only the IVI system will be able consume the service. If not provided, it is assumed to be false.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)maxRPCSpecVersion":{"name":"maxRPCSpecVersion","abstract":"<p>This is the max RPC Spec version the app service understands. This is important during the RPC passthrough functionality. If not included, it is assumed the max version of the module is acceptable.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)handledRPCs":{"name":"handledRPCs","abstract":"<p>This field contains the Function IDs for the RPCs that this service intends to handle correctly. This means the service will provide meaningful responses. See FunctionID for enum equivalent values. This parameter is an integer to allow for new function IDs to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)mediaServiceManifest":{"name":"mediaServiceManifest","abstract":"<p>A media service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)weatherServiceManifest":{"name":"weatherServiceManifest","abstract":"<p>A weather service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)navigationServiceManifest":{"name":"navigationServiceManifest","abstract":"<p>A navigation service manifest.</p>","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:":{"name":"-initWithAppServiceType:serviceId:","abstract":"<p>Convenience init for service type and service id.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithMediaServiceData:serviceId:":{"name":"-initWithMediaServiceData:serviceId:","abstract":"<p>Convenience init for media service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithWeatherServiceData:serviceId:":{"name":"-initWithWeatherServiceData:serviceId:","abstract":"<p>Convenience init for weather service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithNavigationServiceData:serviceId:":{"name":"-initWithNavigationServiceData:serviceId:","abstract":"<p>Convenience init for navigation service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:":{"name":"-initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceType":{"name":"serviceType","abstract":"<p>The type of service that is to be offered by this app. See <code>AppServiceType</code> for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceId":{"name":"serviceId","abstract":"<p>A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)mediaServiceData":{"name":"mediaServiceData","abstract":"<p>The media service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)weatherServiceData":{"name":"weatherServiceData","abstract":"<p>The weather service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)navigationServiceData":{"name":"navigationServiceData","abstract":"<p>The navigation service data.</p>","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdatedAppServiceRecord:":{"name":"-initWithUpdatedAppServiceRecord:","abstract":"<p>Convenience init for required parameters.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdateReason:updatedAppServiceRecord:":{"name":"-initWithUpdateReason:updatedAppServiceRecord:","abstract":"<p>Convenience init for all parameters.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updateReason":{"name":"updateReason","abstract":"<p>Only included in <code>OnSystemCapbilityUpdated</code>. Update reason for this service record.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updatedAppServiceRecord":{"name":"updatedAppServiceRecord","abstract":"<p>Service record for a specific app service provider.</p>","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(cm)currentAppInfo":{"name":"+currentAppInfo","abstract":"<p>Convenience init with no parameters</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appDisplayName":{"name":"appDisplayName","abstract":"<p>The name displayed for the mobile application on the mobile device (can differ from the app name set in the initial RAI request).</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appBundleID":{"name":"appBundleID","abstract":"<p>The AppBundleID of an iOS application or package name of the Android application. This supports App Launch strategies for each platform.</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appVersion":{"name":"appVersion","abstract":"<p>Represents the build version number of this particular mobile app.</p>","parent_name":"SDLAppInfo"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(im)initWithAppCapabilityType:":{"name":"-initWithAppCapabilityType:","parent_name":"SDLAppCapability"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(im)initWithAppCapabilityType:videoStreamingCapability:":{"name":"-initWithAppCapabilityType:videoStreamingCapability:","parent_name":"SDLAppCapability"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(py)appCapabilityType":{"name":"appCapabilityType","abstract":"<p>Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other param included.</p>","parent_name":"SDLAppCapability"},"Classes/SDLAppCapability.html#/c:objc(cs)SDLAppCapability(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"<p>Describes supported capabilities for video streaming</p>","parent_name":"SDLAppCapability"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(cpy)defaultTimeout":{"name":"defaultTimeout","abstract":"<p>Set this to change the default timeout for all alerts. If a timeout is not set on an individual alert object (or if it is set to 0.0), then it will use this timeout instead. See <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)timeout\">timeout</a></code> for more details. If this is not set by you, it will default to 5 seconds. The minimum is 3 seconds, the maximum is 10 seconds. If this is set below the minimum, it will be capped at 3 seconds. If this is set above the maximum, it will be capped at 10 seconds.","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)text":{"name":"text","abstract":"<p>The primary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)secondaryText":{"name":"secondaryText","abstract":"<p>The secondary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>The tertiary line of text for display on the alert. If fewer than three alert lines are available on the head unit, the screen manager will automatically concatenate some of the lines together.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)timeout":{"name":"timeout","abstract":"<p>Timeout in seconds. Defaults to 0, which will use <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAlertView.html#/c:objc(cs)SDLAlertView(cpy)defaultTimeout\">defaultTimeout</a></code>. If this is set below the minimum, it will be capped at 3 seconds. Minimum 3 seconds, maximum 10 seconds. If this is set above the maximum, it will be capped at 10 seconds. Defaults to 0.","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)audio":{"name":"audio","abstract":"<p>Text spoken, file(s) played, and/or tone played when the alert appears</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)showWaitIndicator":{"name":"showWaitIndicator","abstract":"<p>If supported, the alert GUI will display some sort of indefinite waiting / refresh / loading indicator animation. Defaults to NO.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)softButtons":{"name":"softButtons","abstract":"<p>Soft buttons the user may select to perform actions. Only one <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLSoftButtonState.html\">SDLSoftButtonState</a></code> per object is supported; if any soft button object contains multiple states, an exception will be thrown.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(py)icon":{"name":"icon","abstract":"<p>An artwork that will be displayed when the icon appears. This will be uploaded prior to the appearance of the alert if necessary. This will not be uploaded if the head unit does not declare support for alertIcon.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)init":{"name":"-init","abstract":"<p>Use one of the other init methods</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)initWithText:buttons:":{"name":"-initWithText:buttons:","abstract":"<p>Initialize a basic alert with a message and buttons</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)initWithText:secondaryText:tertiaryText:timeout:showWaitIndicator:audioIndication:buttons:icon:":{"name":"-initWithText:secondaryText:tertiaryText:timeout:showWaitIndicator:audioIndication:buttons:icon:","abstract":"<p>Initialize a alert with a text, image, buttons and sound</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertView.html#/c:objc(cs)SDLAlertView(im)cancel":{"name":"-cancel","abstract":"<p>Cancels the alert. If the alert has not yet been sent to the module, it will not be sent. If the alert is already presented on the module, the alert will be immediately dismissed. Canceling an already presented alert will only work if connected to modules supporting RPC Spec v.6.0+. On older versions the alert will not be dismissed.</p>","parent_name":"SDLAlertView"},"Classes/SDLAlertResponse.html#/c:objc(cs)SDLAlertResponse(py)tryAgainTime":{"name":"tryAgainTime","abstract":"<p>Amount of time (in seconds) that an app must wait before resending an alert.</p>","parent_name":"SDLAlertResponse"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTS:softButtons:":{"name":"-initWithTTS:softButtons:","abstract":"<p>Convenience init to create an alert maneuver with required parameters</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTSChunks:softButtons:":{"name":"-initWithTTSChunks:softButtons:","abstract":"<p>Convenience init to create an alert maneuver with all parameters</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks.</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)softButtons":{"name":"softButtons","abstract":"<p>An array of soft buttons. If omitted on supported displays, only the system defined &ldquo;Close&rdquo; SoftButton shall be displayed.</p>","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertAudioData.html#/c:objc(cs)SDLAlertAudioData(py)playTone":{"name":"playTone","abstract":"<p>Whether the alert tone should be played before the prompt (if any) is spoken. Defaults to NO.</p>","parent_name":"SDLAlertAudioData"},"Classes/SDLAlertAudioData.html#/c:objc(cs)SDLAlertAudioData(im)init":{"name":"-init","abstract":"<p>Use another init instead. See superclass SDLAudioData.</p>","parent_name":"SDLAlertAudioData"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText:softButtons:playTone:ttsChunks:alertIcon:cancelID:":{"name":"-initWithAlertText:softButtons:playTone:ttsChunks:alertIcon:cancelID:","abstract":"<p>Convenience init for creating a modal view with text, buttons, and optional sound cues.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:playTone:":{"name":"-initWithTTSChunks:playTone:","abstract":"<p>Convenience init for creating a sound-only alert.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:softButtons:playTone:ttsChunks:duration:progressIndicator:alertIcon:cancelID:":{"name":"-initWithAlertText1:alertText2:alertText3:softButtons:playTone:ttsChunks:duration:progressIndicator:alertIcon:cancelID:","abstract":"<p>Convenience init for setting all alert parameters.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText1":{"name":"alertText1","abstract":"<p>The first line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText2":{"name":"alertText2","abstract":"<p>The second line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText3":{"name":"alertText3","abstract":"<p>The optional third line of the alert text field.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)ttsChunks":{"name":"ttsChunks","abstract":"<p>An array of text chunks to be spoken or a prerecorded sound file.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)duration":{"name":"duration","abstract":"<p>The duration of the displayed portion of the alert, in milliseconds. Typical timeouts are 3 - 5 seconds. If omitted, the timeout is set to a default of 5 seconds.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)playTone":{"name":"playTone","abstract":"<p>Whether the alert tone should be played before the TTS (if any) is spoken. If omitted or set to false, no tone is played.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)progressIndicator":{"name":"progressIndicator","abstract":"<p>If supported on the given platform, the alert GUI will include some sort of animation indicating that loading of a feature is progressing (e.g. a spinning wheel or hourglass, etc.).</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)softButtons":{"name":"softButtons","abstract":"<p>Buttons for the displayed alert. If omitted on supported displays, the displayed alert shall not have any buttons.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)cancelID":{"name":"cancelID","abstract":"<p>An ID for this specific alert to allow cancellation through the <code>CancelInteraction</code> RPC.</p>","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertIcon":{"name":"alertIcon","abstract":"<p>Image to be displayed in the alert. If omitted on supported displays, no (or the default if applicable) icon should be displayed.</p>","parent_name":"SDLAlert"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverAirbagDeployed":{"name":"driverAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverSideAirbagDeployed":{"name":"driverSideAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvSideBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverCurtainAirbagDeployed":{"name":"driverCurtainAirbagDeployed","abstract":"<p>References signal &ldquo;VedsDrvCrtnBag_D_Ltchd&rdquo;. See VehicleDataEventStatus</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerAirbagDeployed":{"name":"passengerAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerCurtainAirbagDeployed":{"name":"passengerCurtainAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasCrtnBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverKneeAirbagDeployed":{"name":"driverKneeAirbagDeployed","abstract":"<p>References signal &ldquo;VedsKneeDrvBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerSideAirbagDeployed":{"name":"passengerSideAirbagDeployed","abstract":"<p>References signal &ldquo;VedsPasSideBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerKneeAirbagDeployed":{"name":"passengerKneeAirbagDeployed","abstract":"<p>References signal &ldquo;VedsKneePasBag_D_Ltchd&rdquo;. See VehicleDataEventStatus.</p>","parent_name":"SDLAirbagStatus"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:":{"name":"-initWithMenuID:menuName:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:":{"name":"-initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:":{"name":"-initWithMenuID:menuName:position:menuIcon:menuLayout:parentID:secondaryText:tertiaryText:secondaryImage:","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuID":{"name":"menuID","abstract":"<p>a Menu ID that identifies a sub menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)position":{"name":"position","abstract":"<p>a position of menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuName":{"name":"menuName","abstract":"<p>a menuName which is displayed representing this submenu item","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuIcon":{"name":"menuIcon","abstract":"<p>An image that is displayed alongside this submenu item</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuLayout":{"name":"menuLayout","abstract":"<p>The sub-menu layout. See available menu layouts on SDLWindowCapability.menuLayoutsAvailable. Defaults to LIST.</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)parentID":{"name":"parentID","abstract":"<p>Unique ID of the sub menu the command will be added to. If not provided or 0, it will be provided to the top level of the in application menu.","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)secondaryText":{"name":"secondaryText","abstract":"<p>Optional secondary text to display","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)tertiaryText":{"name":"tertiaryText","abstract":"<p>Optional tertiary text to display","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)secondaryImage":{"name":"secondaryImage","abstract":"<p>Optional secondary image struct for sub-menu cell</p>","parent_name":"SDLAddSubMenu"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"<p>Constructs a SDLAddCommand with a handler callback when an event occurs.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:handler:":{"name":"-initWithId:vrCommands:handler:","abstract":"<p>Convenience init for creating a voice command menu item.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:handler:":{"name":"-initWithId:vrCommands:menuName:handler:","abstract":"<p>Convenience init for creating a menu item with text.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:","abstract":"<p>Convenience init for creating a menu item with text and a custom icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:icon:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:icon:handler:","abstract":"<p>Convenience init for creating a menu item with text and a custom icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithCmdID:":{"name":"-initWithCmdID:","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage:":{"name":"-initWithCmdID:menuParams:vrCommands:cmdIcon:secondaryImage:","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)handler":{"name":"handler","abstract":"<p>A handler that will let you know when the button you created is subscribed.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdID":{"name":"cmdID","abstract":"<p>A unique id that identifies the command.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)menuParams":{"name":"menuParams","abstract":"<p>A <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLMenuParams.html\">SDLMenuParams</a></code> pointer which defines the command and how it is added to the command menu.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)vrCommands":{"name":"vrCommands","abstract":"<p>An array of strings to be used as VR synonyms for this command.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdIcon":{"name":"cmdIcon","abstract":"<p>Image struct containing a static or dynamic icon.</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)secondaryImage":{"name":"secondaryImage","abstract":"<p>Optional secondary image struct for menu cell</p>","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html":{"name":"SDLAddCommand","abstract":"<p>This class will add a command to the application&rsquo;s Command Menu</p>"},"Classes.html#/c:objc(cs)SDLAddCommandResponse":{"name":"SDLAddCommandResponse","abstract":"<p>Response to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAddCommand.html\">SDLAddCommand</a></code></p>"},"Classes/SDLAddSubMenu.html":{"name":"SDLAddSubMenu","abstract":"<p>Add a SDLSubMenu to the Command Menu"},"Classes.html#/c:objc(cs)SDLAddSubMenuResponse":{"name":"SDLAddSubMenuResponse","abstract":"<p>Response to <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLAddSubMenu.html\">SDLAddSubMenu</a></code></p>"},"Classes/SDLAirbagStatus.html":{"name":"SDLAirbagStatus","abstract":"<p>A vehicle data status struct for airbags</p>"},"Classes/SDLAlert.html":{"name":"SDLAlert","abstract":"<p>Shows an alert which typically consists of text-to-speech message and text on the display. Either <code>alertText1</code>, <code>alertText2</code> or <code>TTSChunks</code> needs to be set or the request will be rejected.</p>"},"Classes/SDLAlertAudioData.html":{"name":"SDLAlertAudioData","abstract":"<p>Audio data for an SDLAlertView</p>"},"Classes/SDLAlertManeuver.html":{"name":"SDLAlertManeuver","abstract":"<p>Shows a SDLShowConstantTBT message with an optional voice command. This message is shown as an overlay over the display&rsquo;s base screen.</p>"},"Classes.html#/c:objc(cs)SDLAlertManeuverResponse":{"name":"SDLAlertManeuverResponse","abstract":"<p>Response to SDLAlertManeuver</p>"},"Classes/SDLAlertResponse.html":{"name":"SDLAlertResponse","abstract":"<p>Response to SDLAlert</p>"},"Classes/SDLAlertView.html":{"name":"SDLAlertView","abstract":"<p>An alert view to be displayed on the remote module. Pass this object to the SDLScreenManager to display.</p>"},"Classes/SDLAppCapability.html":{"name":"SDLAppCapability","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes/SDLAppInfo.html":{"name":"SDLAppInfo","abstract":"<p>A struct used in register app interface. Contains detailed information about the registered application.</p>"},"Classes/SDLAppServiceCapability.html":{"name":"SDLAppServiceCapability","abstract":"<p>A currently available service.</p>"},"Classes/SDLAppServiceData.html":{"name":"SDLAppServiceData","abstract":"<p>Contains all the current data of the app service. The serviceType will link to which of the service data objects are included in this object (e.g. if the service type is MEDIA, the mediaServiceData param should be included).</p>"},"Classes/SDLAppServiceManifest.html":{"name":"SDLAppServiceManifest","abstract":"<p>This manifest contains all the information necessary for the service to be published, activated, and allow consumers to interact with it</p>"},"Classes/SDLAppServiceRecord.html":{"name":"SDLAppServiceRecord","abstract":"<p>This is the record of an app service publisher that the module has. It should contain the most up to date information including the service&rsquo;s active state.</p>"},"Classes/SDLAppServicesCapabilities.html":{"name":"SDLAppServicesCapabilities","abstract":"<p>Capabilities of app services including what service types are supported and the current state of services.</p>"},"Classes/SDLArtwork.html":{"name":"SDLArtwork","abstract":"<p>An SDLFile subclass specifically designed for images</p>"},"Classes/SDLAudioControlCapabilities.html":{"name":"SDLAudioControlCapabilities","abstract":"<p>Describes a head unit&rsquo;s audio control capabilities.</p>"},"Classes/SDLAudioControlData.html":{"name":"SDLAudioControlData","abstract":"<p>The audio control data information.</p>"},"Classes/SDLAudioData.html":{"name":"SDLAudioData","abstract":"<p>Audio data for various SDLScreenManager views</p>"},"Classes/SDLAudioFile.html":{"name":"SDLAudioFile","abstract":"<p>Includes information about a given audio file</p>"},"Classes/SDLAudioPassThruCapabilities.html":{"name":"SDLAudioPassThruCapabilities","abstract":"<p>Describes different audio type configurations for SDLPerformAudioPassThru, e.g. {8kHz,8-bit,PCM}</p>"},"Classes/SDLAudioStreamManager.html":{"name":"SDLAudioStreamManager","abstract":"<p>The manager to control the audio stream</p>"},"Classes/SDLBeltStatus.html":{"name":"SDLBeltStatus","abstract":"<p>Vehicle data struct for the seat belt status</p>"},"Classes/SDLBodyInformation.html":{"name":"SDLBodyInformation","abstract":"<p>Vehicle data body information containing information like the park brake status, the ignition status, gate and roof statuses, etc.</p>"},"Classes/SDLButtonCapabilities.html":{"name":"SDLButtonCapabilities","abstract":"<p>Provides information about the capabilities of a SDL HMI button.</p>"},"Classes/SDLButtonPress.html":{"name":"SDLButtonPress","abstract":"<p>This RPC allows a remote control type mobile application to simulate a hardware button press event.</p>"},"Classes.html#/c:objc(cs)SDLButtonPressResponse":{"name":"SDLButtonPressResponse","abstract":"<p>Response to SDLButtonPress</p>"},"Classes/SDLCancelInteraction.html":{"name":"SDLCancelInteraction","abstract":"<p>Used to dismiss a modal view programmatically without needing to wait for the timeout to complete. Can be used to dismiss alerts, scrollable messages, sliders, and perform interactions (i.e. pop-up menus).</p>"},"Classes.html#/c:objc(cs)SDLCancelInteractionResponse":{"name":"SDLCancelInteractionResponse","abstract":"<p>Response to the request to dismiss a modal view. If no applicable request can be dismissed, the <code>resultCode</code> will be <code>IGNORED</code>.</p>"},"Classes/SDLCarWindowViewController.html":{"name":"SDLCarWindowViewController","abstract":"<p>Note that if this is embedded in a UINavigationController and UITabBarController, it will not lock orientation. You must lock your container controller to a specific orientation.</p>"},"Classes/SDLChangeRegistration.html":{"name":"SDLChangeRegistration","abstract":"<p>If the app recognizes during the app registration that the SDL HMI language (voice/TTS and/or display) does not match the app language, the app will be able (but does not need) to change this registration with changeRegistration prior to app being brought into focus.</p>"},"Classes.html#/c:objc(cs)SDLChangeRegistrationResponse":{"name":"SDLChangeRegistrationResponse","abstract":"<p>Response to SDLChangeRegistrations</p>"},"Classes/SDLChoice.html":{"name":"SDLChoice","abstract":"<p>A choice is an option which a user can select either via the menu or via voice recognition (VR) during an application initiated interaction.</p>"},"Classes/SDLChoiceCell.html":{"name":"SDLChoiceCell","abstract":"<p>A selectable item within an SDLChoiceSet</p>"},"Classes/SDLChoiceSet.html":{"name":"SDLChoiceSet","abstract":"<p>The choice set to be displayed to the user. Contains a list of selectable options.</p>"},"Classes/SDLClimateControlCapabilities.html":{"name":"SDLClimateControlCapabilities","abstract":"<p>Contains information about a climate control module&rsquo;s capabilities.</p>"},"Classes/SDLClimateControlData.html":{"name":"SDLClimateControlData","abstract":"<p>The current information for the Climate Remote Control Module</p>"},"Classes/SDLClimateData.html":{"name":"SDLClimateData","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes.html#/c:objc(cs)SDLCloseApplication":{"name":"SDLCloseApplication","abstract":"<p>Used by an app to set itself to a <code>HMILevel</code> of <code>NONE</code>. The app will close but will still be registered. If the app is a navigation app it will no longer be used as the preferred mobile-navigation application by the module.</p>"},"Classes.html#/c:objc(cs)SDLCloseApplicationResponse":{"name":"SDLCloseApplicationResponse","abstract":"<p>Response to the request to close this app on the module.</p>"},"Classes/SDLCloudAppProperties.html":{"name":"SDLCloudAppProperties","abstract":"<p>The cloud application properties.</p>"},"Classes/SDLClusterModeStatus.html":{"name":"SDLClusterModeStatus","abstract":"<p>A vehicle data struct for the cluster mode and power status</p>"},"Classes/SDLConfiguration.html":{"name":"SDLConfiguration","abstract":"<p>Contains information about the app&rsquo;s configuration, such as lifecycle, lockscreen, encryption, etc.</p>"},"Classes/SDLCreateInteractionChoiceSet.html":{"name":"SDLCreateInteractionChoiceSet","abstract":"<p>Creates a Choice Set which can be used in subsequent <em>SDLPerformInteraction</em> Operations.</p>"},"Classes.html#/c:objc(cs)SDLCreateInteractionChoiceSetResponse":{"name":"SDLCreateInteractionChoiceSetResponse","abstract":"<p>Response to SDLCreateInteractionChoiceSet has been called</p>"},"Classes/SDLCreateWindow.html":{"name":"SDLCreateWindow","abstract":"<p>Create a new window on the display with the specified window type."},"Classes.html#/c:objc(cs)SDLCreateWindowResponse":{"name":"SDLCreateWindowResponse","abstract":"<p>Response to SDLCreateWindow</p>"},"Classes/SDLDIDResult.html":{"name":"SDLDIDResult","abstract":"<p>A vehicle data struct</p>"},"Classes/SDLDateTime.html":{"name":"SDLDateTime","abstract":"<p>A struct referenced in SendLocation for an absolute date</p>"},"Classes/SDLDeleteCommand.html":{"name":"SDLDeleteCommand","abstract":"<p>Removes a command from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteCommandResponse":{"name":"SDLDeleteCommandResponse","abstract":"<p>Response to SDLDeleteCommand</p>"},"Classes/SDLDeleteFile.html":{"name":"SDLDeleteFile","abstract":"<p>Used to delete a file resident on the SDL module in the app&rsquo;s local cache."},"Classes/SDLDeleteFileResponse.html":{"name":"SDLDeleteFileResponse","abstract":"<p>Response to SDLDeleteFile</p>"},"Classes/SDLDeleteInteractionChoiceSet.html":{"name":"SDLDeleteInteractionChoiceSet","abstract":"<p>Deletes an existing Choice Set identified by the parameter"},"Classes.html#/c:objc(cs)SDLDeleteInteractionChoiceSetResponse":{"name":"SDLDeleteInteractionChoiceSetResponse","abstract":"<p>SDLDeleteInteractionChoiceSetResponse is sent, when SDLDeleteInteractionChoiceSet has been called</p>"},"Classes/SDLDeleteSubMenu.html":{"name":"SDLDeleteSubMenu","abstract":"<p>Deletes a submenu from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteSubMenuResponse":{"name":"SDLDeleteSubMenuResponse","abstract":"<p>Response to SDLDeleteSubMenu</p>"},"Classes/SDLDeleteWindow.html":{"name":"SDLDeleteWindow","abstract":"<p>Deletes previously created window of the SDL application.</p>"},"Classes.html#/c:objc(cs)SDLDeleteWindowResponse":{"name":"SDLDeleteWindowResponse","abstract":"<p>Response to DeleteWindow</p>"},"Classes/SDLDeviceInfo.html":{"name":"SDLDeviceInfo","abstract":"<p>Various information about connecting device. Referenced in RegisterAppInterface</p>"},"Classes/SDLDeviceStatus.html":{"name":"SDLDeviceStatus","abstract":"<p>Describes the status related to a connected mobile device or SDL and if or how it is represented in the vehicle.</p>"},"Classes/SDLDiagnosticMessage.html":{"name":"SDLDiagnosticMessage","abstract":"<p>Non periodic vehicle diagnostic request</p>"},"Classes/SDLDiagnosticMessageResponse.html":{"name":"SDLDiagnosticMessageResponse","abstract":"<p>Response to SDLDiagnosticMessage</p>"},"Classes/SDLDialNumber.html":{"name":"SDLDialNumber","abstract":"<p>This RPC is used to tell the head unit to use bluetooth to dial a phone number using the phone.</p>"},"Classes.html#/c:objc(cs)SDLDialNumberResponse":{"name":"SDLDialNumberResponse","abstract":"<p>The response to SDLDialNumber</p>"},"Classes/SDLDisplayCapabilities.html":{"name":"SDLDisplayCapabilities","abstract":"<p>Contains information about the display for the SDL system to which the application is currently connected.</p>"},"Classes/SDLDisplayCapability.html":{"name":"SDLDisplayCapability","abstract":"<p>Contain the display related information and all windows related to that display.</p>"},"Classes/SDLDoorStatus.html":{"name":"SDLDoorStatus","abstract":"<p>Describes the status of a parameter of door.</p>"},"Classes/SDLDriverDistractionCapability.html":{"name":"SDLDriverDistractionCapability","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLDynamicUpdateCapabilities.html":{"name":"SDLDynamicUpdateCapabilities","abstract":"<p>@since SDL 7.0</p>"},"Classes/SDLECallInfo.html":{"name":"SDLECallInfo","abstract":"<p>A vehicle data struct for emergency call information</p>"},"Classes/SDLEmergencyEvent.html":{"name":"SDLEmergencyEvent","abstract":"<p>A vehicle data struct for an emergency event</p>"},"Classes/SDLEncodedSyncPData.html":{"name":"SDLEncodedSyncPData","abstract":"<p>Allows encoded data in the form of SyncP packets to be sent to the SYNC module. Legacy / v1 Protocol implementation; use SyncPData instead.</p>"},"Classes.html#/c:objc(cs)SDLEncodedSyncPDataResponse":{"name":"SDLEncodedSyncPDataResponse","abstract":"<p>The response to SDLEncodedSyncPData</p>"},"Classes/SDLEncryptionConfiguration.html":{"name":"SDLEncryptionConfiguration","abstract":"<p>The encryption configuration data</p>"},"Classes.html#/c:objc(cs)SDLEndAudioPassThru":{"name":"SDLEndAudioPassThru","abstract":"<p>When this request is invoked, the audio capture stops</p>"},"Classes.html#/c:objc(cs)SDLEndAudioPassThruResponse":{"name":"SDLEndAudioPassThruResponse","abstract":"<p>Response to SDLEndAudioPassThru</p>"},"Classes/SDLEqualizerSettings.html":{"name":"SDLEqualizerSettings","abstract":"<p>Defines the each Equalizer channel settings.</p>"},"Classes/SDLFile.html":{"name":"SDLFile","abstract":"<p>Crates an SDLFile from a file</p>"},"Classes/SDLFileManager.html":{"name":"SDLFileManager","abstract":"<p>The SDLFileManager is an RPC manager for the remote file system. After it starts, it will attempt to communicate with the remote file system to get the names of all files. Deleting and Uploading will them queue these changes as transactions. If a delete succeeds, the local list of remote files will remove that file name, and likewise, if an upload succeeds, the local list of remote files will now include that file name.</p>"},"Classes/SDLFileManagerConfiguration.html":{"name":"SDLFileManagerConfiguration","abstract":"<p>File manager configuration information</p>"},"Classes/SDLFuelRange.html":{"name":"SDLFuelRange","abstract":"<p>Describes the distance a vehicle can travel with the current level of fuel.</p>"},"Classes/SDLFunctionID.html":{"name":"SDLFunctionID","abstract":"<p>A function ID for an SDL RPC</p>"},"Classes/SDLGPSData.html":{"name":"SDLGPSData","abstract":"<p>Describes the GPS data. Not all data will be available on all carlines.</p>"},"Classes/SDLGateStatus.html":{"name":"SDLGateStatus","abstract":"<p>Describes the status of a parameter of trunk/hood/etc.</p>"},"Classes/SDLGearStatus.html":{"name":"SDLGearStatus","abstract":"<p>@since SDL 7.0.0</p>"},"Classes.html#/c:objc(cs)SDLGenericResponse":{"name":"SDLGenericResponse","abstract":"<p>Generic Response is sent when the name of a received request is unknown. It is only used in case of an error. It will have an INVALID_DATA result code.</p>"},"Classes/SDLGetAppServiceData.html":{"name":"SDLGetAppServiceData","abstract":"<p>This request asks the module for current data related to the specific service. It also includes an option to subscribe to that service for future updates.</p>"},"Classes/SDLGetAppServiceDataResponse.html":{"name":"SDLGetAppServiceDataResponse","abstract":"<p>This response includes the data that was requested from the specific service.</p>"},"Classes/SDLGetCloudAppProperties.html":{"name":"SDLGetCloudAppProperties","abstract":"<p>RPC used to get the current properties of a cloud application.</p>"},"Classes/SDLGetCloudAppPropertiesResponse.html":{"name":"SDLGetCloudAppPropertiesResponse","abstract":"<p>The response to GetCloudAppProperties</p>"},"Classes/SDLGetDTCs.html":{"name":"SDLGetDTCs","abstract":"<p>This RPC allows to request diagnostic module trouble codes from a certain"},"Classes/SDLGetDTCsResponse.html":{"name":"SDLGetDTCsResponse","abstract":"<p>Response to SDLGetDTCs</p>"},"Classes/SDLGetFile.html":{"name":"SDLGetFile","abstract":"<p>This request is sent to the module to retrieve a file.</p>"},"Classes/SDLGetFileResponse.html":{"name":"SDLGetFileResponse","abstract":"<p>Response to GetFiles</p>"},"Classes/SDLGetInteriorVehicleData.html":{"name":"SDLGetInteriorVehicleData","abstract":"<p>Reads the current status value of specified remote control module (type)."},"Classes/SDLGetInteriorVehicleDataConsent.html":{"name":"SDLGetInteriorVehicleDataConsent","abstract":"<p>This RPC allows you to get consent to control a certain module</p>"},"Classes/SDLGetInteriorVehicleDataConsentResponse.html":{"name":"SDLGetInteriorVehicleDataConsentResponse","abstract":"<p>Response to GetInteriorVehicleDataConsent</p>"},"Classes/SDLGetInteriorVehicleDataResponse.html":{"name":"SDLGetInteriorVehicleDataResponse","abstract":"<p>A response to SDLGetInteriorVehicleData</p>"},"Classes/SDLGetSystemCapability.html":{"name":"SDLGetSystemCapability","abstract":"<p>SDL RPC Request for expanded information about a supported system/HMI capability</p>"},"Classes/SDLGetSystemCapabilityResponse.html":{"name":"SDLGetSystemCapabilityResponse","abstract":"<p>Response to SDLGetSystemCapability</p>"},"Classes/SDLGetVehicleData.html":{"name":"SDLGetVehicleData","abstract":"<p>Requests current values of specific published vehicle data items.</p>"},"Classes/SDLGetVehicleDataResponse.html":{"name":"SDLGetVehicleDataResponse","abstract":"<p>Response to SDLGetVehicleData</p>"},"Classes/SDLGetWayPoints.html":{"name":"SDLGetWayPoints","abstract":"<p>This RPC allows you to get navigation waypoint data</p>"},"Classes/SDLGetWayPointsResponse.html":{"name":"SDLGetWayPointsResponse","abstract":"<p>Response to SDLGetWayPoints</p>"},"Classes/SDLGrid.html":{"name":"SDLGrid","abstract":"<p>Describes a location (origin coordinates and span) of a vehicle component.</p>"},"Classes/SDLHMICapabilities.html":{"name":"SDLHMICapabilities","abstract":"<p>Contains information about the HMI capabilities.</p>"},"Classes/SDLHMIPermissions.html":{"name":"SDLHMIPermissions","abstract":"<p>Defining sets of HMI levels, which are permitted or prohibited for a given RPC.</p>"},"Classes/SDLHMISettingsControlCapabilities.html":{"name":"SDLHMISettingsControlCapabilities","abstract":"<p>HMI data struct for HMI control settings</p>"},"Classes/SDLHMISettingsControlData.html":{"name":"SDLHMISettingsControlData","abstract":"<p>Corresponds to &ldquo;HMI_SETTINGS&rdquo; ModuleType</p>"},"Classes/SDLHapticRect.html":{"name":"SDLHapticRect","abstract":"<p>Defines spatial for each user control object for video streaming application</p>"},"Classes/SDLHeadLampStatus.html":{"name":"SDLHeadLampStatus","abstract":"<p>Vehicle data struct for status of head lamps</p>"},"Classes/SDLImage.html":{"name":"SDLImage","abstract":"<p>Specifies which image shall be used e.g. in SDLAlerts or on SDLSoftbuttons provided the display supports it.</p>"},"Classes/SDLImageField.html":{"name":"SDLImageField","abstract":"<p>A struct used in DisplayCapabilities describing the capability of an image field</p>"},"Classes/SDLImageResolution.html":{"name":"SDLImageResolution","abstract":"<p>The resolution of an image</p>"},"Classes/SDLKeyboardCapabilities.html":{"name":"SDLKeyboardCapabilities","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes/SDLKeyboardLayoutCapability.html":{"name":"SDLKeyboardLayoutCapability","abstract":"<p>Describes the capabilities of a single keyboard layout.</p>"},"Classes/SDLKeyboardProperties.html":{"name":"SDLKeyboardProperties","abstract":"<p>Configuration of on-screen keyboard (if available)</p>"},"Classes/SDLLifecycleConfiguration.html":{"name":"SDLLifecycleConfiguration","abstract":"<p>Configuration options for SDLManager</p>"},"Classes/SDLLifecycleConfigurationUpdate.html":{"name":"SDLLifecycleConfigurationUpdate","abstract":"<p>Configuration update options for SDLManager. This class can be used to update the lifecycle configuration in"},"Classes/SDLLightCapabilities.html":{"name":"SDLLightCapabilities","abstract":"<p>Current Light capabilities.</p>"},"Classes/SDLLightControlCapabilities.html":{"name":"SDLLightControlCapabilities","abstract":"<p>Current light control capabilities.</p>"},"Classes/SDLLightControlData.html":{"name":"SDLLightControlData","abstract":"<p>Data about the current light controls</p>"},"Classes/SDLLightState.html":{"name":"SDLLightState","abstract":"<p>Current light control state</p>"},"Classes.html#/c:objc(cs)SDLListFiles":{"name":"SDLListFiles","abstract":"<p>Requests the current list of resident filenames for the registered app. Not"},"Classes/SDLListFilesResponse.html":{"name":"SDLListFilesResponse","abstract":"<p>Response to SDLListFiles</p>"},"Classes/SDLLocationCoordinate.html":{"name":"SDLLocationCoordinate","abstract":"<p>Describes a coordinate on earth</p>"},"Classes/SDLLocationDetails.html":{"name":"SDLLocationDetails","abstract":"<p>Describes a location, including its coordinate, name, etc. Used in WayPoints.</p>"},"Classes/SDLLockScreenConfiguration.html":{"name":"SDLLockScreenConfiguration","abstract":"<p>A configuration describing how the lock screen should be used by the internal SDL system for your application. This configuration is provided before SDL starts and will govern the entire SDL lifecycle of your application.</p>"},"Classes/SDLLockScreenViewController.html":{"name":"SDLLockScreenViewController","abstract":"<p>The view controller for the lockscreen.</p>"},"Classes/SDLLogConfiguration.html":{"name":"SDLLogConfiguration","abstract":"<p>Information about the current logging configuration</p>"},"Classes/SDLLogFileModule.html":{"name":"SDLLogFileModule","abstract":"<p>A log file module is a collection of source code files that form a cohesive unit and that logs can all use to describe themselves. E.g. a &ldquo;transport&rdquo; module, or a &ldquo;Screen Manager&rdquo; module.</p>"},"Classes/SDLLogFilter.html":{"name":"SDLLogFilter","abstract":"<p>Represents a filter over which SDL logs should be logged</p>"},"Classes/SDLLogManager.html":{"name":"SDLLogManager","abstract":"<p>This is the central manager of logging. A developer should not have to interact with this class, it is exclusively used internally.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetAppleSystemLog":{"name":"SDLLogTargetAppleSystemLog","abstract":"<p>The Apple System Log target is an iOS 2.0+ compatible log target that logs to both the Console and to the System Log.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetFile":{"name":"SDLLogTargetFile","abstract":"<p>The File log will log to a text file on the iPhone in Documents/smartdevicelink/log/#appName##datetime##.log. It will log up to 3 logs which will rollover.</p>"},"Classes.html#/c:objc(cs)SDLLogTargetOSLog":{"name":"SDLLogTargetOSLog","abstract":"<p>OS_LOG is an iOS 10+ only logging system that logs to the Console and the Apple system console. This is an improved replacement for Apple SysLog (SDLLogTargetAppleSystemLog). </p>"},"Classes/SDLManager.html":{"name":"SDLManager","abstract":"<p>The top level manager object for all of SDL&rsquo;s interactions with the app and the head unit</p>"},"Classes/SDLMassageCushionFirmness.html":{"name":"SDLMassageCushionFirmness","abstract":"<p>The intensity or firmness of a cushion.</p>"},"Classes/SDLMassageModeData.html":{"name":"SDLMassageModeData","abstract":"<p>Specify the mode of a massage zone.</p>"},"Classes/SDLMediaServiceData.html":{"name":"SDLMediaServiceData","abstract":"<p>This data is related to what a media service should provide.</p>"},"Classes.html#/c:objc(cs)SDLMediaServiceManifest":{"name":"SDLMediaServiceManifest","abstract":"<p>A media service manifest.</p>"},"Classes/SDLMenuCell.html":{"name":"SDLMenuCell","abstract":"<p>A menu cell item for the main menu or sub-menu.</p>"},"Classes/SDLMenuConfiguration.html":{"name":"SDLMenuConfiguration","abstract":"<p>Defines how the menu is configured</p>"},"Classes/SDLMenuParams.html":{"name":"SDLMenuParams","abstract":"<p>Used when adding a sub menu to an application menu or existing sub menu.</p>"},"Classes/SDLMetadataTags.html":{"name":"SDLMetadataTags","abstract":"<p>Metadata for Show fields</p>"},"Classes/SDLModuleData.html":{"name":"SDLModuleData","abstract":"<p>Describes a remote control module&rsquo;s data</p>"},"Classes/SDLModuleInfo.html":{"name":"SDLModuleInfo","abstract":"<p>Contains information about a RC module.</p>"},"Classes/SDLMsgVersion.html":{"name":"SDLMsgVersion","abstract":"<p>Specifies the version number of the SDL V4 interface. This is used by both the application and SDL to declare what interface version each is using.</p>"},"Classes/SDLMyKey.html":{"name":"SDLMyKey","abstract":"<p>Vehicle Data struct</p>"},"Classes/SDLNavigationCapability.html":{"name":"SDLNavigationCapability","abstract":"<p>Extended capabilities for an onboard navigation system</p>"},"Classes/SDLNavigationInstruction.html":{"name":"SDLNavigationInstruction","abstract":"<p>A navigation instruction.</p>"},"Classes/SDLNavigationServiceData.html":{"name":"SDLNavigationServiceData","abstract":"<p>This data is related to what a navigation service would provide.</p>"},"Classes/SDLNavigationServiceManifest.html":{"name":"SDLNavigationServiceManifest","abstract":"<p>A navigation service manifest.</p>"},"Classes/SDLNotificationConstants.html":{"name":"SDLNotificationConstants","abstract":"<p>This class defines methods for getting groups of notifications</p>"},"Classes/SDLOasisAddress.html":{"name":"SDLOasisAddress","abstract":"<p>Struct used in SendLocation describing an address</p>"},"Classes/SDLOnAppCapabilityUpdated.html":{"name":"SDLOnAppCapabilityUpdated","abstract":"<p>A notification to inform SDL Core that a specific app capability has changed.</p>"},"Classes/SDLOnAppInterfaceUnregistered.html":{"name":"SDLOnAppInterfaceUnregistered","abstract":"<p>Notifies an application that its interface registration has been terminated. This means that all SDL resources associated with the application are discarded, including the Command Menu, Choice Sets, button subscriptions, etc.</p>"},"Classes/SDLOnAppServiceData.html":{"name":"SDLOnAppServiceData","abstract":"<p>This notification includes the data that is updated from the specific service.</p>"},"Classes.html#/c:objc(cs)SDLOnAudioPassThru":{"name":"SDLOnAudioPassThru","abstract":"<p>Binary data is in binary part of hybrid msg.</p>"},"Classes/SDLOnButtonEvent.html":{"name":"SDLOnButtonEvent","abstract":"<p>Notifies application that user has depressed or released a button to which"},"Classes/SDLOnButtonPress.html":{"name":"SDLOnButtonPress","abstract":"<p>Notifies application of button press events for buttons to which the application is subscribed. SDL supports two button press events defined as follows:</p>"},"Classes/SDLOnCommand.html":{"name":"SDLOnCommand","abstract":"<p>This is called when a command was selected via VR after pressing the PTT button, or selected from the menu after pressing the MENU button.</p>"},"Classes/SDLOnDriverDistraction.html":{"name":"SDLOnDriverDistraction","abstract":"<p>Notifies the application of the current driver distraction state (whether driver distraction rules are in effect, or not).</p>"},"Classes/SDLOnEncodedSyncPData.html":{"name":"SDLOnEncodedSyncPData","abstract":"<p>Callback including encoded data of any SyncP packets that SYNC needs to send back to the mobile device. Legacy / v1 Protocol implementation; responds to EncodedSyncPData. *** DEPRECATED ***</p>"},"Classes/SDLOnHMIStatus.html":{"name":"SDLOnHMIStatus"},"Classes/SDLOnHashChange.html":{"name":"SDLOnHashChange","abstract":"<p>Notification containing an updated hashID which can be used over connection cycles (i.e. loss of connection, ignition cycles, etc.). Sent after initial registration and subsequently after any change in the calculated hash of all persisted app data.</p>"},"Classes/SDLOnInteriorVehicleData.html":{"name":"SDLOnInteriorVehicleData","abstract":"<p>Notifications when subscribed vehicle data changes.</p>"},"Classes/SDLOnKeyboardInput.html":{"name":"SDLOnKeyboardInput","abstract":"<p>Sent when a keyboard presented by a PerformInteraction has a keyboard input.</p>"},"Classes/SDLOnLanguageChange.html":{"name":"SDLOnLanguageChange","abstract":"<p>Provides information to what language the SDL HMI language was changed</p>"},"Classes/SDLOnPermissionsChange.html":{"name":"SDLOnPermissionsChange","abstract":"<p>Provides update to app of which sets of functions are available</p>"},"Classes/SDLOnRCStatus.html":{"name":"SDLOnRCStatus","abstract":"<p>OnRCStatus notifications to all registered mobile applications and the HMI whenever"},"Classes.html#/c:objc(cs)SDLOnSubtleAlertPressed":{"name":"SDLOnSubtleAlertPressed","abstract":"<p>Sent when the alert itself is touched (outside of a soft button). Touching (or otherwise selecting) the alert should open the app before sending this notification.</p>"},"Classes/SDLOnSyncPData.html":{"name":"SDLOnSyncPData","abstract":"<p>DEPRECATED</p>"},"Classes/SDLOnSystemCapabilityUpdated.html":{"name":"SDLOnSystemCapabilityUpdated","abstract":"<p>A notification to inform the connected device that a specific system capability has changed.</p>"},"Classes/SDLOnSystemRequest.html":{"name":"SDLOnSystemRequest","abstract":"<p>An asynchronous request from the system for specific data from the device or the cloud or response to a request from the device or cloud Binary data can be included in hybrid part of message for some requests (such as Authentication request responses)</p>"},"Classes/SDLOnTBTClientState.html":{"name":"SDLOnTBTClientState","abstract":"<p>Provides applications with notifications specific to the current TBT client status on the module</p>"},"Classes/SDLOnTouchEvent.html":{"name":"SDLOnTouchEvent","abstract":"<p>Notifies about touch events on the screen&rsquo;s prescribed area during video streaming</p>"},"Classes/SDLOnUpdateFile.html":{"name":"SDLOnUpdateFile","abstract":"<p>This notification tells an app to upload and update a file with a given name.</p>"},"Classes/SDLOnUpdateSubMenu.html":{"name":"SDLOnUpdateSubMenu","abstract":"<p>This notification tells an app to update the AddSubMenu or its &lsquo;sub&rsquo; AddCommand and AddSubMenus with the requested data</p>"},"Classes/SDLOnVehicleData.html":{"name":"SDLOnVehicleData","abstract":"<p>Callback for the periodic and non periodic vehicle data read function.</p>"},"Classes/SDLOnWayPointChange.html":{"name":"SDLOnWayPointChange","abstract":"<p>Notification which provides the entire LocationDetails when there is a change to any waypoints or destination.</p>"},"Classes/SDLParameterPermissions.html":{"name":"SDLParameterPermissions","abstract":"<p>Defining sets of parameters, which are permitted or prohibited for a given RPC.</p>"},"Classes/SDLPerformAppServiceInteraction.html":{"name":"SDLPerformAppServiceInteraction","abstract":"<p>App service providers will likely have different actions exposed to the module and app service consumers. It will be difficult to standardize these actions by RPC versions and can easily become stale. Therefore, we introduce a best-effort attempt to take actions on a service.</p>"},"Classes/SDLPerformAppServiceInteractionResponse.html":{"name":"SDLPerformAppServiceInteractionResponse","abstract":"<p>Response to the request to request an app service.</p>"},"Classes/SDLPerformAudioPassThru.html":{"name":"SDLPerformAudioPassThru","abstract":"<p>This will open an audio pass thru session. By doing so the app can receive"},"Classes.html#/c:objc(cs)SDLPerformAudioPassThruResponse":{"name":"SDLPerformAudioPassThruResponse","abstract":"<p>Response to SDLPerformAudioPassThru</p>"},"Classes/SDLPerformInteraction.html":{"name":"SDLPerformInteraction","abstract":"<p>Performs an application-initiated interaction in which the user can select a choice from the passed choice set.</p>"},"Classes/SDLPerformInteractionResponse.html":{"name":"SDLPerformInteractionResponse","abstract":"<p>PerformInteraction Response is sent, when SDLPerformInteraction has been called</p>"},"Classes/SDLPermissionElement.html":{"name":"SDLPermissionElement","abstract":"<p>An object containing the RPC name and its parameter names that should be checked when checking permissions</p>"},"Classes/SDLPermissionItem.html":{"name":"SDLPermissionItem","abstract":"<p>Permissions for a given set of RPCs</p>"},"Classes/SDLPermissionManager.html":{"name":"SDLPermissionManager","abstract":"<p>The permission manager monitoring RPC permissions.</p>"},"Classes/SDLPhoneCapability.html":{"name":"SDLPhoneCapability","abstract":"<p>Extended capabilities of the module&rsquo;s phone feature</p>"},"Classes/SDLPinchGesture.html":{"name":"SDLPinchGesture","abstract":"<p>Pinch Gesture information</p>"},"Classes/SDLPresetBankCapabilities.html":{"name":"SDLPresetBankCapabilities","abstract":"<p>Contains information about on-screen preset capabilities.</p>"},"Classes/SDLPublishAppService.html":{"name":"SDLPublishAppService","abstract":"<p>Registers a service offered by this app on the module."},"Classes/SDLPublishAppServiceResponse.html":{"name":"SDLPublishAppServiceResponse","abstract":"<p>Response to the request to register a service offered by this app on the module.</p>"},"Classes/SDLPutFile.html":{"name":"SDLPutFile","abstract":"<p>Used to push a binary data onto the SDL module from a mobile device, such as icons and album art.</p>"},"Classes/SDLPutFileResponse.html":{"name":"SDLPutFileResponse","abstract":"<p>Response to SDLPutFile</p>"},"Classes/SDLRDSData.html":{"name":"SDLRDSData","abstract":"<p>Include the data defined in Radio Data System, which is a communications protocol standard for embedding small amounts of digital information in conventional FM radio broadcasts.</p>"},"Classes/SDLRGBColor.html":{"name":"SDLRGBColor","abstract":"<p>Represents an RGB color</p>"},"Classes/SDLRPCMessage.html":{"name":"SDLRPCMessage","abstract":"<p>Parent class of all RPC messages.</p>"},"Classes.html#/c:objc(cs)SDLRPCNotification":{"name":"SDLRPCNotification","abstract":"<p>An RPC sent from the head unit to the app about some data change, such as a button was pressed</p>"},"Classes/SDLRPCNotificationNotification.html":{"name":"SDLRPCNotificationNotification","abstract":"<p>An NSNotification object that makes retrieving internal SDLRPCNotification data easier</p>"},"Classes/SDLRPCPermissionStatus.html":{"name":"SDLRPCPermissionStatus","abstract":"<p>An object containing the result status of a permission element request</p>"},"Classes/SDLRPCRequest.html":{"name":"SDLRPCRequest","abstract":"<p>Superclass of RPC requests</p>"},"Classes/SDLRPCRequestNotification.html":{"name":"SDLRPCRequestNotification","abstract":"<p>A NSNotification object that makes retrieving internal SDLRPCRequest data easier</p>"},"Classes/SDLRPCResponse.html":{"name":"SDLRPCResponse","abstract":"<p>Superclass of RPC responses</p>"},"Classes/SDLRPCResponseNotification.html":{"name":"SDLRPCResponseNotification","abstract":"<p>A NSNotification object that makes retrieving internal SDLRPCResponse data easier</p>"},"Classes/SDLRPCStruct.html":{"name":"SDLRPCStruct","abstract":"<p>Superclass of all RPC-related structs and messages</p>"},"Classes/SDLRadioControlCapabilities.html":{"name":"SDLRadioControlCapabilities","abstract":"<p>Contains information about a radio control module&rsquo;s capabilities.</p>"},"Classes/SDLRadioControlData.html":{"name":"SDLRadioControlData","abstract":"<p>Include information (both read-only and changeable data) about a remote control radio module.</p>"},"Classes/SDLReadDID.html":{"name":"SDLReadDID","abstract":"<p>Non periodic vehicle data read request. This is an RPC to get diagnostics"},"Classes/SDLReadDIDResponse.html":{"name":"SDLReadDIDResponse","abstract":"<p>A response to ReadDID</p>"},"Classes/SDLRectangle.html":{"name":"SDLRectangle","abstract":"<p>A struct describing a rectangle</p>"},"Classes/SDLRegisterAppInterface.html":{"name":"SDLRegisterAppInterface","abstract":"<p>Registers the application&rsquo;s interface with SDL. The <code>RegisterAppInterface</code> RPC declares the properties of the app, including the messaging interface version, the app name, etc. The mobile application must establish its interface registration with SDL before any other interaction with SDL can take place. The registration lasts until it is terminated either by the application calling the <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses.html#/c:objc(cs)SDLUnregisterAppInterface\">SDLUnregisterAppInterface</a></code> method, or by SDL sending an <code><a href=\"36f8f5912051ae747ef441d6511ca4cbClasses/SDLOnAppInterfaceUnregistered.html\">SDLOnAppInterfaceUnregistered</a></code> notification, or by loss of the underlying transport connection, or closing of the underlying message transmission protocol RPC session.</p>"},"Classes/SDLRegisterAppInterfaceResponse.html":{"name":"SDLRegisterAppInterfaceResponse","abstract":"<p>Response to SDLRegisterAppInterface</p>"},"Classes/SDLReleaseInteriorVehicleDataModule.html":{"name":"SDLReleaseInteriorVehicleDataModule","abstract":"<p>Releases a controlled remote control module so others can take control</p>"},"Classes.html#/c:objc(cs)SDLReleaseInteriorVehicleDataModuleResponse":{"name":"SDLReleaseInteriorVehicleDataModuleResponse","abstract":"<p>Response to ReleaseInteriorVehicleDataModule</p>"},"Classes/SDLRemoteControlCapabilities.html":{"name":"SDLRemoteControlCapabilities","abstract":"<p>Capabilities of the remote control feature</p>"},"Classes/SDLResetGlobalProperties.html":{"name":"SDLResetGlobalProperties","abstract":"<p>Resets the passed global properties to their default values as defined by"},"Classes.html#/c:objc(cs)SDLResetGlobalPropertiesResponse":{"name":"SDLResetGlobalPropertiesResponse","abstract":"<p>Response to ResetGlobalProperties</p>"},"Classes/SDLRoofStatus.html":{"name":"SDLRoofStatus","abstract":"<p>Describes the status of a parameter of roof/convertible roof/sunroof/moonroof etc. If roof is open (AJAR), state will determine percentage of roof open.</p>"},"Classes/SDLSISData.html":{"name":"SDLSISData","abstract":"<p>HD radio Station Information Service (SIS) data.</p>"},"Classes/SDLScreenManager.html":{"name":"SDLScreenManager","abstract":"<p>The SDLScreenManager is a manager to control SDL UI features. Use the screen manager for setting up the UI of the template, creating a menu for your users, creating softbuttons, setting textfields, etc..</p>"},"Classes/SDLScreenParams.html":{"name":"SDLScreenParams","abstract":"<p>A struct in DisplayCapabilities describing parameters related to a video / touch input area</p>"},"Classes/SDLScrollableMessage.html":{"name":"SDLScrollableMessage","abstract":"<p>Creates a full screen overlay containing a large block of formatted text that can be scrolled with buttons available.</p>"},"Classes.html#/c:objc(cs)SDLScrollableMessageResponse":{"name":"SDLScrollableMessageResponse","abstract":"<p>Response to SDLScrollableMessage</p>"},"Classes/SDLSeatControlCapabilities.html":{"name":"SDLSeatControlCapabilities","abstract":"<p>Include information about a seat control capabilities.</p>"},"Classes/SDLSeatControlData.html":{"name":"SDLSeatControlData","abstract":"<p>Seat control data corresponds to &ldquo;SEAT&rdquo; ModuleType.</p>"},"Classes/SDLSeatLocation.html":{"name":"SDLSeatLocation","abstract":"<p>Describes the location of a seat</p>"},"Classes/SDLSeatLocationCapability.html":{"name":"SDLSeatLocationCapability","abstract":"<p>Contains information about the locations of each seat.</p>"},"Classes/SDLSeatMemoryAction.html":{"name":"SDLSeatMemoryAction","abstract":"<p>Specify the action to be performed.</p>"},"Classes/SDLSeatOccupancy.html":{"name":"SDLSeatOccupancy","abstract":"<p>@added in SmartDeviceLink 7.1.0</p>"},"Classes/SDLSeatStatus.html":{"name":"SDLSeatStatus","abstract":"<p>Describes the status of a parameter of seat.</p>"},"Classes/SDLSeekStreamingIndicator.html":{"name":"SDLSeekStreamingIndicator","abstract":"<p>The seek next / skip previous subscription buttons&rsquo; content</p>"},"Classes/SDLSendHapticData.html":{"name":"SDLSendHapticData","abstract":"<p>Sends the spatial data gathered from SDLCarWindow or VirtualDisplayEncoder to the HMI. This data will be utilized by the HMI to determine how and when haptic events should occur.</p>"},"Classes.html#/c:objc(cs)SDLSendHapticDataResponse":{"name":"SDLSendHapticDataResponse","abstract":"<p>Response to SDLSendHapticData</p>"},"Classes/SDLSendLocation.html":{"name":"SDLSendLocation","abstract":"<p>SendLocation is used to send a location to the navigation system for navigation</p>"},"Classes.html#/c:objc(cs)SDLSendLocationResponse":{"name":"SDLSendLocationResponse","abstract":"<p>Response to SDLSendLocation</p>"},"Classes/SDLSetAppIcon.html":{"name":"SDLSetAppIcon","abstract":"<p>Used to set existing local file on SDL as the app&rsquo;s icon. Not supported on"},"Classes.html#/c:objc(cs)SDLSetAppIconResponse":{"name":"SDLSetAppIconResponse","abstract":"<p>Response to SDLSetAppIcon</p>"},"Classes/SDLSetCloudAppProperties.html":{"name":"SDLSetCloudAppProperties","abstract":"<p>RPC used to enable/disable a cloud application and set authentication data</p>"},"Classes.html#/c:objc(cs)SDLSetCloudAppPropertiesResponse":{"name":"SDLSetCloudAppPropertiesResponse","abstract":"<p>The response to SetCloudAppProperties</p>"},"Classes/SDLSetDisplayLayout.html":{"name":"SDLSetDisplayLayout","abstract":"<p>Used to set an alternate display layout. If not sent, default screen for"},"Classes/SDLSetDisplayLayoutResponse.html":{"name":"SDLSetDisplayLayoutResponse","abstract":"<p>Response to SDLSetDisplayLayout</p>"},"Classes/SDLSetGlobalProperties.html":{"name":"SDLSetGlobalProperties","abstract":"<p>Sets global property values</p>"},"Classes.html#/c:objc(cs)SDLSetGlobalPropertiesResponse":{"name":"SDLSetGlobalPropertiesResponse","abstract":"<p>Response to SDLSetGlobalProperties</p>"},"Classes/SDLSetInteriorVehicleData.html":{"name":"SDLSetInteriorVehicleData","abstract":"<p>This RPC allows a remote control type mobile application to"},"Classes/SDLSetInteriorVehicleDataResponse.html":{"name":"SDLSetInteriorVehicleDataResponse","abstract":"<p>Response to SDLSetInteriorVehicleData</p>"},"Classes/SDLSetMediaClockTimer.html":{"name":"SDLSetMediaClockTimer","abstract":"<p>Sets the media clock/timer value and the update method (e.g.count-up,"},"Classes.html#/c:objc(cs)SDLSetMediaClockTimerResponse":{"name":"SDLSetMediaClockTimerResponse","abstract":"<p>Response to SDLSetMediaClockTimer</p>"},"Classes/SDLShow.html":{"name":"SDLShow","abstract":"<p>Updates the application&rsquo;s display text area, regardless of whether or not"},"Classes/SDLShowAppMenu.html":{"name":"SDLShowAppMenu","abstract":"<p>Used by an app to show the app&rsquo;s menu, typically this is used by a navigation app if the menu button is hidden.</p>"},"Classes.html#/c:objc(cs)SDLShowAppMenuResponse":{"name":"SDLShowAppMenuResponse","abstract":"<p>Response to the request to show the app menu.</p>"},"Classes/SDLShowConstantTBT.html":{"name":"SDLShowConstantTBT","abstract":"<p>This RPC is used to update the user with navigation information for the constantly shown screen (base screen), but also for the alert maneuver screen.</p>"},"Classes.html#/c:objc(cs)SDLShowConstantTBTResponse":{"name":"SDLShowConstantTBTResponse","abstract":"<p>Response to SDLShowConstantTBT</p>"},"Classes.html#/c:objc(cs)SDLShowResponse":{"name":"SDLShowResponse","abstract":"<p>Response to SDLShow</p>"},"Classes/SDLSingleTireStatus.html":{"name":"SDLSingleTireStatus","abstract":"<p>Tire pressure status of a single tire.</p>"},"Classes/SDLSlider.html":{"name":"SDLSlider","abstract":"<p>Creates a full screen or pop-up overlay (depending on platform) with a single user controlled slider.</p>"},"Classes/SDLSliderResponse.html":{"name":"SDLSliderResponse","abstract":"<p>Response to SDLSlider</p>"},"Classes/SDLSoftButton.html":{"name":"SDLSoftButton","abstract":"<p>Describes an on-screen button which may be presented in various contexts, e.g. templates or alerts</p>"},"Classes/SDLSoftButtonCapabilities.html":{"name":"SDLSoftButtonCapabilities","abstract":"<p>Contains information about a SoftButton&rsquo;s capabilities.</p>"},"Classes/SDLSoftButtonObject.html":{"name":"SDLSoftButtonObject","abstract":"<p>A soft button wrapper object that is capable of storing and switching between states</p>"},"Classes/SDLSoftButtonState.html":{"name":"SDLSoftButtonState","abstract":"<p>A soft button state including data such as text, name and artwork</p>"},"Classes/SDLSpeak.html":{"name":"SDLSpeak","abstract":"<p>Speaks a phrase over the vehicle audio system using SDL&rsquo;s TTS (text-to-speech) engine. The provided text to be spoken can be simply a text phrase, or it can consist of phoneme specifications to direct SDL&rsquo;s TTS engine to speak a &ldquo;speech-sculpted&rdquo; phrase.</p>"},"Classes.html#/c:objc(cs)SDLSpeakResponse":{"name":"SDLSpeakResponse","abstract":"<p>Response to SDLSpeak</p>"},"Classes/SDLStabilityControlsStatus.html":{"name":"SDLStabilityControlsStatus","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLStartTime.html":{"name":"SDLStartTime","abstract":"<p>Describes the hour, minute and second values used to set the media clock.</p>"},"Classes/SDLStationIDNumber.html":{"name":"SDLStationIDNumber","abstract":"<p>Describes the hour, minute and second values used to set the media clock.</p>"},"Classes/SDLStreamingMediaConfiguration.html":{"name":"SDLStreamingMediaConfiguration","abstract":"<p>The streaming media configuration. Use this class to configure streaming media information.</p>"},"Classes/SDLStreamingMediaManager.html":{"name":"SDLStreamingMediaManager","abstract":"<p>Manager to help control streaming (video and audio) media services.</p>"},"Classes/SDLStreamingVideoScaleManager.html":{"name":"SDLStreamingVideoScaleManager","abstract":"<p>This class consolidates the logic of scaling between the view controller&rsquo;s coordinate system and the display&rsquo;s coordinate system.</p>"},"Classes/SDLSubscribeButton.html":{"name":"SDLSubscribeButton","abstract":"<p>Establishes a subscription to button notifications for HMI buttons. Buttons"},"Classes.html#/c:objc(cs)SDLSubscribeButtonResponse":{"name":"SDLSubscribeButtonResponse","abstract":"<p>Response to SDLSubscribeButton</p>"},"Classes/SDLSubscribeVehicleData.html":{"name":"SDLSubscribeVehicleData","abstract":"<p>Subscribes to specific published vehicle data items. The data will be only sent if it has changed. The application will be notified by the <code>onVehicleData</code> notification whenever new data is available. The update rate is dependent on sensors, vehicle architecture and vehicle type.</p>"},"Classes/SDLSubscribeVehicleDataResponse.html":{"name":"SDLSubscribeVehicleDataResponse","abstract":"<p>Response to SDLSubscribeVehicleData</p>"},"Classes.html#/c:objc(cs)SDLSubscribeWayPoints":{"name":"SDLSubscribeWayPoints","abstract":"<p>A SDLSubscribeWaypoints can be sent to subscribe"},"Classes.html#/c:objc(cs)SDLSubscribeWayPointsResponse":{"name":"SDLSubscribeWayPointsResponse","abstract":"<p>Response to SubscribeWayPoints</p>"},"Classes/SDLSubtleAlert.html":{"name":"SDLSubtleAlert","abstract":"<p>Shows an alert which typically consists of text-to-speech message and text on the display. At least either alertText1, alertText2 or TTSChunks need to be provided.</p>"},"Classes/SDLSubtleAlertResponse.html":{"name":"SDLSubtleAlertResponse","abstract":"<p>@since SDL 7.0.0</p>"},"Classes.html#/c:objc(cs)SDLSyncPData":{"name":"SDLSyncPData","abstract":"<p>Allows binary data in the form of SyncP packets to be sent to the SYNC module. Binary data is in binary part of hybrid msg.</p>"},"Classes.html#/c:objc(cs)SDLSyncPDataResponse":{"name":"SDLSyncPDataResponse","abstract":"<p>Response to SyncPData</p>"},"Classes/SDLSystemCapability.html":{"name":"SDLSystemCapability","abstract":"<p>The systemCapabilityType indicates which type of data should be changed and identifies which data object exists in this struct. For example, if the SystemCapability Type is NAVIGATION then a &ldquo;navigationCapability&rdquo; should exist.</p>"},"Classes/SDLSystemCapabilityManager.html":{"name":"SDLSystemCapabilityManager","abstract":"<p>A manager that handles updating and subscribing to SDL capabilities.</p>"},"Classes/SDLSystemInfo.html":{"name":"SDLSystemInfo","abstract":"<p>Basic information about the connected module system</p>"},"Classes/SDLSystemRequest.html":{"name":"SDLSystemRequest","abstract":"<p>An asynchronous request from the device; binary data can be included in hybrid part of message for some requests (such as HTTP, Proprietary, or Authentication requests)</p>"},"Classes.html#/c:objc(cs)SDLSystemRequestResponse":{"name":"SDLSystemRequestResponse","abstract":"<p>Response to SystemRequest</p>"},"Classes/SDLTTSChunk.html":{"name":"SDLTTSChunk","abstract":"<p>Specifies what is to be spoken. This can be simply a text phrase, which SDL will speak according to its own rules. It can also be phonemes from either the Microsoft SAPI phoneme set, or from the LHPLUS phoneme set. It can also be a pre-recorded sound in WAV format (either developer-defined, or provided by the SDL platform).</p>"},"Classes/SDLTemperature.html":{"name":"SDLTemperature","abstract":"<p>Struct representing a temperature.</p>"},"Classes/SDLTemplateColorScheme.html":{"name":"SDLTemplateColorScheme","abstract":"<p>A color scheme for all display layout templates.</p>"},"Classes/SDLTemplateConfiguration.html":{"name":"SDLTemplateConfiguration","abstract":"<p>Used to set an alternate template layout to a window.</p>"},"Classes/SDLTextField.html":{"name":"SDLTextField","abstract":"<p>Struct defining the characteristics of a displayed field on the HMI.</p>"},"Classes/SDLTireStatus.html":{"name":"SDLTireStatus","abstract":"<p>Struct used in Vehicle Data; the status and pressure of the tires.</p>"},"Classes/SDLTouch.html":{"name":"SDLTouch","abstract":"<p>Describes a touch location</p>"},"Classes/SDLTouchCoord.html":{"name":"SDLTouchCoord","abstract":"<p>The coordinate of a touch, used in a touch event</p>"},"Classes/SDLTouchEvent.html":{"name":"SDLTouchEvent","abstract":"<p>A touch which occurred on the IVI system during projection</p>"},"Classes/SDLTouchEventCapabilities.html":{"name":"SDLTouchEventCapabilities","abstract":"<p>The capabilities of touches during projection applications</p>"},"Classes/SDLTouchManager.html":{"name":"SDLTouchManager","abstract":"<p>Touch Manager responsible for processing touch event notifications.</p>"},"Classes/SDLTurn.html":{"name":"SDLTurn","abstract":"<p>A struct used in UpdateTurnList for Turn-by-Turn navigation applications</p>"},"Classes/SDLUnpublishAppService.html":{"name":"SDLUnpublishAppService","abstract":"<p>Unpublish an existing service published by this application.</p>"},"Classes.html#/c:objc(cs)SDLUnpublishAppServiceResponse":{"name":"SDLUnpublishAppServiceResponse","abstract":"<p>The response to UnpublishAppService</p>"},"Classes.html#/c:objc(cs)SDLUnregisterAppInterface":{"name":"SDLUnregisterAppInterface","abstract":"<p>Terminates an application&rsquo;s interface registration. This causes SDL&reg; to"},"Classes.html#/c:objc(cs)SDLUnregisterAppInterfaceResponse":{"name":"SDLUnregisterAppInterfaceResponse","abstract":"<p>Response to UnregisterAppInterface</p>"},"Classes/SDLUnsubscribeButton.html":{"name":"SDLUnsubscribeButton","abstract":"<p>Deletes a subscription to button notifications for the specified button. For"},"Classes.html#/c:objc(cs)SDLUnsubscribeButtonResponse":{"name":"SDLUnsubscribeButtonResponse","abstract":"<p>Response to UnsubscribeButton</p>"},"Classes/SDLUnsubscribeVehicleData.html":{"name":"SDLUnsubscribeVehicleData","abstract":"<p>This function is used to unsubscribe the notifications from the"},"Classes/SDLUnsubscribeVehicleDataResponse.html":{"name":"SDLUnsubscribeVehicleDataResponse","abstract":"<p>Response to UnsubscribeVehicleData</p>"},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPoints":{"name":"SDLUnsubscribeWayPoints","abstract":"<p>Request to unsubscribe from navigation WayPoints and Destination</p>"},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPointsResponse":{"name":"SDLUnsubscribeWayPointsResponse","abstract":"<p>Response to UnsubscribeWayPoints</p>"},"Classes/SDLUpdateTurnList.html":{"name":"SDLUpdateTurnList","abstract":"<p>Updates the list of next maneuvers, which can be requested by the user pressing the softbutton<br></p>"},"Classes.html#/c:objc(cs)SDLUpdateTurnListResponse":{"name":"SDLUpdateTurnListResponse","abstract":"<p>Response to UpdateTurnList</p>"},"Classes/SDLVehicleDataResult.html":{"name":"SDLVehicleDataResult","abstract":"<p>Individual published data request result</p>"},"Classes/SDLVehicleType.html":{"name":"SDLVehicleType","abstract":"<p>Describes the type of vehicle the mobile phone is connected with.</p>"},"Classes/SDLVersion.html":{"name":"SDLVersion","abstract":"<p>Specifies a major / minor / patch version number for semantic versioning purposes and comparisons</p>"},"Classes/SDLVideoStreamingCapability.html":{"name":"SDLVideoStreamingCapability","abstract":"<p>Contains information about this system&rsquo;s video streaming capabilities</p>"},"Classes/SDLVideoStreamingFormat.html":{"name":"SDLVideoStreamingFormat","abstract":"<p>An available format for video streaming in projection applications</p>"},"Classes/SDLVideoStreamingRange.html":{"name":"SDLVideoStreamingRange","abstract":"<p>A range of supported video streaming sizes from minimum to maximum</p>"},"Classes/SDLVoiceCommand.html":{"name":"SDLVoiceCommand","abstract":"<p>Voice commands available for the user to speak and be recognized by the IVI&rsquo;s voice recognition engine.</p>"},"Classes/SDLVRHelpItem.html":{"name":"SDLVRHelpItem","abstract":"<p>A help item for voice commands, used locally in interaction lists and globally</p>"},"Classes/SDLWeatherAlert.html":{"name":"SDLWeatherAlert","abstract":"<p>Contains information about a weather alert</p>"},"Classes/SDLWeatherData.html":{"name":"SDLWeatherData","abstract":"<p>Contains information about the current weather</p>"},"Classes/SDLWeatherServiceData.html":{"name":"SDLWeatherServiceData","abstract":"<p>This data is related to what a weather service would provide.</p>"},"Classes/SDLWeatherServiceManifest.html":{"name":"SDLWeatherServiceManifest","abstract":"<p>A weather service manifest.</p>"},"Classes/SDLWindowCapability.html":{"name":"SDLWindowCapability","abstract":"<p>Reflects content of DisplayCapabilities, ButtonCapabilities and SoftButtonCapabilities</p>"},"Classes/SDLWindowState.html":{"name":"SDLWindowState","abstract":"<p>@since SDL 7.0.0</p>"},"Classes/SDLWindowStatus.html":{"name":"SDLWindowStatus","abstract":"<p>Describes the status of a window of a door/liftgate etc.</p>"},"Classes/SDLWindowTypeCapabilities.html":{"name":"SDLWindowTypeCapabilities","abstract":"<p>Used to inform an app how many window instances per type that can be created.</p>"},"Categories/NSString%28SDLEnum%29.html#/c:objc(cs)NSString(im)isEqualToEnum:":{"name":"-isEqualToEnum:","abstract":"<p>Returns whether or not two enums are equal.</p>","parent_name":"NSString(SDLEnum)"},"Categories/NSString%28SDLEnum%29.html":{"name":"NSString(SDLEnum)","abstract":"<p>Extensions to NSString specifically for SDL string enums</p>"},"Categories.html":{"name":"Categories","abstract":"<p>The following categories are available globally.</p>"},"Classes.html":{"name":"Classes","abstract":"<p>The following classes are available globally.</p>"},"Constants.html":{"name":"Constants","abstract":"<p>The following constants are available globally.</p>"},"Enums.html":{"name":"Enumerations","abstract":"<p>The following enumerations are available globally.</p>"},"Protocols.html":{"name":"Protocols","abstract":"<p>The following protocols are available globally.</p>"},"Type%20Definitions.html":{"name":"Type Definitions","abstract":"<p>The following type definitions are available globally.</p>"}} \ No newline at end of file
diff --git a/docs/undocumented.json b/docs/undocumented.json
index 2cbeb3f47..6eb64d1f3 100644
--- a/docs/undocumented.json
+++ b/docs/undocumented.json
@@ -1,229 +1,6 @@
{
"warnings": [
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLAlertAudioData.h",
- "line": 13,
- "symbol": "SDLAlertAudioData",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLAlertAudioData.h",
- "line": 18,
- "symbol": "SDLAlertAudioData.-init",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLAlertView.h",
- "line": 22,
- "symbol": "SDLAlertView",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLAlertView.h",
- "line": 53,
- "symbol": "SDLAlertView.-init",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLAppCapabilityType.h",
- "line": 42,
- "symbol": "SDLAppCapabilityTypeVideoStreaming",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLAudioData.h",
- "line": 18,
- "symbol": "SDLAudioData",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLAudioData.h",
- "line": 38,
- "symbol": "SDLAudioData.-init",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLBodyInformation.h",
- "line": 16,
- "symbol": "SDLBodyInformation",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLDoorStatus.h",
- "line": 54,
- "symbol": "SDLDoorStatus.location",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLDoorStatus.h",
- "line": 56,
- "symbol": "SDLDoorStatus.status",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLDoorStatusType.h",
- "line": 40,
- "symbol": "SDLDoorStatusTypeClosed",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLDoorStatusType.h",
- "line": 42,
- "symbol": "SDLDoorStatusTypeLocked",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLDoorStatusType.h",
- "line": 44,
- "symbol": "SDLDoorStatusTypeAjar",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLDoorStatusType.h",
- "line": 46,
- "symbol": "SDLDoorStatusTypeRemoved",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLGateStatus.h",
- "line": 54,
- "symbol": "SDLGateStatus.location",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLGateStatus.h",
- "line": 56,
- "symbol": "SDLGateStatus.status",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLKeyboardInputMask.h",
- "line": 42,
- "symbol": "SDLKeyboardInputMaskEnableInputKeyMask",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLKeyboardInputMask.h",
- "line": 44,
- "symbol": "SDLKeyboardInputMaskDisableInputKeyMask",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLKeyboardInputMask.h",
- "line": 46,
- "symbol": "SDLKeyboardInputMaskUserChoiceInputKeyMask",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h",
- "line": 52,
- "symbol": "SDLKeyboardLayoutCapability.keyboardLayout",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLRoofStatus.h",
- "line": 63,
- "symbol": "SDLRoofStatus.location",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLRoofStatus.h",
- "line": 65,
- "symbol": "SDLRoofStatus.status",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLRoofStatus.h",
- "line": 67,
- "symbol": "SDLRoofStatus.state",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLSeatStatus.h",
- "line": 53,
- "symbol": "SDLSeatStatus.seatLocation",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLSeatStatus.h",
- "line": 55,
- "symbol": "SDLSeatStatus.conditionActive",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLSeekIndicatorType.h",
- "line": 40,
- "symbol": "SDLSeekIndicatorTypeTrack",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLSeekIndicatorType.h",
- "line": 41,
- "symbol": "SDLSeekIndicatorTypeTime",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.constant",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLSeekStreamingIndicator.h",
- "line": 64,
- "symbol": "SDLSeekStreamingIndicator.type",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.property",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLStreamingVideoDelegate.h",
- "line": 12,
- "symbol": "SDLStreamingVideoDelegate",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.protocol",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLStreamingVideoDelegate.h",
- "line": 14,
- "symbol": "SDLStreamingVideoDelegate.-videoStreamingSizeDidUpdate:",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLSystemInfo.h",
- "line": 15,
- "symbol": "SDLSystemInfo",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
- "warning": "undocumented"
- },
- {
- "file": "/Users/frankelias/Desktop/Generator/sdl_ios/SmartDeviceLink/public/SDLVideoStreamingRange.h",
- "line": 14,
- "symbol": "SDLVideoStreamingRange",
- "symbol_kind": "sourcekitten.source.lang.objc.decl.class",
- "warning": "undocumented"
- }
+
],
- "source_directory": "/Users/frankelias/Desktop/Generator/sdl_ios"
+ "source_directory": "/Users/joelfischer/Developer/livio/sdl/sdl_ios"
} \ No newline at end of file
diff --git a/generator/rpc_spec b/generator/rpc_spec
-Subproject 6b98355357b5b1893bbb59cb668d28545023457
+Subproject 6537500b45f65e02d884da9d73d6820ba7b0b1f