summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Fischer <joeljfischer@gmail.com>2016-11-03 16:00:34 -0400
committerJoel Fischer <joeljfischer@gmail.com>2016-11-03 16:00:34 -0400
commit63f0945009fae4896cabb28e124153201c15e9a3 (patch)
tree7dd94df03cd12cd706f921eacef9d56702702671
parente7845f4bf9ddeb0fe8a4a2b42d25a88d6ae7429a (diff)
parent0659da3ae4fc2b69ab04aadb1b5d9314616a025d (diff)
downloadsdl_ios-63f0945009fae4896cabb28e124153201c15e9a3.tar.gz
Merge branch 'release/4.3.0'4.3.0
-rw-r--r--.clang-format5
-rw-r--r--.gitattributes1
-rw-r--r--.travis.yml10
-rw-r--r--.xctool-args7
-rw-r--r--CHANGELOG.md163
-rw-r--r--Cartfile.private1
-rw-r--r--Cartfile.resolved1
-rw-r--r--DEPENDENCIES.md35
-rw-r--r--README.md118
-rw-r--r--SmartDeviceLink-iOS.podspec266
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/project.pbxproj1015
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme10
-rw-r--r--SmartDeviceLink/Assets/Base.lproj/SDLLockScreen.storyboard111
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/Contents.json6
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/Contents.json23
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black.pngbin0 -> 302 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black@2x.pngbin0 -> 498 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black@3x.pngbin0 -> 730 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/Contents.json23
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white.pngbin0 -> 309 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white@2x.pngbin0 -> 498 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white@3x.pngbin0 -> 729 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/Contents.json23
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black.pngbin0 -> 312 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black@2x.pngbin0 -> 498 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black@3x.pngbin0 -> 724 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/Contents.json23
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white.pngbin0 -> 308 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white@2x.pngbin0 -> 503 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white@3x.pngbin0 -> 726 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/Contents.json23
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black.pngbin0 -> 2289 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black@2x.pngbin0 -> 4889 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black@3x.pngbin0 -> 7137 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/Contents.json23
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white.pngbin0 -> 2282 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white@2x.pngbin0 -> 4931 bytes
-rw-r--r--SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white@3x.pngbin0 -> 7137 bytes
-rw-r--r--SmartDeviceLink/Assets/de.lproj/SDLLockScreen.strings3
-rw-r--r--SmartDeviceLink/Assets/en.lproj/SDLLockScreen.strings3
-rw-r--r--SmartDeviceLink/Assets/es.lproj/SDLLockScreen.strings3
-rw-r--r--SmartDeviceLink/Assets/fr.lproj/SDLLockScreen.strings3
-rw-r--r--SmartDeviceLink/Assets/ja.lproj/SDLLockScreen.strings3
-rw-r--r--SmartDeviceLink/Assets/zh-Hans.lproj/SDLLockScreen.strings3
-rw-r--r--SmartDeviceLink/Info.plist2
-rw-r--r--SmartDeviceLink/NSBundle+SDLBundle.h19
-rw-r--r--SmartDeviceLink/NSBundle+SDLBundle.m36
-rw-r--r--SmartDeviceLink/NSMapTable+Subscripting.h23
-rw-r--r--SmartDeviceLink/NSMapTable+Subscripting.m25
-rw-r--r--SmartDeviceLink/NSMutableDictionary+SafeRemove.h37
-rw-r--r--SmartDeviceLink/NSMutableDictionary+SafeRemove.m37
-rw-r--r--SmartDeviceLink/NSNumber+NumberType.h37
-rw-r--r--SmartDeviceLink/SDLAddCommand.h30
-rw-r--r--SmartDeviceLink/SDLAddCommand.m49
-rw-r--r--SmartDeviceLink/SDLAddSubMenu.h4
-rw-r--r--SmartDeviceLink/SDLAddSubMenu.m24
-rw-r--r--SmartDeviceLink/SDLAlert.h23
-rw-r--r--SmartDeviceLink/SDLAlert.m57
-rw-r--r--SmartDeviceLink/SDLAlertManeuver.h7
-rw-r--r--SmartDeviceLink/SDLAlertManeuver.m18
-rw-r--r--SmartDeviceLink/SDLAppInfo.h2
-rw-r--r--SmartDeviceLink/SDLAppInfo.m16
-rw-r--r--SmartDeviceLink/SDLArtwork.h70
-rw-r--r--SmartDeviceLink/SDLArtwork.m58
-rw-r--r--SmartDeviceLink/SDLAsynchronousOperation.h15
-rw-r--r--SmartDeviceLink/SDLAsynchronousOperation.m53
-rw-r--r--SmartDeviceLink/SDLChangeRegistration.h4
-rw-r--r--SmartDeviceLink/SDLChangeRegistration.m25
-rw-r--r--SmartDeviceLink/SDLChoice.h4
-rw-r--r--SmartDeviceLink/SDLChoice.m27
-rw-r--r--SmartDeviceLink/SDLConfiguration.h50
-rw-r--r--SmartDeviceLink/SDLConfiguration.m42
-rw-r--r--SmartDeviceLink/SDLConnectionManagerType.h29
-rw-r--r--SmartDeviceLink/SDLConsoleController.m2
-rw-r--r--SmartDeviceLink/SDLCreateInteractionChoiceSet.h4
-rw-r--r--SmartDeviceLink/SDLCreateInteractionChoiceSet.m11
-rw-r--r--SmartDeviceLink/SDLDebugTool.h3
-rw-r--r--SmartDeviceLink/SDLDebugTool.m35
-rw-r--r--SmartDeviceLink/SDLDeleteCommand.h2
-rw-r--r--SmartDeviceLink/SDLDeleteCommand.m11
-rw-r--r--SmartDeviceLink/SDLDeleteFile.h2
-rw-r--r--SmartDeviceLink/SDLDeleteFile.m11
-rw-r--r--SmartDeviceLink/SDLDeleteFileOperation.h34
-rw-r--r--SmartDeviceLink/SDLDeleteFileOperation.m80
-rw-r--r--SmartDeviceLink/SDLDeleteInteractionChoiceSet.h2
-rw-r--r--SmartDeviceLink/SDLDeleteInteractionChoiceSet.m11
-rw-r--r--SmartDeviceLink/SDLDeleteSubMenu.h2
-rw-r--r--SmartDeviceLink/SDLDeleteSubMenu.m11
-rw-r--r--SmartDeviceLink/SDLDeviceInfo.h2
-rw-r--r--SmartDeviceLink/SDLDeviceInfo.m20
-rw-r--r--SmartDeviceLink/SDLDiagnosticMessage.h2
-rw-r--r--SmartDeviceLink/SDLDiagnosticMessage.m13
-rw-r--r--SmartDeviceLink/SDLDialNumber.h2
-rw-r--r--SmartDeviceLink/SDLDialNumber.m11
-rw-r--r--SmartDeviceLink/SDLEnum.h2
-rw-r--r--SmartDeviceLink/SDLEnum.m10
-rw-r--r--SmartDeviceLink/SDLError.h51
-rw-r--r--SmartDeviceLink/SDLError.m157
-rw-r--r--SmartDeviceLink/SDLErrorConstants.h61
-rw-r--r--SmartDeviceLink/SDLFile.h134
-rw-r--r--SmartDeviceLink/SDLFile.m133
-rw-r--r--SmartDeviceLink/SDLFileManager.h109
-rw-r--r--SmartDeviceLink/SDLFileManager.m310
-rw-r--r--SmartDeviceLink/SDLFileManagerConstants.h17
-rw-r--r--SmartDeviceLink/SDLFileWrapper.h30
-rw-r--r--SmartDeviceLink/SDLFileWrapper.m36
-rw-r--r--SmartDeviceLink/SDLGetDTCs.h5
-rw-r--r--SmartDeviceLink/SDLGetDTCs.m22
-rw-r--r--SmartDeviceLink/SDLGetVehicleData.h3
-rw-r--r--SmartDeviceLink/SDLGetVehicleData.m35
-rw-r--r--SmartDeviceLink/SDLGlobals.h1
-rw-r--r--SmartDeviceLink/SDLImage.h2
-rw-r--r--SmartDeviceLink/SDLImage.m12
-rw-r--r--SmartDeviceLink/SDLKeyboardProperties.h2
-rw-r--r--SmartDeviceLink/SDLKeyboardProperties.m15
-rw-r--r--SmartDeviceLink/SDLLifecycleConfiguration.h142
-rw-r--r--SmartDeviceLink/SDLLifecycleConfiguration.m121
-rw-r--r--SmartDeviceLink/SDLLifecycleManager.h120
-rw-r--r--SmartDeviceLink/SDLLifecycleManager.m466
-rw-r--r--SmartDeviceLink/SDLListFilesOperation.h33
-rw-r--r--SmartDeviceLink/SDLListFilesOperation.m78
-rw-r--r--SmartDeviceLink/SDLLockScreenConfiguration.h80
-rw-r--r--SmartDeviceLink/SDLLockScreenConfiguration.m80
-rw-r--r--SmartDeviceLink/SDLLockScreenManager.h59
-rw-r--r--SmartDeviceLink/SDLLockScreenManager.m154
-rw-r--r--SmartDeviceLink/SDLLockScreenPresenter.h32
-rw-r--r--SmartDeviceLink/SDLLockScreenPresenter.m57
-rw-r--r--SmartDeviceLink/SDLLockScreenStatusManager.h21
-rw-r--r--SmartDeviceLink/SDLLockScreenStatusManager.m95
-rw-r--r--SmartDeviceLink/SDLLockScreenViewController.h32
-rw-r--r--SmartDeviceLink/SDLLockScreenViewController.m198
-rw-r--r--SmartDeviceLink/SDLManager.h119
-rw-r--r--SmartDeviceLink/SDLManager.m115
-rw-r--r--SmartDeviceLink/SDLManagerDelegate.h34
-rw-r--r--SmartDeviceLink/SDLMenuParams.h3
-rw-r--r--SmartDeviceLink/SDLMenuParams.m23
-rw-r--r--SmartDeviceLink/SDLNotificationConstants.h137
-rw-r--r--SmartDeviceLink/SDLNotificationConstants.m136
-rw-r--r--SmartDeviceLink/SDLNotificationDispatcher.h37
-rw-r--r--SmartDeviceLink/SDLNotificationDispatcher.m313
-rw-r--r--SmartDeviceLink/SDLPerformAudioPassThru.h4
-rw-r--r--SmartDeviceLink/SDLPerformAudioPassThru.m29
-rw-r--r--SmartDeviceLink/SDLPerformInteraction.h16
-rw-r--r--SmartDeviceLink/SDLPerformInteraction.m54
-rw-r--r--SmartDeviceLink/SDLPermissionConstants.h62
-rw-r--r--SmartDeviceLink/SDLPermissionFilter.h71
-rw-r--r--SmartDeviceLink/SDLPermissionFilter.m81
-rw-r--r--SmartDeviceLink/SDLPermissionManager.h89
-rw-r--r--SmartDeviceLink/SDLPermissionManager.m342
-rw-r--r--SmartDeviceLink/SDLPolicyDataParser.m6
-rw-r--r--SmartDeviceLink/SDLProtocolHeader.m2
-rw-r--r--SmartDeviceLink/SDLProtocolMessage.m4
-rw-r--r--SmartDeviceLink/SDLProtocolMessageAssembler.m5
-rw-r--r--SmartDeviceLink/SDLProxy.h4
-rw-r--r--SmartDeviceLink/SDLProxy.m16
-rw-r--r--SmartDeviceLink/SDLProxyFactory.h4
-rw-r--r--SmartDeviceLink/SDLProxyListener.h2
-rw-r--r--SmartDeviceLink/SDLPutFile.h6
-rw-r--r--SmartDeviceLink/SDLPutFile.m36
-rw-r--r--SmartDeviceLink/SDLRPCNotificationNotification.h24
-rw-r--r--SmartDeviceLink/SDLRPCNotificationNotification.m36
-rw-r--r--SmartDeviceLink/SDLRPCPayload.m11
-rw-r--r--SmartDeviceLink/SDLRPCRequestFactory.h138
-rw-r--r--SmartDeviceLink/SDLRPCRequestFactory.m82
-rw-r--r--SmartDeviceLink/SDLRPCResponseNotification.h24
-rw-r--r--SmartDeviceLink/SDLRPCResponseNotification.m33
-rw-r--r--SmartDeviceLink/SDLRPCStruct.h2
-rw-r--r--SmartDeviceLink/SDLRPCStruct.m1
-rw-r--r--SmartDeviceLink/SDLReadDID.h2
-rw-r--r--SmartDeviceLink/SDLReadDID.m12
-rw-r--r--SmartDeviceLink/SDLRegisterAppInterface.h13
-rw-r--r--SmartDeviceLink/SDLRegisterAppInterface.m41
-rw-r--r--SmartDeviceLink/SDLRequestHandler.h33
-rw-r--r--SmartDeviceLink/SDLResetGlobalProperties.h4
-rw-r--r--SmartDeviceLink/SDLResetGlobalProperties.m11
-rw-r--r--SmartDeviceLink/SDLResponseDispatcher.h77
-rw-r--r--SmartDeviceLink/SDLResponseDispatcher.m216
-rw-r--r--SmartDeviceLink/SDLScrollableMessage.h6
-rw-r--r--SmartDeviceLink/SDLScrollableMessage.m23
-rw-r--r--SmartDeviceLink/SDLSendLocation.h3
-rw-r--r--SmartDeviceLink/SDLSendLocation.m17
-rw-r--r--SmartDeviceLink/SDLSetAppIcon.h3
-rw-r--r--SmartDeviceLink/SDLSetAppIcon.m11
-rw-r--r--SmartDeviceLink/SDLSetDisplayLayout.h7
-rw-r--r--SmartDeviceLink/SDLSetDisplayLayout.m16
-rw-r--r--SmartDeviceLink/SDLSetGlobalProperties.h6
-rw-r--r--SmartDeviceLink/SDLSetGlobalProperties.m27
-rw-r--r--SmartDeviceLink/SDLSetMediaClockTimer.h4
-rw-r--r--SmartDeviceLink/SDLSetMediaClockTimer.m23
-rw-r--r--SmartDeviceLink/SDLShow.h10
-rw-r--r--SmartDeviceLink/SDLShow.m33
-rw-r--r--SmartDeviceLink/SDLShowConstantTBT.h5
-rw-r--r--SmartDeviceLink/SDLShowConstantTBT.m21
-rw-r--r--SmartDeviceLink/SDLSiphonServer.m30
-rw-r--r--SmartDeviceLink/SDLSlider.h6
-rw-r--r--SmartDeviceLink/SDLSlider.m36
-rw-r--r--SmartDeviceLink/SDLSoftButton.h10
-rw-r--r--SmartDeviceLink/SDLSoftButton.m28
-rw-r--r--SmartDeviceLink/SDLSpeak.h6
-rw-r--r--SmartDeviceLink/SDLSpeak.m17
-rw-r--r--SmartDeviceLink/SDLStartTime.h2
-rw-r--r--SmartDeviceLink/SDLStartTime.m13
-rw-r--r--SmartDeviceLink/SDLStateMachine.h102
-rw-r--r--SmartDeviceLink/SDLStateMachine.m142
-rw-r--r--SmartDeviceLink/SDLStreamingMediaManager.m19
-rw-r--r--SmartDeviceLink/SDLSubscribeButton.h28
-rw-r--r--SmartDeviceLink/SDLSubscribeButton.m23
-rw-r--r--SmartDeviceLink/SDLSubscribeVehicleData.h2
-rw-r--r--SmartDeviceLink/SDLSubscribeVehicleData.m34
-rw-r--r--SmartDeviceLink/SDLSyncMsgVersion.h2
-rw-r--r--SmartDeviceLink/SDLSyncMsgVersion.m12
-rw-r--r--SmartDeviceLink/SDLSystemRequest.h2
-rw-r--r--SmartDeviceLink/SDLSystemRequest.m12
-rw-r--r--SmartDeviceLink/SDLTTSChunk.h13
-rw-r--r--SmartDeviceLink/SDLTTSChunk.m40
-rw-r--r--SmartDeviceLink/SDLTTSChunkFactory.h6
-rw-r--r--SmartDeviceLink/SDLTTSChunkFactory.m4
-rw-r--r--SmartDeviceLink/SDLTurn.h2
-rw-r--r--SmartDeviceLink/SDLTurn.m12
-rw-r--r--SmartDeviceLink/SDLUnsubscribeButton.h2
-rw-r--r--SmartDeviceLink/SDLUnsubscribeButton.m11
-rw-r--r--SmartDeviceLink/SDLUnsubscribeVehicleData.h2
-rw-r--r--SmartDeviceLink/SDLUnsubscribeVehicleData.m34
-rw-r--r--SmartDeviceLink/SDLUpdateTurnList.h5
-rw-r--r--SmartDeviceLink/SDLUpdateTurnList.m12
-rw-r--r--SmartDeviceLink/SDLUploadFileOperation.h35
-rw-r--r--SmartDeviceLink/SDLUploadFileOperation.m175
-rw-r--r--SmartDeviceLink/SDLV2ProtocolHeader.m4
-rw-r--r--SmartDeviceLink/SDLV2ProtocolMessage.m2
-rw-r--r--SmartDeviceLink/SDLViewControllerPresentable.h22
-rw-r--r--SmartDeviceLink/SDLVrHelpItem.h4
-rw-r--r--SmartDeviceLink/SDLVrHelpItem.m23
-rw-r--r--SmartDeviceLink/SmartDeviceLink.h36
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black.pngbin0 -> 302 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black@2x.pngbin0 -> 498 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black@3x.pngbin0 -> 730 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white.pngbin0 -> 309 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white@2x.pngbin0 -> 498 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white@3x.pngbin0 -> 729 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black.pngbin0 -> 312 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black@2x.pngbin0 -> 498 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black@3x.pngbin0 -> 724 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white.pngbin0 -> 308 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white@2x.pngbin0 -> 503 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white@3x.pngbin0 -> 726 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black.pngbin0 -> 2289 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black@2x.pngbin0 -> 4889 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black@3x.pngbin0 -> 7137 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white.pngbin0 -> 2282 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white@2x.pngbin0 -> 4931 bytes
-rw-r--r--SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white@3x.pngbin0 -> 7137 bytes
-rw-r--r--SmartDeviceLinkTests/Assets/TestLockScreenAppIcon.pngbin0 -> 11088 bytes
-rw-r--r--SmartDeviceLinkTests/Assets/testFileJSON.json4
-rw-r--r--SmartDeviceLinkTests/Assets/testImageBMP.bmpbin0 -> 2621494 bytes
-rw-r--r--SmartDeviceLinkTests/Assets/testImageJPEG.jpegbin0 -> 3064686 bytes
-rw-r--r--SmartDeviceLinkTests/Assets/testImageJPG.jpgbin0 -> 3064686 bytes
-rw-r--r--SmartDeviceLinkTests/Assets/testImagePNG.pngbin0 -> 180132 bytes
-rw-r--r--SmartDeviceLinkTests/Assets/testImageTIFF.tiffbin0 -> 199698 bytes
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/NSMapTable+SubscriptingSpec.m32
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLArtworkSpec.m93
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLConfigurationSpec.m60
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLDeleteFileOperationSpec.m100
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.h18
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.m33
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m416
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLFileSpec.m220
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleConfigurationSpec.m165
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m328
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLListFilesOperationSpec.m108
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenConfigurationSpec.m78
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenManagerSpec.m206
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenViewControllerSnapshotTests.m80
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLNotificationDispatcherSpec.m105
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPermissionFilterSpec.m157
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m887
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLResponseDispatcherSpec.m647
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLStateMachineSpec.m144
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m160
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m2
-rw-r--r--SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolReceivedMessageRouterSpec.m6
-rw-r--r--SmartDeviceLinkTests/ProxySpecs/SDLLockScreenStatusManagerSpec.m (renamed from SmartDeviceLinkTests/ProxySpecs/SDLLockScreenManagerSpec.m)12
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/FactorySpecs/SDLRPCRequestFactorySpec.m22
-rw-r--r--SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testAppAndVehicleIcons@2x.pngbin0 -> 127532 bytes
-rw-r--r--SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testLightBackgroundNoAppNoVehicleIcons@2x.pngbin0 -> 43302 bytes
-rw-r--r--SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testNoAppNoVehicleIcons@2x.pngbin0 -> 46044 bytes
-rw-r--r--SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testOnlyAppIcon@2x.pngbin0 -> 42523 bytes
-rw-r--r--SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testOnlyVehicleIcon@2x.pngbin0 -> 94207 bytes
-rw-r--r--SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h51
-rw-r--r--SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m64
-rw-r--r--SmartDeviceLinkTests/TestUtilities/TestStateMachineTarget.h34
-rw-r--r--SmartDeviceLinkTests/TestUtilities/TestStateMachineTarget.m41
-rw-r--r--SmartDeviceLinkTests/UtilitiesSpecs/Touches/SDLTouchManagerSpec.m2
-rw-r--r--SmartDeviceLink_Example/Base.lproj/LaunchScreen.xib29
-rw-r--r--SmartDeviceLink_Example/Base.lproj/Main.storyboard4
-rw-r--r--SmartDeviceLink_Example/Classes/AppDelegate.m1
-rw-r--r--SmartDeviceLink_Example/Classes/ConnectionIAPTableViewController.m28
-rw-r--r--SmartDeviceLink_Example/Classes/ConnectionTCPTableViewController.m32
-rw-r--r--SmartDeviceLink_Example/Classes/ConnectionTransitionContext.m1
-rw-r--r--SmartDeviceLink_Example/Classes/Preferences.h2
-rw-r--r--SmartDeviceLink_Example/Classes/Preferences.m31
-rw-r--r--SmartDeviceLink_Example/Classes/ProxyManager.h12
-rw-r--r--SmartDeviceLink_Example/Classes/ProxyManager.m364
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Contents.json26
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@2x-1.pngbin0 -> 5279 bytes
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@2x.pngbin0 -> 5279 bytes
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@3x.pngbin0 -> 8132 bytes
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.pngbin0 -> 3537 bytes
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.pngbin0 -> 2403 bytes
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.pngbin0 -> 3728 bytes
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/Contents.json6
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/Contents.json23
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green.pngbin0 -> 6530 bytes
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green@2x.pngbin0 -> 13966 bytes
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green@3x.pngbin0 -> 22723 bytes
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/sdl_softbutton_icon.imageset/Contents.json21
-rw-r--r--SmartDeviceLink_Example/Images.xcassets/sdl_softbutton_icon.imageset/sdl_softbutton_icon.pngbin0 -> 1631 bytes
-rw-r--r--SmartDeviceLink_Example/Info.plist32
-rw-r--r--docs/Categories.html26
-rw-r--r--docs/Classes.html178
-rw-r--r--docs/Classes/SDLAddCommand.html55
-rw-r--r--docs/Classes/SDLArtwork.html153
-rw-r--r--docs/Classes/SDLConfiguration.html122
-rw-r--r--docs/Classes/SDLDebugTool.html36
-rw-r--r--docs/Classes/SDLFile.html388
-rw-r--r--docs/Classes/SDLFileManager.html291
-rw-r--r--docs/Classes/SDLLifecycleConfiguration.html413
-rw-r--r--docs/Classes/SDLLockScreenConfiguration.html230
-rw-r--r--docs/Classes/SDLLockScreenViewController.html62
-rw-r--r--docs/Classes/SDLManager.html277
-rw-r--r--docs/Classes/SDLNotificationConstants.html38
-rw-r--r--docs/Classes/SDLPermissionManager.html247
-rw-r--r--docs/Classes/SDLRPCNotificationNotification.html38
-rw-r--r--docs/Classes/SDLRPCRequestFactory.html60
-rw-r--r--docs/Classes/SDLRPCResponseNotification.html38
-rw-r--r--docs/Classes/SDLSoftButton.html24
-rw-r--r--docs/Classes/SDLSubscribeButton.html62
-rw-r--r--docs/Constants.html780
-rw-r--r--docs/Enums.html106
-rw-r--r--docs/Enums/SDLArtworkImageFormat.html38
-rw-r--r--docs/Enums/SDLFileManagerError.html52
-rw-r--r--docs/Enums/SDLLogOutput.html62
-rw-r--r--docs/Enums/SDLManagerError.html128
-rw-r--r--docs/Enums/SDLPermissionGroupStatus.html90
-rw-r--r--docs/Enums/SDLPermissionGroupType.html52
-rw-r--r--docs/Protocols.html102
-rw-r--r--docs/Protocols/SDLManagerDelegate.html62
-rw-r--r--docs/Protocols/SDLProxyListener.html12
-rw-r--r--docs/Protocols/SDLRequestHandler.html65
-rw-r--r--docs/Type Definitions.html210
-rw-r--r--docs/index.html208
-rw-r--r--docs/undocumented.json2
351 files changed, 18619 insertions, 584 deletions
diff --git a/.clang-format b/.clang-format
index 87db2b02b..789e138e6 100644
--- a/.clang-format
+++ b/.clang-format
@@ -2,8 +2,6 @@
Language: Cpp
AccessModifierOffset: -2
-# AlignAfterOpenBracket: true
-# AlignEscapedNewlinesLeft: true
AlignTrailingComments: false
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: true
@@ -32,13 +30,14 @@ ObjCBlockIndentWidth: 4
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
PointerAlignment: Right
+SortIncludes: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
-SpacesInContainerLiterals: true
+SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..4157440bf
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+CHANGELOG.md merge=union \ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index bea5ec78f..95fafda82 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,8 @@
language: objective-c
-osx_image: xcode7.3
-xcode_project: SmartDeviceLink-iOS
+osx_image: xcode8
+xcode_project: SmartDeviceLink-iOS.xcodeproj
xcode_scheme: SmartDeviceLink
-xcode_sdk: iphonesimulator9.3
+xcode_sdk: iphonesimulator10.0
env:
global:
- FRAMEWORK_NAME=SmartDeviceLink
@@ -12,14 +12,14 @@ notifications:
before_install:
- brew update
-- brew outdated xctool || brew upgrade xctool
- brew outdated carthage || brew upgrade carthage
before_script:
- carthage bootstrap --platform ios
script:
-- xctool -project SmartDeviceLink-iOS.xcodeproj -scheme SmartDeviceLink -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO RUN_CLANG_STATIC_ANALYZER=NO GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES test
+- xcodebuild -project "SmartDeviceLink-iOS.xcodeproj" -scheme "SmartDeviceLink" -sdk "iphonesimulator10.0" -destination "OS=10.0,name=iPhone 7" -configuration Debug ONLY_ACTIVE_ARCH=NO RUN_CLANG_STATIC_ANALYZER=NO GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES ENABLE_TESTABILITY=YES test | xcpretty -c;
+- xcodebuild -project "SmartDeviceLink-iOS.xcodeproj" -scheme "SmartDeviceLink-Example" -sdk "iphonesimulator10.0" -destination "OS=10.0,name=iPhone 7" -configuration Debug ONLY_ACTIVE_ARCH=NO build | xcpretty -c;
after_script:
- bash <(curl -s https://codecov.io/bash)
diff --git a/.xctool-args b/.xctool-args
deleted file mode 100644
index 27942e3b9..000000000
--- a/.xctool-args
+++ /dev/null
@@ -1,7 +0,0 @@
-[
- "-project", "SmartDeviceLink-iOS.xcodeproj",
- "-scheme", "SmartDeviceLink",
- "-sdk", "iphonesimulator",
- "ONLY_ACTIVE_ARCH=NO",
- "RUN_CLANG_STATIC_ANALYZER=NO"
-]
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d0fe76284..3d0043183 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,166 @@
+# 4.3.0 Release Notes (Since RC 6 + Highlights)
+### Highlights
+* Adds a lifecycle manager to replace `SDLProxy` and manages much more of the lifecycle based on a declarative `SDLConfiguration`.
+* Adds a file manager to streamline uploading and deleting files.
+* Adds a lock screen manager to streamline lock screens and also provides a customizable default lock screen.
+* Adds a permission manager to streamline knowing when RPCs are available for use.
+* Adds the ability to use blocks to be notified about RPC responses.
+* Adds the ability to use blocks to be notified about certain RPC notifications (such as button presses).
+
+### (Since RC 6)
+### Features
+* Added an `SDLProxy` property to `SDLManager` to allow for edge cases in v4.3. This property will be removed in v5.0.
+
+### Deprecations
+* `SDLRPCRequestFactory` is now deprecated. The methods have been replaced as initialzers on the respective RPC methods. These intiailizers have been improved as well.
+* `SDLTTSChunkFactory` is now deprecated. The methods have been replaced as initialzers on the respective RPC methods.
+
+### Bug Fixes
+* Fixed a bug where a non-existent file could attempt to upload, causing havoc.
+* Fix some test framework stuff related to Xcode 8.
+* No longer crashes when RegisterAppInterfaceResponse errors.
+* RegisterAppInterface no longer crashes when attempting to connect a navigation app to a non-navigation capable head unit.
+
+### Example App
+* The example app now shows some example Permission Manager usage and logs to console a few permission manager observer blocks.
+
+# 4.3.0 Release Candidate 6 Release Notes (Since RC 5)
+### Bug Fixes
+* Fixed several bugs and improved error messaging around what should happen if File Manager fails to start, for example because the head unit does not support files.
+
+# 4.3.0 Release Candidate 5 Release Notes (Since RC 4)
+### Bug Fixes
+* Fixed an issue where "SmartDeviceLink.h" would not be available through cocoapods.
+
+# 4.3.0 Release Candidate 4 Release Notes (Since RC 3)
+### Bug Fixes
+* Notification constants should now be compatible both with Swift 3 and with iOS 6/7.
+* Fixed a few issues with the lock screen and iOS 6/7 support.
+* Fixed a layout issue with the lock screen on iPhone 4S-sized phones.
+
+### Other
+* CI builds now run on Xcode 8.
+* Removed xctest testing framework, now just uses xcodebuild.
+* Explicitly specify which headers are public in Cocoapods spec.
+
+# 4.3.0 Release Candidate 3 Release Notes (Since RC 2)
+### Bug Fixes
+* Fixed a bug where large putfiles would crash.
+
+### Other
+* Updated to base v4.2.4
+
+# 4.3.0 Release Candidate 2 Release Notes (Since RC 1)
+### Bug Fixes
+* Updated project to Xcode 8 settings and turn on additional warnings and analyzer settings.
+* Fixed `SDLConsoleController` not using `NSLocalizedString` macro.
+* Fixed example app declaring a `UIModalPresentationStyle` enum as `UIModalTransitionStyle` causing a build error in Xcode 8.
+* Update testing deps to work with Xcode 8.
+
+### Example App
+* Add iTunes file sharing to the example app to allow for easier file log retrieval.
+
+# 4.3.0 Release Candidate 1 Release Notes (Since Beta 4)
+### Enhancements
+* Removed all usages of NSLog. Now all logs can be turned on or off.
+* SDL logs are now off by default in the default lifecycle configuration, console logs are on by default in the debug lifecycle configuration.
+* SDLLockScreenViewController is now public and may be subclassed and used as a custom view controller. If subclassed, the vehicleIcon property will be set if the remote system sends one.
+
+### Bug Fixes
+* Fixed an issue with dynamic frameworks accessing the default lock screen resources.
+* Fixed a crash relating to an OnAppInterfaceUnregistered notification.
+
+### Example App
+* Fixed initial data being sent multiple times.
+* Fixed CreateInteractionChoiceSet being sent multiple times and sometimes not working.
+* Fixed implementing a delegate method that no longer exists.
+* Fixed UI buttons not updating upon connecting.
+* Added a soft button.
+
+# 4.3.0 Beta 4 Release Notes (Since Beta 3)
+### Enhancements
+* Fix resource bundle not being included via cocoapods, causing a failure on the default lock screen. Also added better failure messages. The resource bundle will still have to be manually added to your app's copy resources build phase.
+* Reduced resource bundle size by optimizing lock screen images.
+* RPC handlers are no longer readonly and can now be set outside of the init.
+* Improved the example app with additional code and features to see how the new dev api works. Stay tuned for a few additional features.
+
+# 4.3.0 Beta 3 Release Notes (Since Beta 2)
+### Breaking Changes
+* `resumeHash` is now a configuration property and is not automatically handled.
+* `SDLFile` and `SDLArtwork` initializers no longer contain "ephemeral", these are renamed to simply start with "file" since they are the default case.
+* `SDLManagerDelegate` no longer has the method `managerDidBecomeReady`. Use the ready block on `start` instead.
+* `SDLManagerDelegate` parameters are now nonnull.
+* `SDLLockScreenConfiguration` `showInOptional` is now `showInOptionalState`.
+* `SDLLifecycleConfiguration` `port` is now a `UInt16` instead of a `NSString`.
+* Many block parameters changed names to be more consistent and descriptive.
+
+### Enhancements
+* The `OnKeyboardInput` RPC notification is now properly included and sent.
+* `SDLLifecycleManager` now only sends the "Ready" notification if registration succeeded.
+* `SDLManagerDelegate` `hmiLevel:didChangeToLevel:` is now sent right after becoming ready with the current HMI level.
+* `SDLLifecycleConfiguration` `ipAddress` is now null_resettable.
+* `SDLLifecycleConfiguration` can now contain security managers which will properly be added to the internal `SDLProxy` as appropriate.
+* `SDLLifecycleConfiguration` now has a `logFlags` parameter which can be set to alter how SDL logs out data or to prevent it from doing so at all.
+* If `RegisterAppInterfaceResponse` returns `WARNINGS` or `RESUME_FAILED` still successfully connect, but set the error properly of the ready block with the relevant information.
+* Added backward compatible `NSNotification` subclasses to more clearly describe what type of object it contains.
+* Documentation enhancements.
+
+### Bug Fixes
+* `SDLFileManager` `deleteRemoteFileWithName:completionHandler:` no longer crashes if no completion handler is set.
+* `SDLFileManager` `uploadRemoteFileWithName:completionHandler:` no longer crashes if no completion handler is set.
+* `SDLFileManager` will more efficiently clean up temporary files.
+* Remove some unneeded methods from `SDLLockScreenViewController`.
+* Properly send `AppHMIType` and `TTSName` set in `SDLLifecycleConfiguration` to the `RegisterAppInterface`.
+* Strong / weak dance bugs fixed.
+* Unit test fixes.
+
+### Internal enhancements
+* `SDLStateMachine` now has some public keys to help accessing data internally.
+* `SDLResponseDispatcher` updates: fixing a method name, fixing an enum equality check, clarity updates.
+* `SDLLifecycleManager` remove `stateTransitionNotificationName`.
+* Some `NSOperation` subclass code was shifted to an intermediate superclass.
+* Fixed some instance variables not having generics.
+* Updated code to match v4.2.3.
+
+# 4.3.0 Beta 2 Release Notes (Since Beta 1)
+### Enhancements
+* Starting up `SDLManager` now requires a block which will pass back an error if it failed.
+* `SDLManager` now provides a method to call in `AppDelegate applicationWillTerminate:` that will prevent killed apps from being unable to re-register.
+
+### Bug Fixes
+* Fixed a memory leak caused by the strong / weak block dance.
+
+### Other
+* Currently removed automatic resumption. Resumption will return in a future build as a manual configuration pass in.
+
+# 4.3.0 Beta 1 Release Notes (Since Alpha 1)
+### Breaking Changes
+* State machine transition names are no longer public to allow for behind the scenes changes without minor or major version changes.
+
+### Enhancements
+* SDLFile, if initialized with NSData, will no longer write that data to disk, instead, it is stored in RAM. SDLFiles initialized with a file URL will continue to keep that data on disk until needed.
+* The default lock screen text is now localized into Spanish, French, German, Japenese, and Chinese.
+
+### Bug Fixes
+* If the lifecycle manager or any of its consituent managers fail to start, the lifecycle manager will disconnect or unregister and an error will be logged.
+* SDLLockScreenManager should use less RAM.
+* Fixed test failures.
+
+# 4.3.0 Alpha 1 Release Notes
+### Deprecations
+* Deprecate SDLProxy in favor of SDLManager. A future major release will remove and alter many public APIs, but they will not be deprecated in this release because they will not be replaced in this release.
+
+### Enhancements
+* Release a whole new way of reasoning about interacting with SDL. This new high-level API, and it is largely modular with "managers" for various aspects of SDL. This will be extended as time goes on with various new managers based on aspects of SDL and app development (#223, #241, #298). @joeljfischer, @adein, @justinjdickow, @asm09fsu
+ * Add a new set of configurations that will be set before startup and allows the manager to take care of quite a bit of setup boilerplate on its own.
+ * Release a Permission Manager that allows a developer to check which SDL RPCs are avaiable to use and monitor the ability to use them.
+ * Release a File Manager that abstracts the process of tracking files on the remote head unit, uploading, and deleting files.
+ * Release a Lock Screen Manager that tracks appropriate times to show a lock screen and comes with a default lock screen view controller that allows for some customizability.
+ * All RPCs sent through the primary manager (SDLManager) are tracked and can have a block called with the request and response when the response is returned from the remote head unit.
+ * All RPCs sent will have their correlation ids managed by the SDL library.
+ * Particular RPCs can now have an additional block used with them that can be called under certain conditions. For example, RPCs that create buttons (such as soft buttons) can have a block handler that will be called when an event occurs on the button.
+ * Underlying the new high-level API are a few dispatchers, particularly the Notification Dispatcher which sends many notifications when new RPC notifications and responses are sent from the remote head unit. This may be used by the developer now, but will become less useful as more managers are released.
+
# 4.2.4 Release Notes
### Bug Fixes
* Fixed Touch Manager not always firing single touches.
diff --git a/Cartfile.private b/Cartfile.private
index 3431c663e..f661526be 100644
--- a/Cartfile.private
+++ b/Cartfile.private
@@ -2,3 +2,4 @@ github "Quick/Quick" ~> 0.9
github "Quick/Nimble" ~> 4.0
github "AliSoftware/OHHTTPStubs" ~> 5.0
github "erikdoe/ocmock" ~> 3.3
+github "facebook/ios-snapshot-test-case" == 2.1.3
diff --git a/Cartfile.resolved b/Cartfile.resolved
index ba992b1f7..b770aa4bd 100644
--- a/Cartfile.resolved
+++ b/Cartfile.resolved
@@ -1,4 +1,5 @@
github "Quick/Nimble" "v4.1.0"
github "AliSoftware/OHHTTPStubs" "5.2.1"
github "Quick/Quick" "v0.9.3"
+github "facebook/ios-snapshot-test-case" "2.1.3"
github "erikdoe/ocmock" "v3.3.1"
diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md
index f61912428..0ab2739ed 100644
--- a/DEPENDENCIES.md
+++ b/DEPENDENCIES.md
@@ -1,4 +1,4 @@
-## Non-Library Dependencies
+## Test Dependencies
### Quick
Apache License
@@ -535,4 +535,35 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+### FBSnapshotTestCase
+BSD License
+
+For the FBSnapshotTestCase software
+
+Copyright (c) 2013, Facebook, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name Facebook nor the names of its contributors may be used to
+ endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file
diff --git a/README.md b/README.md
index f93194df4..51cf6c618 100644
--- a/README.md
+++ b/README.md
@@ -40,7 +40,7 @@ See the [roadmap](https://github.com/smartdevicelink/sdl_ios/wiki/Roadmap) to se
You can install this library using [Cocoapods](https://cocoapods.org/pods/SmartDeviceLink-iOS). You can get started with Cocoapods by [following their install guide](https://guides.cocoapods.org/using/getting-started.html#getting-started), and learn how to use Cocoapods to install dependencies [by following this guide](https://guides.cocoapods.org/using/using-cocoapods.html).
-In your podfile, you want to add `pod 'SmartDeviceLink-iOS', '~> 4.2'`. Then run `pod install` inside your terminal. With Cocoapods, we support iOS 6.0+.
+In your podfile, you want to add `pod 'SmartDeviceLink-iOS', '~> 4.3'`. Then run `pod install` inside your terminal. With Cocoapods, we support iOS 6.0+.
##### Carthage
@@ -58,21 +58,6 @@ You can find the latest reference documentation on [Cocoadocs](http://cocoadocs.
If you see a bug, feel free to post an issue on the appropriate repository. Please see the [contribution guidelines](https://github.com/smartdevicelink/sdl_ios/blob/master/CONTRIBUTING.md) before proceeding. If you need general assistance, or have other questions, you can [sign up](http://slack.smartdevicelink.org) for the [SDL Slack](https://smartdevicelink.slack.com) and chat with other developers and the maintainers of the project.
-### Running Tests
-To run tests, you will need to bootstrap the Carthage testing libraries. To do so, first [install Carthage](https://github.com/Carthage/Carthage#installing-carthage).
-
-Then, from the root project directory, run:
-```bash
-carthage bootstrap --platform ios
-cd ../
-```
-
-At this point, you can run tests from Xcode, or, if you wish to run the tests exactly as they will be run on the CI server, [install xctool](https://github.com/facebook/xctool#installation) and run:
-
-```bash
-xctool test
-```
-
### SDL iOS Getting Started
#### Other Installation Requirements
@@ -125,99 +110,22 @@ Your application must support a set of smartdevicelink protocol strings in order
</array>
```
-#### Creating the SDLProxy
-When creating a proxy, you will likely want a class to manage the Proxy and related functions for you. The example project located in this repository has a class called "ProxyManager" to serve this function. One important, somewhat odd note, is that when the proxy is created, it will immediately start. This means that you should only build the Proxy object when you are ready to search for connections. For production apps using iAP, this is early, since it ought to be ready for an iAP connection the entire time your app is available. However, when debugging using Wi-Fi, you may want to tie this to a button press, since the search can timeout.
-
-Another odd note is that if a connection disconnects for any reason, you will receive an `onProxyClosed` callback through the `SDLListener` delegate (see below), and you will have to completely discard and rebuild the proxy object.
-
-The example app's `startProxyWithTransportType` handles starting up the proxy when necessary. The proxy object should be stored as a property of it's parent class.
-
-```objc
-switch (transportType) {
-case ProxyTransportTypeTCP: {
-self.proxy = [SDLProxyFactory buildSDLProxyWithListener:self tcpIPAddress:@"192.168.1.1" tcpPort:@"1234"];
-} break;
-case ProxyTransportTypeIAP: {
-self.proxy = [SDLProxyFactory buildSDLProxyWithListener:self];
-} break;
-default: NSAssert(NO, @"Unknown transport setup: %@", @(transportType));
-}
-```
-
-#### SDLProxyListener
-
-Note in the following lines, that there is a call to pass a `listener` into the build method.
-
-```objc
-self.proxy = [SDLProxyFactory buildSDLProxyWithListener:self tcpIPAddress:[Preferences sharedPreferences].ipAddress tcpPort:[Preferences sharedPreferences].port]
-self.proxy = [SDLProxyFactory buildSDLProxyWithListener:self];
-```
-
-This is an object that conforms to the `SDLProxyListener` protocol. This could be the object holding the reference to the proxy, as it is here.
-
-#### Implement onProxyOpened and other delegate methods
-The `SDLProxyListener` protocol has four required methods:
+#### Continue Integrating
+Go through the [guide documentation](https://smartdevicelink.com/en/guides/iOS/getting-started/integration-basics/) to get started setting up your app to work with SDL!
-```objc
-- (void)onOnDriverDistraction:(SDLOnDriverDistraction*) notification;
-- (void)onOnHMIStatus:(SDLOnHMIStatus*) notification;
-- (void)onProxyClosed;
-- (void)onProxyOpened;
-```
-
-`onProxyOpened` is called when a connection is established between the head unit and your application. This is the place to set whatever state you need to, to know that your application is connected. It is also where you must send a register request with your app's information to the vehicle. The example app uses the following basic code:
-
-```objc
-self.state = ProxyStateConnected;
-
-SDLRegisterAppInterface *registerRequest = [SDLRPCRequestFactory buildRegisterAppInterfaceWithAppName:SDLAppName languageDesired:[SDLLanguage EN_US] appID:SDLAppId];
-[self.proxy sendRPC:registerRequest];
-```
-
-When the proxy is closed, you will receive a call to `onProxyClosed`. This is where you will reset the state of the proxy, because remember, when a connection is closed, it is assumed that you will destroy the current proxy. The example app runs a method called `resetProxyWithTransportType:` that runs the following:
-
-```objc
-[self stopProxy];
-[self startProxyWithTransportType:transportType];
-```
-
-`stopProxy` does the following:
-
-```objc
-self.state = ProxyStateStopped;
-
-if (self.proxy != nil) {
-[self.proxy dispose];
-self.proxy = nil;
-}
-```
-
-#### onOnHMIStatus
-When your app receives `onOnHMIStatus` it has changed HMI states on the head unit. For example, your application can be put into `HMI_FULL` meaning that it has full access to the vehicle screen. For more info on HMI Levels, [see the Cocoadoc documentation on the enum](http://cocoadocs.org/docsets/SmartDeviceLink-iOS/4.2.1/Classes/SDLHMILevel.html).
-
-You will want to track your first HMI FULL, for instance with a boolean value. The example application has extremely basic tracking of this type in the `onOnHMIStatus` callback.
+### Running Tests
+To run tests, you will need to bootstrap the Carthage testing libraries. To do so, first [install Carthage](https://github.com/Carthage/Carthage#installing-carthage).
-```objc
-if ((notification.hmiLevel == [SDLHMILevel FULL]) && self.isFirstHMIFull) {
-[self showInitialData];
-self.isFirstHMIFull = NO;
-}
+Then, from the root project directory, run:
+```bash
+carthage bootstrap --platform ios
+cd ../
```
-#### WiFi vs. iAP
+At this point, you can run tests from Xcode, or, if you wish to run the tests exactly as they will be run on the CI server, run:
-As described in the section "Creating the SDLProxy", you need will have separate setup for either WiFi (debugging) and iAP (production) code.
-
-```objc
-switch (transportType) {
-case ProxyTransportTypeTCP: {
-self.proxy = [SDLProxyFactory buildSDLProxyWithListener:self tcpIPAddress:@"192.168.1.1" tcpPort:@"1234"];
-} break;
-case ProxyTransportTypeIAP: {
-self.proxy = [SDLProxyFactory buildSDLProxyWithListener:self];
-} break;
-default: NSAssert(NO, @"Unknown transport setup: %@", @(transportType));
-}
+```bash
+xcodebuild -project "SmartDeviceLink-iOS.xcodeproj" -scheme "SmartDeviceLink" -sdk "iphonesimulator10.0" -destination "OS=10.0,name=iPhone 7" -configuration Debug ONLY_ACTIVE_ARCH=NO RUN_CLANG_STATIC_ANALYZER=NO GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES ENABLE_TESTABILITY=YES test
```
-When creating for WiFi, you will want to know the IP address and port of the Core system you are testing with. With IAP connections, you will use the "build" method without setting an IP and Port, and IAP will automatically be activated.
+You can optionally pipe the result to [xcpretty](https://github.com/supermarin/xcpretty).
diff --git a/SmartDeviceLink-iOS.podspec b/SmartDeviceLink-iOS.podspec
index dc3061934..0377d62cc 100644
--- a/SmartDeviceLink-iOS.podspec
+++ b/SmartDeviceLink-iOS.podspec
@@ -1,14 +1,276 @@
Pod::Spec.new do |s|
s.name = "SmartDeviceLink-iOS"
-s.version = "4.2.4"
+s.version = "4.3.0"
s.summary = "Connect your app with cars!"
s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS"
s.license = { :type => "New BSD", :file => "LICENSE" }
-s.author = { "SmartDeviceLink Team" => "joel@livio.io" }
+s.author = { "SmartDeviceLink Team" => "developer@smartdevicelink.com" }
s.platform = :ios, "6.0"
s.source = { :git => "https://github.com/smartdevicelink/sdl_ios.git", :tag => s.version.to_s }
s.source_files = "SmartDeviceLink/*.{h,m}"
s.requires_arc = true
+s.resource_bundles = { 'SmartDeviceLink' => ['SmartDeviceLink/Assets/**/*', 'SmartDeviceLink/iOS 7 Assets/*'] }
+s.public_header_files = [
+'SmartDeviceLink/SmartDeviceLink.h',
+'SmartDeviceLink/SDLJingle.h',
+'SmartDeviceLink/SDLProxy.h',
+'SmartDeviceLink/SDLProxyFactory.h',
+'SmartDeviceLink/SDLProxyListener.h',
+'SmartDeviceLink/SDLSecurityType.h',
+'SmartDeviceLink/SDLStreamingMediaManager.h',
+'SmartDeviceLink/SDLTTSChunkFactory.h',
+'SmartDeviceLink/SDLTouchManager.h',
+'SmartDeviceLink/SDLTouchManagerDelegate.h',
+'SmartDeviceLink/SDLConsoleController.h',
+'SmartDeviceLink/SDLDebugTool.h',
+'SmartDeviceLink/SDLDebugToolConsole.h',
+'SmartDeviceLink/SDLSiphonServer.h',
+'SmartDeviceLink/SDLAbstractTransport.h',
+'SmartDeviceLink/SDLIAPSessionDelegate.h',
+'SmartDeviceLink/SDLIAPTransport.h',
+'SmartDeviceLink/SDLTCPTransport.h',
+'SmartDeviceLink/SDLTransportDelegate.h',
+'SmartDeviceLink/SDLAbstractProtocol.h',
+'SmartDeviceLink/SDLProtocol.h',
+'SmartDeviceLink/SDLProtocolListener.h',
+'SmartDeviceLink/SDLProtocolHeader.h',
+'SmartDeviceLink/SDLProtocolMessage.h',
+'SmartDeviceLink/SDLEnum.h',
+'SmartDeviceLink/SDLRPCMessage.h',
+'SmartDeviceLink/SDLRPCNotification.h',
+'SmartDeviceLink/SDLRPCRequest.h',
+'SmartDeviceLink/SDLRPCResponse.h',
+'SmartDeviceLink/SDLRPCStruct.h',
+'SmartDeviceLink/SDLRPCRequestFactory.h',
+'SmartDeviceLink/SDLAddCommand.h',
+'SmartDeviceLink/SDLAddSubMenu.h',
+'SmartDeviceLink/SDLAlert.h',
+'SmartDeviceLink/SDLAlertManeuver.h',
+'SmartDeviceLink/SDLChangeRegistration.h',
+'SmartDeviceLink/SDLCreateInteractionChoiceSet.h',
+'SmartDeviceLink/SDLDeleteCommand.h',
+'SmartDeviceLink/SDLDeleteFile.h',
+'SmartDeviceLink/SDLDeleteInteractionChoiceSet.h',
+'SmartDeviceLink/SDLDeleteSubMenu.h',
+'SmartDeviceLink/SDLDiagnosticMessage.h',
+'SmartDeviceLink/SDLDialNumber.h',
+'SmartDeviceLink/SDLEncodedSyncPData.h',
+'SmartDeviceLink/SDLEndAudioPassThru.h',
+'SmartDeviceLink/SDLGetDTCs.h',
+'SmartDeviceLink/SDLGetVehicleData.h',
+'SmartDeviceLink/SDLListFiles.h',
+'SmartDeviceLink/SDLPerformAudioPassThru.h',
+'SmartDeviceLink/SDLPerformInteraction.h',
+'SmartDeviceLink/SDLPutFile.h',
+'SmartDeviceLink/SDLReadDID.h',
+'SmartDeviceLink/SDLRegisterAppInterface.h',
+'SmartDeviceLink/SDLResetGlobalProperties.h',
+'SmartDeviceLink/SDLScrollableMessage.h',
+'SmartDeviceLink/SDLSendLocation.h',
+'SmartDeviceLink/SDLSetAppIcon.h',
+'SmartDeviceLink/SDLSetDisplayLayout.h',
+'SmartDeviceLink/SDLSetGlobalProperties.h',
+'SmartDeviceLink/SDLSetMediaClockTimer.h',
+'SmartDeviceLink/SDLShow.h',
+'SmartDeviceLink/SDLShowConstantTBT.h',
+'SmartDeviceLink/SDLSlider.h',
+'SmartDeviceLink/SDLSpeak.h',
+'SmartDeviceLink/SDLSubscribeButton.h',
+'SmartDeviceLink/SDLSubscribeVehicleData.h',
+'SmartDeviceLink/SDLSyncPData.h',
+'SmartDeviceLink/SDLUnregisterAppInterface.h',
+'SmartDeviceLink/SDLUnsubscribeButton.h',
+'SmartDeviceLink/SDLUnsubscribeVehicleData.h',
+'SmartDeviceLink/SDLUpdateTurnList.h',
+'SmartDeviceLink/SDLAddCommandResponse.h',
+'SmartDeviceLink/SDLAddSubMenuResponse.h',
+'SmartDeviceLink/SDLAlertManeuverResponse.h',
+'SmartDeviceLink/SDLAlertResponse.h',
+'SmartDeviceLink/SDLChangeRegistrationResponse.h',
+'SmartDeviceLink/SDLCreateInteractionChoiceSetResponse.h',
+'SmartDeviceLink/SDLDeleteCommandResponse.h',
+'SmartDeviceLink/SDLDeleteFileResponse.h',
+'SmartDeviceLink/SDLDeleteInteractionChoiceSetResponse.h',
+'SmartDeviceLink/SDLDeleteSubMenuResponse.h',
+'SmartDeviceLink/SDLDiagnosticMessageResponse.h',
+'SmartDeviceLink/SDLDialNumberResponse.h',
+'SmartDeviceLink/SDLEncodedSyncPDataResponse.h',
+'SmartDeviceLink/SDLEndAudioPassThruResponse.h',
+'SmartDeviceLink/SDLGenericResponse.h',
+'SmartDeviceLink/SDLGetDTCsResponse.h',
+'SmartDeviceLink/SDLGetVehicleDataResponse.h',
+'SmartDeviceLink/SDLListFilesResponse.h',
+'SmartDeviceLink/SDLPerformAudioPassThruResponse.h',
+'SmartDeviceLink/SDLPerformInteractionResponse.h',
+'SmartDeviceLink/SDLPutFileResponse.h',
+'SmartDeviceLink/SDLReadDIDResponse.h',
+'SmartDeviceLink/SDLRegisterAppInterfaceResponse.h',
+'SmartDeviceLink/SDLResetGlobalPropertiesResponse.h',
+'SmartDeviceLink/SDLScrollableMessageResponse.h',
+'SmartDeviceLink/SDLSendLocationResponse.h',
+'SmartDeviceLink/SDLSetAppIconResponse.h',
+'SmartDeviceLink/SDLSetDisplayLayoutResponse.h',
+'SmartDeviceLink/SDLSetGlobalPropertiesResponse.h',
+'SmartDeviceLink/SDLSetMediaClockTimerResponse.h',
+'SmartDeviceLink/SDLShowConstantTBTResponse.h',
+'SmartDeviceLink/SDLShowResponse.h',
+'SmartDeviceLink/SDLSliderResponse.h',
+'SmartDeviceLink/SDLSpeakResponse.h',
+'SmartDeviceLink/SDLSubscribeButtonResponse.h',
+'SmartDeviceLink/SDLSubscribeVehicleDataResponse.h',
+'SmartDeviceLink/SDLSyncPDataResponse.h',
+'SmartDeviceLink/SDLUnregisterAppInterfaceResponse.h',
+'SmartDeviceLink/SDLUnsubscribeButtonResponse.h',
+'SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h',
+'SmartDeviceLink/SDLUpdateTurnListResponse.h',
+'SmartDeviceLink/SDLOnAppInterfaceUnregistered.h',
+'SmartDeviceLink/SDLOnAudioPassThru.h',
+'SmartDeviceLink/SDLOnButtonEvent.h',
+'SmartDeviceLink/SDLOnButtonPress.h',
+'SmartDeviceLink/SDLOnCommand.h',
+'SmartDeviceLink/SDLOnDriverDistraction.h',
+'SmartDeviceLink/SDLOnEncodedSyncPData.h',
+'SmartDeviceLink/SDLOnHMIStatus.h',
+'SmartDeviceLink/SDLOnHashChange.h',
+'SmartDeviceLink/SDLOnKeyboardInput.h',
+'SmartDeviceLink/SDLOnLanguageChange.h',
+'SmartDeviceLink/SDLOnLockScreenStatus.h',
+'SmartDeviceLink/SDLOnPermissionsChange.h',
+'SmartDeviceLink/SDLOnSyncPData.h',
+'SmartDeviceLink/SDLOnSystemRequest.h',
+'SmartDeviceLink/SDLOnTBTClientState.h',
+'SmartDeviceLink/SDLOnTouchEvent.h',
+'SmartDeviceLink/SDLOnVehicleData.h',
+'SmartDeviceLink/SDLAirbagStatus.h',
+'SmartDeviceLink/SDLAppInfo.h',
+'SmartDeviceLink/SDLAudioPassThruCapabilities.h',
+'SmartDeviceLink/SDLBeltStatus.h',
+'SmartDeviceLink/SDLBodyInformation.h',
+'SmartDeviceLink/SDLButtonCapabilities.h',
+'SmartDeviceLink/SDLChoice.h',
+'SmartDeviceLink/SDLClusterModeStatus.h',
+'SmartDeviceLink/SDLDIDResult.h',
+'SmartDeviceLink/SDLDeviceInfo.h',
+'SmartDeviceLink/SDLDeviceStatus.h',
+'SmartDeviceLink/SDLDisplayCapabilities.h',
+'SmartDeviceLink/SDLECallInfo.h',
+'SmartDeviceLink/SDLEmergencyEvent.h',
+'SmartDeviceLink/SDLGPSData.h',
+'SmartDeviceLink/SDLHMICapabilities.h',
+'SmartDeviceLink/SDLHMIPermissions.h',
+'SmartDeviceLink/SDLHeadLampStatus.h',
+'SmartDeviceLink/SDLImage.h',
+'SmartDeviceLink/SDLImageField.h',
+'SmartDeviceLink/SDLImageResolution.h',
+'SmartDeviceLink/SDLKeyboardProperties.h',
+'SmartDeviceLink/SDLMenuParams.h',
+'SmartDeviceLink/SDLMyKey.h',
+'SmartDeviceLink/SDLParameterPermissions.h',
+'SmartDeviceLink/SDLPermissionItem.h',
+'SmartDeviceLink/SDLPresetBankCapabilities.h',
+'SmartDeviceLink/SDLScreenParams.h',
+'SmartDeviceLink/SDLSingleTireStatus.h',
+'SmartDeviceLink/SDLSoftButton.h',
+'SmartDeviceLink/SDLSoftButtonCapabilities.h',
+'SmartDeviceLink/SDLStartTime.h',
+'SmartDeviceLink/SDLSyncMsgVersion.h',
+'SmartDeviceLink/SDLTTSChunk.h',
+'SmartDeviceLink/SDLTextField.h',
+'SmartDeviceLink/SDLTireStatus.h',
+'SmartDeviceLink/SDLTouchCoord.h',
+'SmartDeviceLink/SDLTouchEvent.h',
+'SmartDeviceLink/SDLTouchEventCapabilities.h',
+'SmartDeviceLink/SDLTurn.h',
+'SmartDeviceLink/SDLVRHelpItem.h',
+'SmartDeviceLink/SDLVehicleDataResult.h',
+'SmartDeviceLink/SDLVehicleType.h',
+'SmartDeviceLink/SDLAmbientLightStatus.h',
+'SmartDeviceLink/SDLAppHMIType.h',
+'SmartDeviceLink/SDLAppInterfaceUnregisteredReason.h',
+'SmartDeviceLink/SDLAudioStreamingState.h',
+'SmartDeviceLink/SDLAudioType.h',
+'SmartDeviceLink/SDLBitsPerSample.h',
+'SmartDeviceLink/SDLButtonEventMode.h',
+'SmartDeviceLink/SDLButtonName.h',
+'SmartDeviceLink/SDLButtonPressMode.h',
+'SmartDeviceLink/SDLCarModeStatus.h',
+'SmartDeviceLink/SDLCharacterSet.h',
+'SmartDeviceLink/SDLCompassDirection.h',
+'SmartDeviceLink/SDLComponentVolumeStatus.h',
+'SmartDeviceLink/SDLDeviceLevelStatus.h',
+'SmartDeviceLink/SDLDimension.h',
+'SmartDeviceLink/SDLDisplayType.h',
+'SmartDeviceLink/SDLDriverDistractionState.h',
+'SmartDeviceLink/SDLECallConfirmationStatus.h',
+'SmartDeviceLink/SDLEmergencyEventType.h',
+'SmartDeviceLink/SDLFileType.h',
+'SmartDeviceLink/SDLFuelCutoffStatus.h',
+'SmartDeviceLink/SDLGlobalProperty.h',
+'SmartDeviceLink/SDLHMILevel.h',
+'SmartDeviceLink/SDLHMIZoneCapabilities.h',
+'SmartDeviceLink/SDLIgnitionStableStatus.h',
+'SmartDeviceLink/SDLIgnitionStatus.h',
+'SmartDeviceLink/SDLImageFieldName.h',
+'SmartDeviceLink/SDLImageType.h',
+'SmartDeviceLink/SDLInteractionMode.h',
+'SmartDeviceLink/SDLKeyboardEvent.h',
+'SmartDeviceLink/SDLKeyboardLayout.h',
+'SmartDeviceLink/SDLKeypressMode.h',
+'SmartDeviceLink/SDLLanguage.h',
+'SmartDeviceLink/SDLLayoutMode.h',
+'SmartDeviceLink/SDLLockScreenStatus.h',
+'SmartDeviceLink/SDLMaintenanceModeStatus.h',
+'SmartDeviceLink/SDLMediaClockFormat.h',
+'SmartDeviceLink/SDLPRNDL.h',
+'SmartDeviceLink/SDLPermissionStatus.h',
+'SmartDeviceLink/SDLPowerModeQualificationStatus.h',
+'SmartDeviceLink/SDLPowerModeStatus.h',
+'SmartDeviceLink/SDLPredefinedLayout.h',
+'SmartDeviceLink/SDLPrerecordedSpeech.h',
+'SmartDeviceLink/SDLPrimaryAudioSource.h',
+'SmartDeviceLink/SDLRPCMessageType.h',
+'SmartDeviceLink/SDLRequestType.h',
+'SmartDeviceLink/SDLResult.h',
+'SmartDeviceLink/SDLSamplingRate.h',
+'SmartDeviceLink/SDLSoftButtonType.h',
+'SmartDeviceLink/SDLSpeechCapabilities.h',
+'SmartDeviceLink/SDLSystemAction.h',
+'SmartDeviceLink/SDLSystemContext.h',
+'SmartDeviceLink/SDLTBTState.h',
+'SmartDeviceLink/SDLTextAlignment.h',
+'SmartDeviceLink/SDLTextFieldName.h',
+'SmartDeviceLink/SDLTimerMode.h',
+'SmartDeviceLink/SDLTouchType.h',
+'SmartDeviceLink/SDLTriggerSource.h',
+'SmartDeviceLink/SDLUpdateMode.h',
+'SmartDeviceLink/SDLVRCapabilities.h',
+'SmartDeviceLink/SDLVehicleDataActiveStatus.h',
+'SmartDeviceLink/SDLVehicleDataEventStatus.h',
+'SmartDeviceLink/SDLVehicleDataNotificationStatus.h',
+'SmartDeviceLink/SDLVehicleDataResultCode.h',
+'SmartDeviceLink/SDLVehicleDataStatus.h',
+'SmartDeviceLink/SDLVehicleDataType.h',
+'SmartDeviceLink/SDLWarningLightStatus.h',
+'SmartDeviceLink/SDLWiperStatus.h',
+'SmartDeviceLink/SDLConfiguration.h',
+'SmartDeviceLink/SDLLifecycleConfiguration.h',
+'SmartDeviceLink/SDLLockScreenConfiguration.h',
+'SmartDeviceLink/SDLArtwork.h',
+'SmartDeviceLink/SDLFile.h',
+'SmartDeviceLink/SDLFileManager.h',
+'SmartDeviceLink/SDLFileManagerConstants.h',
+'SmartDeviceLink/SDLLockScreenViewController.h',
+'SmartDeviceLink/SDLManager.h',
+'SmartDeviceLink/SDLManagerDelegate.h',
+'SmartDeviceLink/SDLPermissionConstants.h',
+'SmartDeviceLink/SDLPermissionManager.h',
+'SmartDeviceLink/NSNumber+NumberType.h',
+'SmartDeviceLink/SDLErrorConstants.h',
+'SmartDeviceLink/SDLNotificationConstants.h',
+'SmartDeviceLink/SDLRequestHandler.h',
+'SmartDeviceLink/SDLRPCNotificationNotification.h',
+'SmartDeviceLink/SDLRPCResponseNotification.h'
+]
end
diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
index a8c69557a..36fe53b3b 100644
--- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
+++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
@@ -7,10 +7,6 @@
objects = {
/* Begin PBXBuildFile section */
- 162E81CA1A9BDD3F00906325 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 162E81C81A9BDD3F00906325 /* Nimble.framework */; };
- 162E81CB1A9BDD3F00906325 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 162E81C91A9BDD3F00906325 /* Quick.framework */; };
- 162E81CF1A9BDDD800906325 /* Nimble.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 162E81C81A9BDD3F00906325 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 162E81D01A9BDDD800906325 /* Quick.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 162E81C91A9BDD3F00906325 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
162E82CA1A9BDE8A00906325 /* SDLAmbientLightStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E81E21A9BDE8A00906325 /* SDLAmbientLightStatusSpec.m */; };
162E82CB1A9BDE8A00906325 /* SDLAppHMITypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E81E31A9BDE8A00906325 /* SDLAppHMITypeSpec.m */; };
162E82CC1A9BDE8A00906325 /* SDLAppInterfaceUnregisteredReasonSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E81E41A9BDE8A00906325 /* SDLAppInterfaceUnregisteredReasonSpec.m */; };
@@ -244,6 +240,26 @@
5D0218FC1A8E7E1700D1BF62 /* ConnectionContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0218FB1A8E7E1700D1BF62 /* ConnectionContainerViewController.m */; };
5D0218FF1A8E9E0D00D1BF62 /* ConnectionIAPTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0218FE1A8E9E0D00D1BF62 /* ConnectionIAPTableViewController.m */; };
5D0219051A8E9F6D00D1BF62 /* ConnectionIAPTableViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5D0219031A8E9F6D00D1BF62 /* ConnectionIAPTableViewController.storyboard */; };
+ 5D1654561D3E754F00554D93 /* SDLLifecycleManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1654551D3E754F00554D93 /* SDLLifecycleManagerSpec.m */; };
+ 5D16545A1D3E7A1600554D93 /* SDLLifecycleManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1654581D3E7A1600554D93 /* SDLLifecycleManager.h */; };
+ 5D16545B1D3E7A1600554D93 /* SDLLifecycleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1654591D3E7A1600554D93 /* SDLLifecycleManager.m */; };
+ 5D1665AB1CF5F7D000CC4CA1 /* (null) in Sources */ = {isa = PBXBuildFile; };
+ 5D1665C41CF8CA2700CC4CA1 /* SDLListFilesOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1665C21CF8CA2700CC4CA1 /* SDLListFilesOperation.h */; };
+ 5D1665C51CF8CA2700CC4CA1 /* SDLListFilesOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1665C31CF8CA2700CC4CA1 /* SDLListFilesOperation.m */; };
+ 5D1665C81CF8CA3D00CC4CA1 /* SDLPermissionFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1665C61CF8CA3D00CC4CA1 /* SDLPermissionFilter.h */; };
+ 5D1665C91CF8CA3D00CC4CA1 /* SDLPermissionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1665C71CF8CA3D00CC4CA1 /* SDLPermissionFilter.m */; };
+ 5D1665CB1CF8CA6700CC4CA1 /* NSNumber+NumberType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1665CA1CF8CA6700CC4CA1 /* NSNumber+NumberType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D1665CD1CF8CA8A00CC4CA1 /* SDLPermissionConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1665CC1CF8CA8A00CC4CA1 /* SDLPermissionConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D2996EA1BFCC0E3006106BF /* (null) in Sources */ = {isa = PBXBuildFile; };
+ 5D2F58081D0717D5001085CE /* SDLManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D2F58071D0717D5001085CE /* SDLManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D3E48751D6F3B330000BFEF /* SDLAsynchronousOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D3E48731D6F3B330000BFEF /* SDLAsynchronousOperation.h */; };
+ 5D3E48761D6F3B330000BFEF /* SDLAsynchronousOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D3E48741D6F3B330000BFEF /* SDLAsynchronousOperation.m */; };
+ 5D3E487B1D6F888E0000BFEF /* SDLRPCResponseNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D3E48791D6F888E0000BFEF /* SDLRPCResponseNotification.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D3E487C1D6F888E0000BFEF /* SDLRPCResponseNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D3E487A1D6F888E0000BFEF /* SDLRPCResponseNotification.m */; };
+ 5D3E487F1D6F88A30000BFEF /* SDLRPCNotificationNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D3E487D1D6F88A30000BFEF /* SDLRPCNotificationNotification.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D3E48801D6F88A30000BFEF /* SDLRPCNotificationNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D3E487E1D6F88A30000BFEF /* SDLRPCNotificationNotification.m */; };
+ 5D3E48CB1D7722FE0000BFEF /* NSBundle+SDLBundle.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D3E48C91D7722FE0000BFEF /* NSBundle+SDLBundle.h */; };
+ 5D3E48CC1D7722FE0000BFEF /* NSBundle+SDLBundle.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D3E48CA1D7722FE0000BFEF /* NSBundle+SDLBundle.m */; };
5D4029D41A76F0340006B0C2 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5D4029D31A76F0340006B0C2 /* Images.xcassets */; };
5D4029E31A76F0760006B0C2 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5D4029DF1A76F0760006B0C2 /* LaunchScreen.xib */; };
5D4029E41A76F0760006B0C2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5D4029E11A76F0760006B0C2 /* Main.storyboard */; };
@@ -251,14 +267,27 @@
5D4832A11A92868E00252386 /* ProxyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D4832A01A92868E00252386 /* ProxyManager.m */; };
5D4832A51A94F90D00252386 /* ConnectionTransitionContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D4832A41A94F90D00252386 /* ConnectionTransitionContext.m */; };
5D4832A81A95191B00252386 /* ConnectionAnimatedTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D4832A71A95191B00252386 /* ConnectionAnimatedTransition.m */; };
- 5D4AB7A21B21EC16004C1AB0 /* SmartDeviceLink.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5D61FA1C1A84237100846EE7 /* SmartDeviceLink.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 5D4D67AC1D2ED37A00468B4A /* SDLNotificationDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D4D67AA1D2ED37A00468B4A /* SDLNotificationDispatcher.h */; };
+ 5D4D67AD1D2ED37A00468B4A /* SDLNotificationDispatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D4D67AB1D2ED37A00468B4A /* SDLNotificationDispatcher.m */; };
+ 5D4D67B01D2FE2F900468B4A /* SDLResponseDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D4D67AE1D2FE2F900468B4A /* SDLResponseDispatcher.h */; };
+ 5D4D67B11D2FE2F900468B4A /* SDLResponseDispatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D4D67AF1D2FE2F900468B4A /* SDLResponseDispatcher.m */; };
+ 5D4D67B41D30161600468B4A /* SDLLockScreenManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D4D67B21D30161600468B4A /* SDLLockScreenManager.h */; };
+ 5D4D67B51D30161600468B4A /* SDLLockScreenManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D4D67B31D30161600468B4A /* SDLLockScreenManager.m */; };
5D535DC51B72473800CF7760 /* SDLGlobals.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D535DC31B72473800CF7760 /* SDLGlobals.h */; };
5D535DC61B72473800CF7760 /* SDLGlobals.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D535DC41B72473800CF7760 /* SDLGlobals.m */; };
5D53C46D1B7A99B9003526EA /* SDLStreamingMediaManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D53C46B1B7A99B9003526EA /* SDLStreamingMediaManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D53C46E1B7A99B9003526EA /* SDLStreamingMediaManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D53C46C1B7A99B9003526EA /* SDLStreamingMediaManager.m */; };
5D59350F1A855EB300687FB9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D59350C1A855EB300687FB9 /* AppDelegate.m */; };
5D5935121A855EBE00687FB9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5935111A855EBE00687FB9 /* main.m */; };
- 5D59DD471B14FDEE00BE744D /* SDLLockScreenManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D59DD461B14FDEE00BE744D /* SDLLockScreenManagerSpec.m */; };
+ 5D59DD471B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D59DD461B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m */; };
+ 5D5DBF081D48E39C00D4F914 /* FBSnapshotTestCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D5DBF071D48E39C00D4F914 /* FBSnapshotTestCase.framework */; };
+ 5D5DBF091D48E3AC00D4F914 /* FBSnapshotTestCase.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5D5DBF071D48E39C00D4F914 /* FBSnapshotTestCase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 5D5DBF0B1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D5DBF0A1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m */; };
+ 5D60088A1BE3ED540094A505 /* SDLStateMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D6008881BE3ED540094A505 /* SDLStateMachine.h */; };
+ 5D60088B1BE3ED540094A505 /* SDLStateMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D6008891BE3ED540094A505 /* SDLStateMachine.m */; };
+ 5D616B451D552F7A00553F6B /* SDLLockScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5D616B481D552F7A00553F6B /* SDLLockScreen.storyboard */; };
+ 5D616B461D552F7A00553F6B /* SDLLockScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5D616B481D552F7A00553F6B /* SDLLockScreen.storyboard */; };
+ 5D616B531D59044400553F6B /* SDLErrorConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D616B511D59044400553F6B /* SDLErrorConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D61FA211A84237100846EE7 /* SmartDeviceLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FA201A84237100846EE7 /* SmartDeviceLink.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D61FA331A84237100846EE7 /* SmartDeviceLink.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D61FA1C1A84237100846EE7 /* SmartDeviceLink.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
5D61FA341A84237100846EE7 /* SmartDeviceLink.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5D61FA1C1A84237100846EE7 /* SmartDeviceLink.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -460,8 +489,8 @@
5D61FCED1A84238C00846EE7 /* SDLListFiles.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB001A84238A00846EE7 /* SDLListFiles.m */; };
5D61FCEE1A84238C00846EE7 /* SDLListFilesResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB011A84238A00846EE7 /* SDLListFilesResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D61FCEF1A84238C00846EE7 /* SDLListFilesResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB021A84238A00846EE7 /* SDLListFilesResponse.m */; };
- 5D61FCF01A84238C00846EE7 /* SDLLockScreenManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB031A84238A00846EE7 /* SDLLockScreenManager.h */; };
- 5D61FCF11A84238C00846EE7 /* SDLLockScreenManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB041A84238A00846EE7 /* SDLLockScreenManager.m */; };
+ 5D61FCF01A84238C00846EE7 /* SDLLockScreenStatusManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB031A84238A00846EE7 /* SDLLockScreenStatusManager.h */; };
+ 5D61FCF11A84238C00846EE7 /* SDLLockScreenStatusManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB041A84238A00846EE7 /* SDLLockScreenStatusManager.m */; };
5D61FCF21A84238C00846EE7 /* SDLLockScreenStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB051A84238A00846EE7 /* SDLLockScreenStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D61FCF31A84238C00846EE7 /* SDLLockScreenStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FB061A84238A00846EE7 /* SDLLockScreenStatus.m */; };
5D61FCF41A84238C00846EE7 /* SDLMaintenanceModeStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FB071A84238A00846EE7 /* SDLMaintenanceModeStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -750,23 +779,92 @@
5D61FE131A84238C00846EE7 /* SDLWiperStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FC261A84238C00846EE7 /* SDLWiperStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D61FE141A84238C00846EE7 /* SDLWiperStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D61FC271A84238C00846EE7 /* SDLWiperStatus.m */; };
5D6CC8EF1C610E660027F60A /* SDLSecurityType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D6CC8EE1C610E660027F60A /* SDLSecurityType.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5D86022E1C99AF5100A55266 /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D1464351C99AC0900727339 /* OCMock.framework */; };
- 5D86022F1C99AF5900A55266 /* OCMock.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5D1464351C99AC0900727339 /* OCMock.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
- 5D8602301C99AF8300A55266 /* Nimble.framework.dSYM in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5D1464311C99AC0000727339 /* Nimble.framework.dSYM */; };
- 5D8602311C99AF8300A55266 /* OCMock.framework.dSYM in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5D1464331C99AC0900727339 /* OCMock.framework.dSYM */; };
- 5D8602321C99AF8300A55266 /* Quick.framework.dSYM in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5D1464341C99AC0900727339 /* Quick.framework.dSYM */; };
+ 5D6EB4CC1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D6EB4CB1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m */; };
+ 5D6F7A2B1BC45BF70070BF37 /* SDLRequestHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D6F7A2A1BC45BF70070BF37 /* SDLRequestHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D6F7A2E1BC5650B0070BF37 /* SDLLifecycleConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D6F7A2C1BC5650B0070BF37 /* SDLLifecycleConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D6F7A2F1BC5650B0070BF37 /* SDLLifecycleConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D6F7A2D1BC5650B0070BF37 /* SDLLifecycleConfiguration.m */; };
+ 5D6F7A351BC5B9B60070BF37 /* SDLLockScreenViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D6F7A331BC5B9B60070BF37 /* SDLLockScreenViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D6F7A361BC5B9B60070BF37 /* SDLLockScreenViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D6F7A341BC5B9B60070BF37 /* SDLLockScreenViewController.m */; };
+ 5D6F7A3E1BC811FC0070BF37 /* SDLAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5D6F7A3D1BC811FC0070BF37 /* SDLAssets.xcassets */; };
+ 5D76E31C1D3805FF00647CFA /* SDLLockScreenManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D76E31B1D3805FF00647CFA /* SDLLockScreenManagerSpec.m */; };
+ 5D76E3211D39742300647CFA /* SDLViewControllerPresentable.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D76E3201D39742300647CFA /* SDLViewControllerPresentable.h */; };
+ 5D76E3241D39767000647CFA /* SDLLockScreenPresenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D76E3221D39767000647CFA /* SDLLockScreenPresenter.h */; };
+ 5D76E3251D39767000647CFA /* SDLLockScreenPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D76E3231D39767000647CFA /* SDLLockScreenPresenter.m */; };
+ 5D76E3291D3D0A8800647CFA /* SDLFakeViewControllerPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D76E3281D3D0A8800647CFA /* SDLFakeViewControllerPresenter.m */; };
+ 5D76E32B1D3D52CA00647CFA /* SDLAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5D6F7A3D1BC811FC0070BF37 /* SDLAssets.xcassets */; };
+ 5D79A03B1CE36F030035797B /* SDLUploadFileOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D79A0391CE36F030035797B /* SDLUploadFileOperation.h */; };
+ 5D79A03C1CE36F030035797B /* SDLUploadFileOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D79A03A1CE36F030035797B /* SDLUploadFileOperation.m */; };
+ 5D7F87EB1CE3C1A1002DD7C4 /* SDLDeleteFileOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D7F87E91CE3C1A1002DD7C4 /* SDLDeleteFileOperation.h */; };
+ 5D7F87EC1CE3C1A1002DD7C4 /* SDLDeleteFileOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D7F87EA1CE3C1A1002DD7C4 /* SDLDeleteFileOperation.m */; };
+ 5D7F87EF1CE3C294002DD7C4 /* SDLFileManagerConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D7F87ED1CE3C294002DD7C4 /* SDLFileManagerConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D7F87F31CE3C29E002DD7C4 /* SDLFileWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D7F87F11CE3C29E002DD7C4 /* SDLFileWrapper.h */; };
+ 5D7F87F41CE3C29E002DD7C4 /* SDLFileWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D7F87F21CE3C29E002DD7C4 /* SDLFileWrapper.m */; };
+ 5D82041A1BCD80BA00D0A41B /* SDLLockScreenConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D8204181BCD80BA00D0A41B /* SDLLockScreenConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D82041B1BCD80BA00D0A41B /* SDLLockScreenConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D8204191BCD80BA00D0A41B /* SDLLockScreenConfiguration.m */; };
+ 5D82041E1BCD8E6100D0A41B /* SDLConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D82041C1BCD8E6100D0A41B /* SDLConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D82041F1BCD8E6100D0A41B /* SDLConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D82041D1BCD8E6100D0A41B /* SDLConfiguration.m */; };
+ 5D8204221BCEA89A00D0A41B /* SDLFileManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D8204201BCEA89A00D0A41B /* SDLFileManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D8204231BCEA89A00D0A41B /* SDLFileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D8204211BCEA89A00D0A41B /* SDLFileManager.m */; };
+ 5D8204261BCEA8A600D0A41B /* SDLPermissionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D8204241BCEA8A600D0A41B /* SDLPermissionManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D8204271BCEA8A600D0A41B /* SDLPermissionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D8204251BCEA8A600D0A41B /* SDLPermissionManager.m */; };
+ 5D82042D1BCEC32F00D0A41B /* SDLFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D82042B1BCEC32F00D0A41B /* SDLFile.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D82042E1BCEC32F00D0A41B /* SDLFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D82042C1BCEC32F00D0A41B /* SDLFile.m */; };
+ 5D8204311BD001C700D0A41B /* SDLArtwork.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D82042F1BD001C700D0A41B /* SDLArtwork.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5D8204321BD001C700D0A41B /* SDLArtwork.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D8204301BD001C700D0A41B /* SDLArtwork.m */; };
+ 5D850AB01D4907C500E6E7EE /* TestLockScreenAppIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 5D850AAF1D4907C500E6E7EE /* TestLockScreenAppIcon.png */; };
5D8B174F1AC9D266006A6E1C /* SDLDialNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D8B174D1AC9D266006A6E1C /* SDLDialNumber.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D8B17501AC9D266006A6E1C /* SDLDialNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D8B174E1AC9D266006A6E1C /* SDLDialNumber.m */; };
5D8B17531AC9E11B006A6E1C /* SDLDialNumberResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D8B17511AC9E11B006A6E1C /* SDLDialNumberResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D8B17541AC9E11B006A6E1C /* SDLDialNumberResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D8B17521AC9E11B006A6E1C /* SDLDialNumberResponse.m */; };
5D8B17561AC9E399006A6E1C /* SDLDialNumberSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D8B17551AC9E399006A6E1C /* SDLDialNumberSpec.m */; };
+ 5D9F50781BE7DD4C00FEF399 /* testFileJSON.json in Resources */ = {isa = PBXBuildFile; fileRef = 5D9F50721BE7DD4C00FEF399 /* testFileJSON.json */; };
+ 5D9F50791BE7DD4C00FEF399 /* testImageBMP.bmp in Resources */ = {isa = PBXBuildFile; fileRef = 5D9F50731BE7DD4C00FEF399 /* testImageBMP.bmp */; };
+ 5D9F507A1BE7DD4C00FEF399 /* testImageJPEG.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 5D9F50741BE7DD4C00FEF399 /* testImageJPEG.jpeg */; };
+ 5D9F507B1BE7DD4C00FEF399 /* testImageJPG.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 5D9F50751BE7DD4C00FEF399 /* testImageJPG.jpg */; };
+ 5D9F507C1BE7DD4C00FEF399 /* testImagePNG.png in Resources */ = {isa = PBXBuildFile; fileRef = 5D9F50761BE7DD4C00FEF399 /* testImagePNG.png */; };
+ 5D9F507D1BE7DD4C00FEF399 /* testImageTIFF.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 5D9F50771BE7DD4C00FEF399 /* testImageTIFF.tiff */; };
+ 5D9F50811BE7E6E300FEF399 /* SDLPermissionsManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9F50801BE7E6E300FEF399 /* SDLPermissionsManagerSpec.m */; };
+ 5D9F50831BEA5C6100FEF399 /* SDLFileManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9F50821BEA5C6100FEF399 /* SDLFileManagerSpec.m */; };
+ 5D9F50871BED412E00FEF399 /* TestConnectionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9F50861BED412E00FEF399 /* TestConnectionManager.m */; };
5DA026901AD44EE700019F86 /* SDLDialNumberResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA0268F1AD44EE700019F86 /* SDLDialNumberResponseSpec.m */; };
+ 5DA102A41D4122C700C15826 /* NSMutableDictionary+SafeRemove.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DA102A21D4122C700C15826 /* NSMutableDictionary+SafeRemove.h */; };
+ 5DA102A51D4122C700C15826 /* NSMutableDictionary+SafeRemove.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA102A31D4122C700C15826 /* NSMutableDictionary+SafeRemove.m */; };
+ 5DA22CB71D075CF200245F5F /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA22CB31D075CF200245F5F /* Nimble.framework */; };
+ 5DA22CB81D075CF200245F5F /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA22CB41D075CF200245F5F /* OCMock.framework */; };
+ 5DA22CB91D075CF200245F5F /* OHHTTPStubs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA22CB51D075CF200245F5F /* OHHTTPStubs.framework */; };
+ 5DA22CBA1D075CF200245F5F /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA22CB61D075CF200245F5F /* Quick.framework */; };
+ 5DA22CBB1D075DE800245F5F /* Nimble.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5DA22CB31D075CF200245F5F /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 5DA22CBC1D075DE800245F5F /* OCMock.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5DA22CB41D075CF200245F5F /* OCMock.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 5DA22CBD1D075DE800245F5F /* OHHTTPStubs.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5DA22CB51D075CF200245F5F /* OHHTTPStubs.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 5DA22CBE1D075DE800245F5F /* Quick.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5DA22CB61D075CF200245F5F /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 5DA22CBF1D075DEC00245F5F /* SmartDeviceLink.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5D61FA1C1A84237100846EE7 /* SmartDeviceLink.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ 5DA3F3541BC448060026F2D0 /* NSMapTable+Subscripting.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DA3F3521BC448060026F2D0 /* NSMapTable+Subscripting.h */; };
+ 5DA3F3551BC448060026F2D0 /* NSMapTable+Subscripting.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA3F3531BC448060026F2D0 /* NSMapTable+Subscripting.m */; };
+ 5DA3F35A1BC448480026F2D0 /* SDLError.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DA3F3581BC448480026F2D0 /* SDLError.h */; };
+ 5DA3F35B1BC448480026F2D0 /* SDLError.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA3F3591BC448480026F2D0 /* SDLError.m */; };
+ 5DA3F35F1BC448590026F2D0 /* SDLNotificationConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DA3F35D1BC448590026F2D0 /* SDLNotificationConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5DA3F3601BC448590026F2D0 /* SDLNotificationConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA3F35E1BC448590026F2D0 /* SDLNotificationConstants.m */; };
+ 5DA3F3701BC4489A0026F2D0 /* SDLManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DA3F36E1BC4489A0026F2D0 /* SDLManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5DA3F3711BC4489A0026F2D0 /* SDLManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA3F36F1BC4489A0026F2D0 /* SDLManager.m */; };
+ 5DAE06731BDEC6C000F9B498 /* SDLFileSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DAE06721BDEC6C000F9B498 /* SDLFileSpec.m */; };
+ 5DAE06751BDEC6D600F9B498 /* SDLArtworkSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DAE06741BDEC6D600F9B498 /* SDLArtworkSpec.m */; };
+ 5DB1BCD31D243A8E002FFC37 /* SDLDeleteFileOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCD01D243A8E002FFC37 /* SDLDeleteFileOperationSpec.m */; };
+ 5DB1BCD41D243A8E002FFC37 /* SDLListFilesOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCD11D243A8E002FFC37 /* SDLListFilesOperationSpec.m */; };
+ 5DB1BCD51D243A8E002FFC37 /* SDLUploadFileOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCD21D243A8E002FFC37 /* SDLUploadFileOperationSpec.m */; };
+ 5DB1BCD81D243AA6002FFC37 /* SDLPermissionFilterSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCD71D243AA6002FFC37 /* SDLPermissionFilterSpec.m */; };
+ 5DB1BCDA1D243D85002FFC37 /* SDLStateMachineSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCD91D243D85002FFC37 /* SDLStateMachineSpec.m */; };
+ 5DB1BCDD1D243DC3002FFC37 /* SDLLifecycleConfigurationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCDC1D243DC3002FFC37 /* SDLLifecycleConfigurationSpec.m */; };
+ 5DB1BCDF1D243DD3002FFC37 /* SDLLockScreenConfigurationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCDE1D243DD3002FFC37 /* SDLLockScreenConfigurationSpec.m */; };
+ 5DB1BCE11D243DDE002FFC37 /* SDLConfigurationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCE01D243DDE002FFC37 /* SDLConfigurationSpec.m */; };
+ 5DB1BCE71D245647002FFC37 /* TestStateMachineTarget.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB1BCE61D245647002FFC37 /* TestStateMachineTarget.m */; };
5DB92D241AC47B2C00C15BB0 /* SDLHexUtilitySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB92D231AC47B2C00C15BB0 /* SDLHexUtilitySpec.m */; };
5DB92D261AC4836F00C15BB0 /* SDLJingleSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB92D251AC4836F00C15BB0 /* SDLJingleSpec.m */; };
5DB92D2D1AC4A34F00C15BB0 /* SDLPrioritizedObjectCollectionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB92D2C1AC4A34F00C15BB0 /* SDLPrioritizedObjectCollectionSpec.m */; };
5DB92D2F1AC59F0000C15BB0 /* SDLObjectWithPrioritySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB92D2E1AC59F0000C15BB0 /* SDLObjectWithPrioritySpec.m */; };
5DB92D321AC9C8BA00C15BB0 /* SDLRPCStruct.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DB92D301AC9C8BA00C15BB0 /* SDLRPCStruct.h */; settings = {ATTRIBUTES = (Public, ); }; };
5DB92D331AC9C8BA00C15BB0 /* SDLRPCStruct.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DB92D311AC9C8BA00C15BB0 /* SDLRPCStruct.m */; };
+ 5DBAE0AB1D3588AC00CE00BF /* SDLNotificationDispatcherSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DBAE0AA1D3588AC00CE00BF /* SDLNotificationDispatcherSpec.m */; };
+ 5DBAE0AD1D368D1A00CE00BF /* SDLResponseDispatcherSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DBAE0AC1D368D1A00CE00BF /* SDLResponseDispatcherSpec.m */; };
5DC978261B7A38640012C2F1 /* SDLGlobalsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DC978251B7A38640012C2F1 /* SDLGlobalsSpec.m */; };
5DCC19A01B8221F3004FFAD9 /* SDLURLSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DCC199E1B8221F3004FFAD9 /* SDLURLSession.h */; };
5DCC19A11B8221F3004FFAD9 /* SDLURLSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DCC199F1B8221F3004FFAD9 /* SDLURLSession.m */; };
@@ -785,15 +883,31 @@
5DE5ABB71B0E38C90067BB02 /* SDLSystemRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FBD21A84238B00846EE7 /* SDLSystemRequest.h */; };
5DE5ABB81B0E38C90067BB02 /* SDLSystemRequestResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D61FBD41A84238B00846EE7 /* SDLSystemRequestResponse.h */; };
5DEE55C01B8509CB004F0D0F /* SDLURLRequestTaskSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DEE55BF1B8509CB004F0D0F /* SDLURLRequestTaskSpec.m */; };
- 5DEE55C21B864A7D004F0D0F /* OHHTTPStubs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DEE55C11B864A7D004F0D0F /* OHHTTPStubs.framework */; };
- 5DEE55C51B864AB3004F0D0F /* OHHTTPStubs.framework.dSYM in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5DEE55C41B864AB3004F0D0F /* OHHTTPStubs.framework.dSYM */; };
- 5DEE55C61B8666A8004F0D0F /* OHHTTPStubs.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5DEE55C11B864A7D004F0D0F /* OHHTTPStubs.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
5DF2BB9D1B94E38A00CE5994 /* SDLURLSessionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF2BB9C1B94E38A00CE5994 /* SDLURLSessionSpec.m */; };
+ 5DFFB9151BD7C89700DB3F04 /* SDLConnectionManagerType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */; };
DA4353DF1D271FD10099B8C4 /* CGPointUtilSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4353DE1D271FD10099B8C4 /* CGPointUtilSpec.m */; };
DA4353E31D2720A30099B8C4 /* SDLPinchGestureSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4353E21D2720A30099B8C4 /* SDLPinchGestureSpec.m */; };
DA4353E91D2721680099B8C4 /* DispatchTimerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4353E61D2721680099B8C4 /* DispatchTimerSpec.m */; };
DA4353EA1D2721680099B8C4 /* SDLTouchManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4353E71D2721680099B8C4 /* SDLTouchManagerSpec.m */; };
DA4353EB1D2721680099B8C4 /* SDLTouchSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4353E81D2721680099B8C4 /* SDLTouchSpec.m */; };
+ DA7515B11D95FAA000F29323 /* lock_arrow_down_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515981D95FAA000F29323 /* lock_arrow_down_black.png */; };
+ DA7515B21D95FAA000F29323 /* lock_arrow_down_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515991D95FAA000F29323 /* lock_arrow_down_black@2x.png */; };
+ DA7515B31D95FAA000F29323 /* lock_arrow_down_black@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA75159A1D95FAA000F29323 /* lock_arrow_down_black@3x.png */; };
+ DA7515B41D95FAA000F29323 /* lock_arrow_down_white.png in Resources */ = {isa = PBXBuildFile; fileRef = DA75159C1D95FAA000F29323 /* lock_arrow_down_white.png */; };
+ DA7515B51D95FAA000F29323 /* lock_arrow_down_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA75159D1D95FAA000F29323 /* lock_arrow_down_white@2x.png */; };
+ DA7515B61D95FAA000F29323 /* lock_arrow_down_white@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA75159E1D95FAA000F29323 /* lock_arrow_down_white@3x.png */; };
+ DA7515B71D95FAA000F29323 /* lock_arrow_up_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515A11D95FAA000F29323 /* lock_arrow_up_black.png */; };
+ DA7515B81D95FAA000F29323 /* lock_arrow_up_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515A21D95FAA000F29323 /* lock_arrow_up_black@2x.png */; };
+ DA7515B91D95FAA000F29323 /* lock_arrow_up_black@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515A31D95FAA000F29323 /* lock_arrow_up_black@3x.png */; };
+ DA7515BA1D95FAA000F29323 /* lock_arrow_up_white.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515A51D95FAA000F29323 /* lock_arrow_up_white.png */; };
+ DA7515BB1D95FAA000F29323 /* lock_arrow_up_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515A61D95FAA000F29323 /* lock_arrow_up_white@2x.png */; };
+ DA7515BC1D95FAA000F29323 /* lock_arrow_up_white@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515A71D95FAA000F29323 /* lock_arrow_up_white@3x.png */; };
+ DA7515BD1D95FAA000F29323 /* sdl_logo_black.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515AA1D95FAA000F29323 /* sdl_logo_black.png */; };
+ DA7515BE1D95FAA000F29323 /* sdl_logo_black@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515AB1D95FAA000F29323 /* sdl_logo_black@2x.png */; };
+ DA7515BF1D95FAA000F29323 /* sdl_logo_black@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515AC1D95FAA000F29323 /* sdl_logo_black@3x.png */; };
+ DA7515C01D95FAA000F29323 /* sdl_logo_white.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515AE1D95FAA000F29323 /* sdl_logo_white.png */; };
+ DA7515C11D95FAA000F29323 /* sdl_logo_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515AF1D95FAA000F29323 /* sdl_logo_white@2x.png */; };
+ DA7515C21D95FAA000F29323 /* sdl_logo_white@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA7515B01D95FAA000F29323 /* sdl_logo_white@3x.png */; };
DA96C0661D4D4F730022F520 /* SDLAppInfoSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = DA96C0651D4D4F730022F520 /* SDLAppInfoSpec.m */; };
DAC572571D1067270004288B /* SDLTouchManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DAC572551D1067270004288B /* SDLTouchManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
DAC572581D1067270004288B /* SDLTouchManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DAC572561D1067270004288B /* SDLTouchManager.m */; };
@@ -850,20 +964,6 @@
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
- 162E81CE1A9BDDBB00906325 /* CopyFiles */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 5DEE55C61B8666A8004F0D0F /* OHHTTPStubs.framework in CopyFiles */,
- 5D86022F1C99AF5900A55266 /* OCMock.framework in CopyFiles */,
- 5D4AB7A21B21EC16004C1AB0 /* SmartDeviceLink.framework in CopyFiles */,
- 162E81CF1A9BDDD800906325 /* Nimble.framework in CopyFiles */,
- 162E81D01A9BDDD800906325 /* Quick.framework in CopyFiles */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
5D401CE11A76ED0B0006B0C2 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -875,24 +975,24 @@
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
- 5DEE55C31B864A98004F0D0F /* CopyFiles */ = {
+ 5DA22C861D0745B000245F5F /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
- dstSubfolderSpec = 16;
+ dstSubfolderSpec = 10;
files = (
- 5D8602301C99AF8300A55266 /* Nimble.framework.dSYM in CopyFiles */,
- 5DEE55C51B864AB3004F0D0F /* OHHTTPStubs.framework.dSYM in CopyFiles */,
- 5D8602311C99AF8300A55266 /* OCMock.framework.dSYM in CopyFiles */,
- 5D8602321C99AF8300A55266 /* Quick.framework.dSYM in CopyFiles */,
+ 5DA22CBF1D075DEC00245F5F /* SmartDeviceLink.framework in CopyFiles */,
+ 5DA22CBB1D075DE800245F5F /* Nimble.framework in CopyFiles */,
+ 5DA22CBC1D075DE800245F5F /* OCMock.framework in CopyFiles */,
+ 5DA22CBD1D075DE800245F5F /* OHHTTPStubs.framework in CopyFiles */,
+ 5DA22CBE1D075DE800245F5F /* Quick.framework in CopyFiles */,
+ 5D5DBF091D48E3AC00D4F914 /* FBSnapshotTestCase.framework in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 162E81C81A9BDD3F00906325 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/iOS/Nimble.framework; sourceTree = "<group>"; };
- 162E81C91A9BDD3F00906325 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/iOS/Quick.framework; sourceTree = "<group>"; };
162E81E21A9BDE8A00906325 /* SDLAmbientLightStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAmbientLightStatusSpec.m; sourceTree = "<group>"; };
162E81E31A9BDE8A00906325 /* SDLAppHMITypeSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAppHMITypeSpec.m; sourceTree = "<group>"; };
162E81E41A9BDE8A00906325 /* SDLAppInterfaceUnregisteredReasonSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAppInterfaceUnregisteredReasonSpec.m; sourceTree = "<group>"; };
@@ -1128,10 +1228,9 @@
5D0218FD1A8E9E0D00D1BF62 /* ConnectionIAPTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConnectionIAPTableViewController.h; path = SmartDeviceLink_Example/Classes/ConnectionIAPTableViewController.h; sourceTree = SOURCE_ROOT; };
5D0218FE1A8E9E0D00D1BF62 /* ConnectionIAPTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ConnectionIAPTableViewController.m; path = SmartDeviceLink_Example/Classes/ConnectionIAPTableViewController.m; sourceTree = SOURCE_ROOT; };
5D0219041A8E9F6D00D1BF62 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = SmartDeviceLink_Example/Base.lproj/ConnectionIAPTableViewController.storyboard; sourceTree = SOURCE_ROOT; };
- 5D1464311C99AC0000727339 /* Nimble.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = Nimble.framework.dSYM; path = Carthage/Build/iOS/Nimble.framework.dSYM; sourceTree = "<group>"; };
- 5D1464331C99AC0900727339 /* OCMock.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = OCMock.framework.dSYM; path = Carthage/Build/iOS/OCMock.framework.dSYM; sourceTree = "<group>"; };
- 5D1464341C99AC0900727339 /* Quick.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = Quick.framework.dSYM; path = Carthage/Build/iOS/Quick.framework.dSYM; sourceTree = "<group>"; };
- 5D1464351C99AC0900727339 /* OCMock.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCMock.framework; path = Carthage/Build/iOS/OCMock.framework; sourceTree = "<group>"; };
+ 5D1654551D3E754F00554D93 /* SDLLifecycleManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleManagerSpec.m; path = DevAPISpecs/SDLLifecycleManagerSpec.m; sourceTree = "<group>"; };
+ 5D1654581D3E7A1600554D93 /* SDLLifecycleManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLifecycleManager.h; sourceTree = "<group>"; };
+ 5D1654591D3E7A1600554D93 /* SDLLifecycleManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLifecycleManager.m; sourceTree = "<group>"; };
5D1665A01CF5D5DA00CC4CA1 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = SOURCE_ROOT; };
5D1665A11CF5D5DA00CC4CA1 /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .travis.yml; sourceTree = SOURCE_ROOT; };
5D1665A21CF5D5DA00CC4CA1 /* Cartfile.private */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.private; sourceTree = SOURCE_ROOT; };
@@ -1140,7 +1239,22 @@
5D1665A51CF5D5DA00CC4CA1 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = SOURCE_ROOT; };
5D1665A61CF5D5DA00CC4CA1 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; };
5D1665A71CF5D5DA00CC4CA1 /* SmartDeviceLink-iOS.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = "SmartDeviceLink-iOS.podspec"; sourceTree = SOURCE_ROOT; };
- 5D4019AF1A76EC350006B0C2 /* SmartDeviceLink-Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SmartDeviceLink-Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5D1665C21CF8CA2700CC4CA1 /* SDLListFilesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLListFilesOperation.h; sourceTree = "<group>"; };
+ 5D1665C31CF8CA2700CC4CA1 /* SDLListFilesOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLListFilesOperation.m; sourceTree = "<group>"; };
+ 5D1665C61CF8CA3D00CC4CA1 /* SDLPermissionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLPermissionFilter.h; sourceTree = "<group>"; };
+ 5D1665C71CF8CA3D00CC4CA1 /* SDLPermissionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLPermissionFilter.m; sourceTree = "<group>"; };
+ 5D1665CA1CF8CA6700CC4CA1 /* NSNumber+NumberType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNumber+NumberType.h"; sourceTree = "<group>"; };
+ 5D1665CC1CF8CA8A00CC4CA1 /* SDLPermissionConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLPermissionConstants.h; sourceTree = "<group>"; };
+ 5D2F58071D0717D5001085CE /* SDLManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLManagerDelegate.h; sourceTree = "<group>"; };
+ 5D3E48731D6F3B330000BFEF /* SDLAsynchronousOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLAsynchronousOperation.h; sourceTree = "<group>"; };
+ 5D3E48741D6F3B330000BFEF /* SDLAsynchronousOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAsynchronousOperation.m; sourceTree = "<group>"; };
+ 5D3E48791D6F888E0000BFEF /* SDLRPCResponseNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLRPCResponseNotification.h; sourceTree = "<group>"; };
+ 5D3E487A1D6F888E0000BFEF /* SDLRPCResponseNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLRPCResponseNotification.m; sourceTree = "<group>"; };
+ 5D3E487D1D6F88A30000BFEF /* SDLRPCNotificationNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLRPCNotificationNotification.h; sourceTree = "<group>"; };
+ 5D3E487E1D6F88A30000BFEF /* SDLRPCNotificationNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLRPCNotificationNotification.m; sourceTree = "<group>"; };
+ 5D3E48C91D7722FE0000BFEF /* NSBundle+SDLBundle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSBundle+SDLBundle.h"; sourceTree = "<group>"; };
+ 5D3E48CA1D7722FE0000BFEF /* NSBundle+SDLBundle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSBundle+SDLBundle.m"; sourceTree = "<group>"; };
+ 5D4019AF1A76EC350006B0C2 /* SDL Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "SDL Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
5D4029D31A76F0340006B0C2 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = SmartDeviceLink_Example/Images.xcassets; sourceTree = SOURCE_ROOT; };
5D4029D51A76F0410006B0C2 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = SmartDeviceLink_Example/Info.plist; sourceTree = SOURCE_ROOT; };
5D4029E01A76F0760006B0C2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = SmartDeviceLink_Example/Base.lproj/LaunchScreen.xib; sourceTree = SOURCE_ROOT; };
@@ -1153,6 +1267,12 @@
5D4832A41A94F90D00252386 /* ConnectionTransitionContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ConnectionTransitionContext.m; path = SmartDeviceLink_Example/Classes/ConnectionTransitionContext.m; sourceTree = SOURCE_ROOT; };
5D4832A61A95191B00252386 /* ConnectionAnimatedTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConnectionAnimatedTransition.h; path = SmartDeviceLink_Example/Classes/ConnectionAnimatedTransition.h; sourceTree = SOURCE_ROOT; };
5D4832A71A95191B00252386 /* ConnectionAnimatedTransition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ConnectionAnimatedTransition.m; path = SmartDeviceLink_Example/Classes/ConnectionAnimatedTransition.m; sourceTree = SOURCE_ROOT; };
+ 5D4D67AA1D2ED37A00468B4A /* SDLNotificationDispatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLNotificationDispatcher.h; sourceTree = "<group>"; };
+ 5D4D67AB1D2ED37A00468B4A /* SDLNotificationDispatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLNotificationDispatcher.m; sourceTree = "<group>"; };
+ 5D4D67AE1D2FE2F900468B4A /* SDLResponseDispatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLResponseDispatcher.h; sourceTree = "<group>"; };
+ 5D4D67AF1D2FE2F900468B4A /* SDLResponseDispatcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLResponseDispatcher.m; sourceTree = "<group>"; };
+ 5D4D67B21D30161600468B4A /* SDLLockScreenManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLockScreenManager.h; sourceTree = "<group>"; };
+ 5D4D67B31D30161600468B4A /* SDLLockScreenManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLockScreenManager.m; sourceTree = "<group>"; };
5D535DC31B72473800CF7760 /* SDLGlobals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLGlobals.h; sourceTree = "<group>"; };
5D535DC41B72473800CF7760 /* SDLGlobals.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLGlobals.m; sourceTree = "<group>"; };
5D53C46B1B7A99B9003526EA /* SDLStreamingMediaManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLStreamingMediaManager.h; sourceTree = "<group>"; };
@@ -1160,7 +1280,19 @@
5D59350B1A855EB300687FB9 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = SmartDeviceLink_Example/Classes/AppDelegate.h; sourceTree = SOURCE_ROOT; };
5D59350C1A855EB300687FB9 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = SmartDeviceLink_Example/Classes/AppDelegate.m; sourceTree = SOURCE_ROOT; };
5D5935111A855EBE00687FB9 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = SmartDeviceLink_Example/Classes/main.m; sourceTree = SOURCE_ROOT; };
- 5D59DD461B14FDEE00BE744D /* SDLLockScreenManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLockScreenManagerSpec.m; path = ProxySpecs/SDLLockScreenManagerSpec.m; sourceTree = "<group>"; };
+ 5D59DD461B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLockScreenStatusManagerSpec.m; path = ProxySpecs/SDLLockScreenStatusManagerSpec.m; sourceTree = "<group>"; };
+ 5D5DBF071D48E39C00D4F914 /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FBSnapshotTestCase.framework; path = sdl_ios/Carthage/Build/iOS/FBSnapshotTestCase.framework; sourceTree = "<group>"; };
+ 5D5DBF0A1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLockScreenViewControllerSnapshotTests.m; path = DevAPISpecs/SDLLockScreenViewControllerSnapshotTests.m; sourceTree = "<group>"; };
+ 5D6008881BE3ED540094A505 /* SDLStateMachine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLStateMachine.h; sourceTree = "<group>"; };
+ 5D6008891BE3ED540094A505 /* SDLStateMachine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLStateMachine.m; sourceTree = "<group>"; };
+ 5D616B471D552F7A00553F6B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/SDLLockScreen.storyboard; sourceTree = "<group>"; };
+ 5D616B511D59044400553F6B /* SDLErrorConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLErrorConstants.h; sourceTree = "<group>"; };
+ 5D616B561D5A233100553F6B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/SDLLockScreen.strings; sourceTree = "<group>"; };
+ 5D616B571D5A23C500553F6B /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/SDLLockScreen.strings; sourceTree = "<group>"; };
+ 5D616B581D5A23CC00553F6B /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/SDLLockScreen.strings; sourceTree = "<group>"; };
+ 5D616B591D5A23D400553F6B /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/SDLLockScreen.strings; sourceTree = "<group>"; };
+ 5D616B5A1D5A23DC00553F6B /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/SDLLockScreen.strings"; sourceTree = "<group>"; };
+ 5D616B5B1D5A23E400553F6B /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/SDLLockScreen.strings; sourceTree = "<group>"; };
5D61FA1C1A84237100846EE7 /* SmartDeviceLink.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SmartDeviceLink.framework; sourceTree = BUILT_PRODUCTS_DIR; };
5D61FA1F1A84237100846EE7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
5D61FA201A84237100846EE7 /* SmartDeviceLink.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SmartDeviceLink.h; sourceTree = "<group>"; };
@@ -1364,8 +1496,8 @@
5D61FB001A84238A00846EE7 /* SDLListFiles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLListFiles.m; sourceTree = "<group>"; };
5D61FB011A84238A00846EE7 /* SDLListFilesResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLListFilesResponse.h; sourceTree = "<group>"; };
5D61FB021A84238A00846EE7 /* SDLListFilesResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLListFilesResponse.m; sourceTree = "<group>"; };
- 5D61FB031A84238A00846EE7 /* SDLLockScreenManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLockScreenManager.h; sourceTree = "<group>"; };
- 5D61FB041A84238A00846EE7 /* SDLLockScreenManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLockScreenManager.m; sourceTree = "<group>"; };
+ 5D61FB031A84238A00846EE7 /* SDLLockScreenStatusManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLockScreenStatusManager.h; sourceTree = "<group>"; };
+ 5D61FB041A84238A00846EE7 /* SDLLockScreenStatusManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLockScreenStatusManager.m; sourceTree = "<group>"; };
5D61FB051A84238A00846EE7 /* SDLLockScreenStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLockScreenStatus.h; sourceTree = "<group>"; };
5D61FB061A84238A00846EE7 /* SDLLockScreenStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLockScreenStatus.m; sourceTree = "<group>"; };
5D61FB071A84238A00846EE7 /* SDLMaintenanceModeStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLMaintenanceModeStatus.h; sourceTree = "<group>"; };
@@ -1656,18 +1788,89 @@
5D61FC261A84238C00846EE7 /* SDLWiperStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLWiperStatus.h; sourceTree = "<group>"; };
5D61FC271A84238C00846EE7 /* SDLWiperStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLWiperStatus.m; sourceTree = "<group>"; };
5D6CC8EE1C610E660027F60A /* SDLSecurityType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLSecurityType.h; sourceTree = "<group>"; };
+ 5D6EB4CB1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMapTable+SubscriptingSpec.m"; path = "DevAPISpecs/NSMapTable+SubscriptingSpec.m"; sourceTree = "<group>"; };
+ 5D6F7A2A1BC45BF70070BF37 /* SDLRequestHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLRequestHandler.h; sourceTree = "<group>"; };
+ 5D6F7A2C1BC5650B0070BF37 /* SDLLifecycleConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLifecycleConfiguration.h; sourceTree = "<group>"; };
+ 5D6F7A2D1BC5650B0070BF37 /* SDLLifecycleConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLifecycleConfiguration.m; sourceTree = "<group>"; };
+ 5D6F7A331BC5B9B60070BF37 /* SDLLockScreenViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLockScreenViewController.h; sourceTree = "<group>"; };
+ 5D6F7A341BC5B9B60070BF37 /* SDLLockScreenViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLockScreenViewController.m; sourceTree = "<group>"; };
+ 5D6F7A3D1BC811FC0070BF37 /* SDLAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = SDLAssets.xcassets; path = Assets/SDLAssets.xcassets; sourceTree = "<group>"; };
+ 5D76E31B1D3805FF00647CFA /* SDLLockScreenManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLockScreenManagerSpec.m; path = DevAPISpecs/SDLLockScreenManagerSpec.m; sourceTree = "<group>"; };
+ 5D76E3201D39742300647CFA /* SDLViewControllerPresentable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLViewControllerPresentable.h; sourceTree = "<group>"; };
+ 5D76E3221D39767000647CFA /* SDLLockScreenPresenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLockScreenPresenter.h; sourceTree = "<group>"; };
+ 5D76E3231D39767000647CFA /* SDLLockScreenPresenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLockScreenPresenter.m; sourceTree = "<group>"; };
+ 5D76E3271D3D0A8800647CFA /* SDLFakeViewControllerPresenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLFakeViewControllerPresenter.h; path = DevAPISpecs/SDLFakeViewControllerPresenter.h; sourceTree = "<group>"; };
+ 5D76E3281D3D0A8800647CFA /* SDLFakeViewControllerPresenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLFakeViewControllerPresenter.m; path = DevAPISpecs/SDLFakeViewControllerPresenter.m; sourceTree = "<group>"; };
+ 5D79A0391CE36F030035797B /* SDLUploadFileOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLUploadFileOperation.h; sourceTree = "<group>"; };
+ 5D79A03A1CE36F030035797B /* SDLUploadFileOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLUploadFileOperation.m; sourceTree = "<group>"; };
+ 5D7F87E91CE3C1A1002DD7C4 /* SDLDeleteFileOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLDeleteFileOperation.h; sourceTree = "<group>"; };
+ 5D7F87EA1CE3C1A1002DD7C4 /* SDLDeleteFileOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLDeleteFileOperation.m; sourceTree = "<group>"; };
+ 5D7F87ED1CE3C294002DD7C4 /* SDLFileManagerConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLFileManagerConstants.h; sourceTree = "<group>"; };
+ 5D7F87F11CE3C29E002DD7C4 /* SDLFileWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLFileWrapper.h; sourceTree = "<group>"; };
+ 5D7F87F21CE3C29E002DD7C4 /* SDLFileWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLFileWrapper.m; sourceTree = "<group>"; };
+ 5D8204181BCD80BA00D0A41B /* SDLLockScreenConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLockScreenConfiguration.h; sourceTree = "<group>"; };
+ 5D8204191BCD80BA00D0A41B /* SDLLockScreenConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLockScreenConfiguration.m; sourceTree = "<group>"; };
+ 5D82041C1BCD8E6100D0A41B /* SDLConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLConfiguration.h; sourceTree = "<group>"; };
+ 5D82041D1BCD8E6100D0A41B /* SDLConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLConfiguration.m; sourceTree = "<group>"; };
+ 5D8204201BCEA89A00D0A41B /* SDLFileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLFileManager.h; sourceTree = "<group>"; };
+ 5D8204211BCEA89A00D0A41B /* SDLFileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLFileManager.m; sourceTree = "<group>"; };
+ 5D8204241BCEA8A600D0A41B /* SDLPermissionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLPermissionManager.h; sourceTree = "<group>"; };
+ 5D8204251BCEA8A600D0A41B /* SDLPermissionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLPermissionManager.m; sourceTree = "<group>"; };
+ 5D82042B1BCEC32F00D0A41B /* SDLFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLFile.h; sourceTree = "<group>"; };
+ 5D82042C1BCEC32F00D0A41B /* SDLFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLFile.m; sourceTree = "<group>"; };
+ 5D82042F1BD001C700D0A41B /* SDLArtwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLArtwork.h; sourceTree = "<group>"; };
+ 5D8204301BD001C700D0A41B /* SDLArtwork.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLArtwork.m; sourceTree = "<group>"; };
+ 5D850AAF1D4907C500E6E7EE /* TestLockScreenAppIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = TestLockScreenAppIcon.png; sourceTree = "<group>"; };
5D8B174D1AC9D266006A6E1C /* SDLDialNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLDialNumber.h; sourceTree = "<group>"; };
5D8B174E1AC9D266006A6E1C /* SDLDialNumber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLDialNumber.m; sourceTree = "<group>"; };
5D8B17511AC9E11B006A6E1C /* SDLDialNumberResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLDialNumberResponse.h; sourceTree = "<group>"; };
5D8B17521AC9E11B006A6E1C /* SDLDialNumberResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLDialNumberResponse.m; sourceTree = "<group>"; };
5D8B17551AC9E399006A6E1C /* SDLDialNumberSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLDialNumberSpec.m; sourceTree = "<group>"; };
+ 5D9F50721BE7DD4C00FEF399 /* testFileJSON.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = testFileJSON.json; sourceTree = "<group>"; };
+ 5D9F50731BE7DD4C00FEF399 /* testImageBMP.bmp */ = {isa = PBXFileReference; lastKnownFileType = image.bmp; path = testImageBMP.bmp; sourceTree = "<group>"; };
+ 5D9F50741BE7DD4C00FEF399 /* testImageJPEG.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = testImageJPEG.jpeg; sourceTree = "<group>"; };
+ 5D9F50751BE7DD4C00FEF399 /* testImageJPG.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = testImageJPG.jpg; sourceTree = "<group>"; };
+ 5D9F50761BE7DD4C00FEF399 /* testImagePNG.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = testImagePNG.png; sourceTree = "<group>"; };
+ 5D9F50771BE7DD4C00FEF399 /* testImageTIFF.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = testImageTIFF.tiff; sourceTree = "<group>"; };
+ 5D9F50801BE7E6E300FEF399 /* SDLPermissionsManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPermissionsManagerSpec.m; path = DevAPISpecs/SDLPermissionsManagerSpec.m; sourceTree = "<group>"; };
+ 5D9F50821BEA5C6100FEF399 /* SDLFileManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLFileManagerSpec.m; path = DevAPISpecs/SDLFileManagerSpec.m; sourceTree = "<group>"; };
+ 5D9F50851BED412E00FEF399 /* TestConnectionManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestConnectionManager.h; path = TestUtilities/TestConnectionManager.h; sourceTree = "<group>"; };
+ 5D9F50861BED412E00FEF399 /* TestConnectionManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestConnectionManager.m; path = TestUtilities/TestConnectionManager.m; sourceTree = "<group>"; };
5DA0268F1AD44EE700019F86 /* SDLDialNumberResponseSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLDialNumberResponseSpec.m; sourceTree = "<group>"; };
+ 5DA102A21D4122C700C15826 /* NSMutableDictionary+SafeRemove.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableDictionary+SafeRemove.h"; sourceTree = "<group>"; };
+ 5DA102A31D4122C700C15826 /* NSMutableDictionary+SafeRemove.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableDictionary+SafeRemove.m"; sourceTree = "<group>"; };
+ 5DA22CB31D075CF200245F5F /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = sdl_ios/Carthage/Build/iOS/Nimble.framework; sourceTree = "<group>"; };
+ 5DA22CB41D075CF200245F5F /* OCMock.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCMock.framework; path = sdl_ios/Carthage/Build/iOS/OCMock.framework; sourceTree = "<group>"; };
+ 5DA22CB51D075CF200245F5F /* OHHTTPStubs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OHHTTPStubs.framework; path = sdl_ios/Carthage/Build/iOS/OHHTTPStubs.framework; sourceTree = "<group>"; };
+ 5DA22CB61D075CF200245F5F /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = sdl_ios/Carthage/Build/iOS/Quick.framework; sourceTree = "<group>"; };
+ 5DA3F3521BC448060026F2D0 /* NSMapTable+Subscripting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMapTable+Subscripting.h"; sourceTree = "<group>"; };
+ 5DA3F3531BC448060026F2D0 /* NSMapTable+Subscripting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMapTable+Subscripting.m"; sourceTree = "<group>"; };
+ 5DA3F3581BC448480026F2D0 /* SDLError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLError.h; sourceTree = "<group>"; };
+ 5DA3F3591BC448480026F2D0 /* SDLError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLError.m; sourceTree = "<group>"; };
+ 5DA3F35D1BC448590026F2D0 /* SDLNotificationConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLNotificationConstants.h; sourceTree = "<group>"; };
+ 5DA3F35E1BC448590026F2D0 /* SDLNotificationConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLNotificationConstants.m; sourceTree = "<group>"; };
+ 5DA3F36E1BC4489A0026F2D0 /* SDLManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLManager.h; sourceTree = "<group>"; };
+ 5DA3F36F1BC4489A0026F2D0 /* SDLManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLManager.m; sourceTree = "<group>"; };
+ 5DAE06721BDEC6C000F9B498 /* SDLFileSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLFileSpec.m; path = DevAPISpecs/SDLFileSpec.m; sourceTree = "<group>"; };
+ 5DAE06741BDEC6D600F9B498 /* SDLArtworkSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLArtworkSpec.m; path = DevAPISpecs/SDLArtworkSpec.m; sourceTree = "<group>"; };
+ 5DB1BCD01D243A8E002FFC37 /* SDLDeleteFileOperationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDeleteFileOperationSpec.m; path = DevAPISpecs/SDLDeleteFileOperationSpec.m; sourceTree = "<group>"; };
+ 5DB1BCD11D243A8E002FFC37 /* SDLListFilesOperationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLListFilesOperationSpec.m; path = DevAPISpecs/SDLListFilesOperationSpec.m; sourceTree = "<group>"; };
+ 5DB1BCD21D243A8E002FFC37 /* SDLUploadFileOperationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLUploadFileOperationSpec.m; path = DevAPISpecs/SDLUploadFileOperationSpec.m; sourceTree = "<group>"; };
+ 5DB1BCD71D243AA6002FFC37 /* SDLPermissionFilterSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPermissionFilterSpec.m; path = DevAPISpecs/SDLPermissionFilterSpec.m; sourceTree = "<group>"; };
+ 5DB1BCD91D243D85002FFC37 /* SDLStateMachineSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLStateMachineSpec.m; path = DevAPISpecs/SDLStateMachineSpec.m; sourceTree = "<group>"; };
+ 5DB1BCDC1D243DC3002FFC37 /* SDLLifecycleConfigurationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleConfigurationSpec.m; path = DevAPISpecs/SDLLifecycleConfigurationSpec.m; sourceTree = "<group>"; };
+ 5DB1BCDE1D243DD3002FFC37 /* SDLLockScreenConfigurationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLockScreenConfigurationSpec.m; path = DevAPISpecs/SDLLockScreenConfigurationSpec.m; sourceTree = "<group>"; };
+ 5DB1BCE01D243DDE002FFC37 /* SDLConfigurationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLConfigurationSpec.m; path = DevAPISpecs/SDLConfigurationSpec.m; sourceTree = "<group>"; };
+ 5DB1BCE51D245647002FFC37 /* TestStateMachineTarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestStateMachineTarget.h; path = TestUtilities/TestStateMachineTarget.h; sourceTree = "<group>"; };
+ 5DB1BCE61D245647002FFC37 /* TestStateMachineTarget.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestStateMachineTarget.m; path = TestUtilities/TestStateMachineTarget.m; sourceTree = "<group>"; };
5DB92D231AC47B2C00C15BB0 /* SDLHexUtilitySpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLHexUtilitySpec.m; path = UtilitiesSpecs/SDLHexUtilitySpec.m; sourceTree = "<group>"; };
5DB92D251AC4836F00C15BB0 /* SDLJingleSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLJingleSpec.m; path = UtilitiesSpecs/SDLJingleSpec.m; sourceTree = "<group>"; };
5DB92D2C1AC4A34F00C15BB0 /* SDLPrioritizedObjectCollectionSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPrioritizedObjectCollectionSpec.m; path = "UtilitiesSpecs/Prioritized Objects/SDLPrioritizedObjectCollectionSpec.m"; sourceTree = "<group>"; };
5DB92D2E1AC59F0000C15BB0 /* SDLObjectWithPrioritySpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLObjectWithPrioritySpec.m; path = "UtilitiesSpecs/Prioritized Objects/SDLObjectWithPrioritySpec.m"; sourceTree = "<group>"; };
5DB92D301AC9C8BA00C15BB0 /* SDLRPCStruct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLRPCStruct.h; sourceTree = "<group>"; };
5DB92D311AC9C8BA00C15BB0 /* SDLRPCStruct.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLRPCStruct.m; sourceTree = "<group>"; };
+ 5DBAE0AA1D3588AC00CE00BF /* SDLNotificationDispatcherSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLNotificationDispatcherSpec.m; path = DevAPISpecs/SDLNotificationDispatcherSpec.m; sourceTree = "<group>"; };
+ 5DBAE0AC1D368D1A00CE00BF /* SDLResponseDispatcherSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLResponseDispatcherSpec.m; path = DevAPISpecs/SDLResponseDispatcherSpec.m; sourceTree = "<group>"; };
5DC978251B7A38640012C2F1 /* SDLGlobalsSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLGlobalsSpec.m; path = UtilitiesSpecs/SDLGlobalsSpec.m; sourceTree = "<group>"; };
5DCC199E1B8221F3004FFAD9 /* SDLURLSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLURLSession.h; sourceTree = "<group>"; };
5DCC199F1B8221F3004FFAD9 /* SDLURLSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLURLSession.m; sourceTree = "<group>"; };
@@ -1684,14 +1887,31 @@
5DE372A31ACB336600849FAA /* SDLHMICapabilitiesSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLHMICapabilitiesSpec.m; sourceTree = "<group>"; };
5DE372A51ACC35B400849FAA /* SDLDebugToolConsole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLDebugToolConsole.h; sourceTree = "<group>"; };
5DEE55BF1B8509CB004F0D0F /* SDLURLRequestTaskSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLURLRequestTaskSpec.m; path = "UtilitiesSpecs/HTTP Connection/SDLURLRequestTaskSpec.m"; sourceTree = "<group>"; };
- 5DEE55C11B864A7D004F0D0F /* OHHTTPStubs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OHHTTPStubs.framework; path = Carthage/Build/iOS/OHHTTPStubs.framework; sourceTree = "<group>"; };
- 5DEE55C41B864AB3004F0D0F /* OHHTTPStubs.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = OHHTTPStubs.framework.dSYM; path = Carthage/Build/iOS/OHHTTPStubs.framework.dSYM; sourceTree = "<group>"; };
5DF2BB9C1B94E38A00CE5994 /* SDLURLSessionSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLURLSessionSpec.m; path = "UtilitiesSpecs/HTTP Connection/SDLURLSessionSpec.m"; sourceTree = "<group>"; };
+ 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLConnectionManagerType.h; sourceTree = "<group>"; };
DA4353DE1D271FD10099B8C4 /* CGPointUtilSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CGPointUtilSpec.m; path = UtilitiesSpecs/Touches/CGPointUtilSpec.m; sourceTree = "<group>"; };
DA4353E21D2720A30099B8C4 /* SDLPinchGestureSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLPinchGestureSpec.m; path = UtilitiesSpecs/Touches/SDLPinchGestureSpec.m; sourceTree = "<group>"; };
DA4353E61D2721680099B8C4 /* DispatchTimerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DispatchTimerSpec.m; path = UtilitiesSpecs/Touches/DispatchTimerSpec.m; sourceTree = "<group>"; };
DA4353E71D2721680099B8C4 /* SDLTouchManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLTouchManagerSpec.m; path = UtilitiesSpecs/Touches/SDLTouchManagerSpec.m; sourceTree = "<group>"; };
DA4353E81D2721680099B8C4 /* SDLTouchSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLTouchSpec.m; path = UtilitiesSpecs/Touches/SDLTouchSpec.m; sourceTree = "<group>"; };
+ DA7515981D95FAA000F29323 /* lock_arrow_down_black.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lock_arrow_down_black.png; sourceTree = "<group>"; };
+ DA7515991D95FAA000F29323 /* lock_arrow_down_black@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lock_arrow_down_black@2x.png"; sourceTree = "<group>"; };
+ DA75159A1D95FAA000F29323 /* lock_arrow_down_black@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lock_arrow_down_black@3x.png"; sourceTree = "<group>"; };
+ DA75159C1D95FAA000F29323 /* lock_arrow_down_white.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lock_arrow_down_white.png; sourceTree = "<group>"; };
+ DA75159D1D95FAA000F29323 /* lock_arrow_down_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lock_arrow_down_white@2x.png"; sourceTree = "<group>"; };
+ DA75159E1D95FAA000F29323 /* lock_arrow_down_white@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lock_arrow_down_white@3x.png"; sourceTree = "<group>"; };
+ DA7515A11D95FAA000F29323 /* lock_arrow_up_black.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lock_arrow_up_black.png; sourceTree = "<group>"; };
+ DA7515A21D95FAA000F29323 /* lock_arrow_up_black@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lock_arrow_up_black@2x.png"; sourceTree = "<group>"; };
+ DA7515A31D95FAA000F29323 /* lock_arrow_up_black@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lock_arrow_up_black@3x.png"; sourceTree = "<group>"; };
+ DA7515A51D95FAA000F29323 /* lock_arrow_up_white.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lock_arrow_up_white.png; sourceTree = "<group>"; };
+ DA7515A61D95FAA000F29323 /* lock_arrow_up_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lock_arrow_up_white@2x.png"; sourceTree = "<group>"; };
+ DA7515A71D95FAA000F29323 /* lock_arrow_up_white@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "lock_arrow_up_white@3x.png"; sourceTree = "<group>"; };
+ DA7515AA1D95FAA000F29323 /* sdl_logo_black.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sdl_logo_black.png; sourceTree = "<group>"; };
+ DA7515AB1D95FAA000F29323 /* sdl_logo_black@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "sdl_logo_black@2x.png"; sourceTree = "<group>"; };
+ DA7515AC1D95FAA000F29323 /* sdl_logo_black@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "sdl_logo_black@3x.png"; sourceTree = "<group>"; };
+ DA7515AE1D95FAA000F29323 /* sdl_logo_white.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sdl_logo_white.png; sourceTree = "<group>"; };
+ DA7515AF1D95FAA000F29323 /* sdl_logo_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "sdl_logo_white@2x.png"; sourceTree = "<group>"; };
+ DA7515B01D95FAA000F29323 /* sdl_logo_white@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "sdl_logo_white@3x.png"; sourceTree = "<group>"; };
DA96C0651D4D4F730022F520 /* SDLAppInfoSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLAppInfoSpec.m; sourceTree = "<group>"; };
DAC572551D1067270004288B /* SDLTouchManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLTouchManager.h; sourceTree = "<group>"; };
DAC572561D1067270004288B /* SDLTouchManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLTouchManager.m; sourceTree = "<group>"; };
@@ -1740,10 +1960,11 @@
buildActionMask = 2147483647;
files = (
167ED93C1A9BCB8A00797BE5 /* SmartDeviceLink.framework in Frameworks */,
- 5DEE55C21B864A7D004F0D0F /* OHHTTPStubs.framework in Frameworks */,
- 162E81CB1A9BDD3F00906325 /* Quick.framework in Frameworks */,
- 5D86022E1C99AF5100A55266 /* OCMock.framework in Frameworks */,
- 162E81CA1A9BDD3F00906325 /* Nimble.framework in Frameworks */,
+ 5DA22CB91D075CF200245F5F /* OHHTTPStubs.framework in Frameworks */,
+ 5DA22CB81D075CF200245F5F /* OCMock.framework in Frameworks */,
+ 5DA22CBA1D075CF200245F5F /* Quick.framework in Frameworks */,
+ 5D5DBF081D48E39C00D4F914 /* FBSnapshotTestCase.framework in Frameworks */,
+ 5DA22CB71D075CF200245F5F /* Nimble.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -2042,16 +2263,14 @@
167ED9231A9BB86300797BE5 /* Libraries */ = {
isa = PBXGroup;
children = (
- 5D1464311C99AC0000727339 /* Nimble.framework.dSYM */,
- 5DEE55C41B864AB3004F0D0F /* OHHTTPStubs.framework.dSYM */,
- 5D1464331C99AC0900727339 /* OCMock.framework.dSYM */,
- 5D1464341C99AC0900727339 /* Quick.framework.dSYM */,
- 5D1464351C99AC0900727339 /* OCMock.framework */,
- 5DEE55C11B864A7D004F0D0F /* OHHTTPStubs.framework */,
- 162E81C81A9BDD3F00906325 /* Nimble.framework */,
- 162E81C91A9BDD3F00906325 /* Quick.framework */,
+ 5D5DBF071D48E39C00D4F914 /* FBSnapshotTestCase.framework */,
+ 5DA22CB31D075CF200245F5F /* Nimble.framework */,
+ 5DA22CB41D075CF200245F5F /* OCMock.framework */,
+ 5DA22CB51D075CF200245F5F /* OHHTTPStubs.framework */,
+ 5DA22CB61D075CF200245F5F /* Quick.framework */,
);
name = Libraries;
+ path = ../..;
sourceTree = "<group>";
};
1680B1041A9CD7AD00DBD79E /* ProtocolSpecs */ = {
@@ -2119,10 +2338,57 @@
name = Connection;
sourceTree = "<group>";
};
+ 5D1654541D3E753100554D93 /* Lifecycle */ = {
+ isa = PBXGroup;
+ children = (
+ 5D1654551D3E754F00554D93 /* SDLLifecycleManagerSpec.m */,
+ );
+ name = Lifecycle;
+ sourceTree = "<group>";
+ };
+ 5D1654571D3E79CA00554D93 /* Lifecycle */ = {
+ isa = PBXGroup;
+ children = (
+ 5D1654581D3E7A1600554D93 /* SDLLifecycleManager.h */,
+ 5D1654591D3E7A1600554D93 /* SDLLifecycleManager.m */,
+ );
+ name = Lifecycle;
+ sourceTree = "<group>";
+ };
+ 5D3E48771D6F3DA40000BFEF /* Superclass Operation */ = {
+ isa = PBXGroup;
+ children = (
+ 5D3E48731D6F3B330000BFEF /* SDLAsynchronousOperation.h */,
+ 5D3E48741D6F3B330000BFEF /* SDLAsynchronousOperation.m */,
+ );
+ name = "Superclass Operation";
+ sourceTree = "<group>";
+ };
+ 5D3E48781D6F86EC0000BFEF /* Notifications */ = {
+ isa = PBXGroup;
+ children = (
+ 5D4D67AA1D2ED37A00468B4A /* SDLNotificationDispatcher.h */,
+ 5D4D67AB1D2ED37A00468B4A /* SDLNotificationDispatcher.m */,
+ 5D3E48791D6F888E0000BFEF /* SDLRPCResponseNotification.h */,
+ 5D3E487A1D6F888E0000BFEF /* SDLRPCResponseNotification.m */,
+ 5D3E487D1D6F88A30000BFEF /* SDLRPCNotificationNotification.h */,
+ 5D3E487E1D6F88A30000BFEF /* SDLRPCNotificationNotification.m */,
+ );
+ name = Notifications;
+ sourceTree = "<group>";
+ };
+ 5D3E48821D74813B0000BFEF /* Responses */ = {
+ isa = PBXGroup;
+ children = (
+ 5D4D67AE1D2FE2F900468B4A /* SDLResponseDispatcher.h */,
+ 5D4D67AF1D2FE2F900468B4A /* SDLResponseDispatcher.m */,
+ );
+ name = Responses;
+ sourceTree = "<group>";
+ };
5D4019A61A76EC350006B0C2 = {
isa = PBXGroup;
children = (
- 167ED9231A9BB86300797BE5 /* Libraries */,
5D4019B11A76EC350006B0C2 /* Example */,
5D61FA1D1A84237100846EE7 /* SmartDeviceLink */,
5D61FA2C1A84237100846EE7 /* SmartDeviceLinkTests */,
@@ -2133,7 +2399,7 @@
5D4019B01A76EC350006B0C2 /* Products */ = {
isa = PBXGroup;
children = (
- 5D4019AF1A76EC350006B0C2 /* SmartDeviceLink-Example.app */,
+ 5D4019AF1A76EC350006B0C2 /* SDL Example.app */,
5D61FA1C1A84237100846EE7 /* SmartDeviceLink.framework */,
5D61FA261A84237100846EE7 /* SmartDeviceLinkTests.xctest */,
);
@@ -2210,8 +2476,8 @@
children = (
5D6CC8ED1C610E490027F60A /* Security */,
5D5934FE1A851B2500687FB9 /* @protocols */,
- 5D61FB031A84238A00846EE7 /* SDLLockScreenManager.h */,
- 5D61FB041A84238A00846EE7 /* SDLLockScreenManager.m */,
+ 5D61FB031A84238A00846EE7 /* SDLLockScreenStatusManager.h */,
+ 5D61FB041A84238A00846EE7 /* SDLLockScreenStatusManager.m */,
5D61FB441A84238B00846EE7 /* SDLPolicyDataParser.h */,
5D61FB451A84238B00846EE7 /* SDLPolicyDataParser.m */,
5D61FB631A84238B00846EE7 /* SDLProxy.h */,
@@ -2897,14 +3163,34 @@
5D59DD451B14FDD000BE744D /* ProxySpecs */ = {
isa = PBXGroup;
children = (
- 5D59DD461B14FDEE00BE744D /* SDLLockScreenManagerSpec.m */,
+ 5D59DD461B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m */,
);
name = ProxySpecs;
sourceTree = "<group>";
};
+ 5D6008871BE3ED470094A505 /* State Machine */ = {
+ isa = PBXGroup;
+ children = (
+ 5D6008881BE3ED540094A505 /* SDLStateMachine.h */,
+ 5D6008891BE3ED540094A505 /* SDLStateMachine.m */,
+ );
+ name = "State Machine";
+ sourceTree = "<group>";
+ };
+ 5D616B501D59042B00553F6B /* Errors */ = {
+ isa = PBXGroup;
+ children = (
+ 5DA3F3581BC448480026F2D0 /* SDLError.h */,
+ 5DA3F3591BC448480026F2D0 /* SDLError.m */,
+ 5D616B511D59044400553F6B /* SDLErrorConstants.h */,
+ );
+ name = Errors;
+ sourceTree = "<group>";
+ };
5D61FA1D1A84237100846EE7 /* SmartDeviceLink */ = {
isa = PBXGroup;
children = (
+ 5DA3F3511BC4477B0026F2D0 /* Developer API */,
5D5934F61A85189500687FB9 /* Utilities */,
5D5934F51A8516C800687FB9 /* Debug */,
5D5934F01A85161A00687FB9 /* Transport */,
@@ -2936,6 +3222,8 @@
5D61FA2C1A84237100846EE7 /* SmartDeviceLinkTests */ = {
isa = PBXGroup;
children = (
+ 167ED9231A9BB86300797BE5 /* Libraries */,
+ 5DAE06711BDEC68700F9B498 /* Developer API Tests */,
5D59DD451B14FDD000BE744D /* ProxySpecs */,
5DB92D201AC47AC400C15BB0 /* UtilitiesSpecs */,
1680B1041A9CD7AD00DBD79E /* ProtocolSpecs */,
@@ -2949,6 +3237,7 @@
5D61FA2D1A84237100846EE7 /* Supporting Files */ = {
isa = PBXGroup;
children = (
+ 5D9F50711BE7DD4C00FEF399 /* Assets */,
5D61FA2E1A84237100846EE7 /* Info.plist */,
);
name = "Supporting Files";
@@ -2962,6 +3251,284 @@
name = Security;
sourceTree = "<group>";
};
+ 5D6EB4C61BF274F400693731 /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 5DB1BCE41D245629002FFC37 /* State Machine */,
+ 5D6EB4C71BF28D6800693731 /* Categories */,
+ );
+ name = Utilities;
+ sourceTree = "<group>";
+ };
+ 5D6EB4C71BF28D6800693731 /* Categories */ = {
+ isa = PBXGroup;
+ children = (
+ 5D6EB4CB1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m */,
+ );
+ name = Categories;
+ sourceTree = "<group>";
+ };
+ 5D6F7A301BC5B7100070BF37 /* Lock Screen UI */ = {
+ isa = PBXGroup;
+ children = (
+ DA7515951D95FAA000F29323 /* iOS 7 Assets */,
+ 5D6F7A3D1BC811FC0070BF37 /* SDLAssets.xcassets */,
+ 5D616B481D552F7A00553F6B /* SDLLockScreen.storyboard */,
+ 5D6F7A331BC5B9B60070BF37 /* SDLLockScreenViewController.h */,
+ 5D6F7A341BC5B9B60070BF37 /* SDLLockScreenViewController.m */,
+ );
+ name = "Lock Screen UI";
+ sourceTree = "<group>";
+ };
+ 5D76E31A1D3805E600647CFA /* LockScreen */ = {
+ isa = PBXGroup;
+ children = (
+ 5D76E3261D3D0A4700647CFA /* Utilities */,
+ 5D76E31B1D3805FF00647CFA /* SDLLockScreenManagerSpec.m */,
+ );
+ name = LockScreen;
+ sourceTree = "<group>";
+ };
+ 5D76E31F1D39731100647CFA /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 5D76E3201D39742300647CFA /* SDLViewControllerPresentable.h */,
+ 5D76E3221D39767000647CFA /* SDLLockScreenPresenter.h */,
+ 5D76E3231D39767000647CFA /* SDLLockScreenPresenter.m */,
+ );
+ name = Utilities;
+ sourceTree = "<group>";
+ };
+ 5D76E3261D3D0A4700647CFA /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 5D76E3271D3D0A8800647CFA /* SDLFakeViewControllerPresenter.h */,
+ 5D76E3281D3D0A8800647CFA /* SDLFakeViewControllerPresenter.m */,
+ );
+ name = Utilities;
+ sourceTree = "<group>";
+ };
+ 5D7F87F51CE51CD8002DD7C4 /* File Types */ = {
+ isa = PBXGroup;
+ children = (
+ 5D82042B1BCEC32F00D0A41B /* SDLFile.h */,
+ 5D82042C1BCEC32F00D0A41B /* SDLFile.m */,
+ 5D82042F1BD001C700D0A41B /* SDLArtwork.h */,
+ 5D8204301BD001C700D0A41B /* SDLArtwork.m */,
+ );
+ name = "File Types";
+ sourceTree = "<group>";
+ };
+ 5D7F87F61CE51CE1002DD7C4 /* Transaction Operations */ = {
+ isa = PBXGroup;
+ children = (
+ 5D3E48771D6F3DA40000BFEF /* Superclass Operation */,
+ 5D1665C21CF8CA2700CC4CA1 /* SDLListFilesOperation.h */,
+ 5D1665C31CF8CA2700CC4CA1 /* SDLListFilesOperation.m */,
+ 5D79A0391CE36F030035797B /* SDLUploadFileOperation.h */,
+ 5D79A03A1CE36F030035797B /* SDLUploadFileOperation.m */,
+ 5D7F87E91CE3C1A1002DD7C4 /* SDLDeleteFileOperation.h */,
+ 5D7F87EA1CE3C1A1002DD7C4 /* SDLDeleteFileOperation.m */,
+ );
+ name = "Transaction Operations";
+ sourceTree = "<group>";
+ };
+ 5D7F87F71CE51CEE002DD7C4 /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 5D7F87ED1CE3C294002DD7C4 /* SDLFileManagerConstants.h */,
+ 5D7F87F11CE3C29E002DD7C4 /* SDLFileWrapper.h */,
+ 5D7F87F21CE3C29E002DD7C4 /* SDLFileWrapper.m */,
+ );
+ name = Utilities;
+ sourceTree = "<group>";
+ };
+ 5D8204171BCD80A200D0A41B /* Configurations */ = {
+ isa = PBXGroup;
+ children = (
+ 5D6F7A2C1BC5650B0070BF37 /* SDLLifecycleConfiguration.h */,
+ 5D6F7A2D1BC5650B0070BF37 /* SDLLifecycleConfiguration.m */,
+ 5D8204181BCD80BA00D0A41B /* SDLLockScreenConfiguration.h */,
+ 5D8204191BCD80BA00D0A41B /* SDLLockScreenConfiguration.m */,
+ 5D82041C1BCD8E6100D0A41B /* SDLConfiguration.h */,
+ 5D82041D1BCD8E6100D0A41B /* SDLConfiguration.m */,
+ );
+ name = Configurations;
+ sourceTree = "<group>";
+ };
+ 5D8204291BCEA91400D0A41B /* Permissions */ = {
+ isa = PBXGroup;
+ children = (
+ 5D1665CC1CF8CA8A00CC4CA1 /* SDLPermissionConstants.h */,
+ 5D1665C61CF8CA3D00CC4CA1 /* SDLPermissionFilter.h */,
+ 5D1665C71CF8CA3D00CC4CA1 /* SDLPermissionFilter.m */,
+ 5D8204241BCEA8A600D0A41B /* SDLPermissionManager.h */,
+ 5D8204251BCEA8A600D0A41B /* SDLPermissionManager.m */,
+ );
+ name = Permissions;
+ sourceTree = "<group>";
+ };
+ 5D82042A1BCEA91E00D0A41B /* Files */ = {
+ isa = PBXGroup;
+ children = (
+ 5D8204201BCEA89A00D0A41B /* SDLFileManager.h */,
+ 5D8204211BCEA89A00D0A41B /* SDLFileManager.m */,
+ 5D7F87F51CE51CD8002DD7C4 /* File Types */,
+ 5D7F87F61CE51CE1002DD7C4 /* Transaction Operations */,
+ 5D7F87F71CE51CEE002DD7C4 /* Utilities */,
+ );
+ name = Files;
+ sourceTree = "<group>";
+ };
+ 5D9F50711BE7DD4C00FEF399 /* Assets */ = {
+ isa = PBXGroup;
+ children = (
+ 5D850AAF1D4907C500E6E7EE /* TestLockScreenAppIcon.png */,
+ 5D9F50721BE7DD4C00FEF399 /* testFileJSON.json */,
+ 5D9F50731BE7DD4C00FEF399 /* testImageBMP.bmp */,
+ 5D9F50741BE7DD4C00FEF399 /* testImageJPEG.jpeg */,
+ 5D9F50751BE7DD4C00FEF399 /* testImageJPG.jpg */,
+ 5D9F50761BE7DD4C00FEF399 /* testImagePNG.png */,
+ 5D9F50771BE7DD4C00FEF399 /* testImageTIFF.tiff */,
+ );
+ path = Assets;
+ sourceTree = "<group>";
+ };
+ 5D9F507E1BE7E46600FEF399 /* Files */ = {
+ isa = PBXGroup;
+ children = (
+ 5DB1BCE21D2455FD002FFC37 /* Connection Manager */,
+ 5DB1BCD61D243A91002FFC37 /* Operations */,
+ 5DAE06721BDEC6C000F9B498 /* SDLFileSpec.m */,
+ 5DAE06741BDEC6D600F9B498 /* SDLArtworkSpec.m */,
+ 5D9F50821BEA5C6100FEF399 /* SDLFileManagerSpec.m */,
+ );
+ name = Files;
+ sourceTree = "<group>";
+ };
+ 5D9F507F1BE7E6C900FEF399 /* Permissions */ = {
+ isa = PBXGroup;
+ children = (
+ 5D9F50801BE7E6E300FEF399 /* SDLPermissionsManagerSpec.m */,
+ 5DB1BCD71D243AA6002FFC37 /* SDLPermissionFilterSpec.m */,
+ );
+ name = Permissions;
+ sourceTree = "<group>";
+ };
+ 5DA3F3511BC4477B0026F2D0 /* Developer API */ = {
+ isa = PBXGroup;
+ children = (
+ 5D6F7A301BC5B7100070BF37 /* Lock Screen UI */,
+ 5DA3F3611BC448690026F2D0 /* Handler Additions */,
+ 5DA3F3561BC4480E0026F2D0 /* Utilities */,
+ 5D8204171BCD80A200D0A41B /* Configurations */,
+ 5DBAE0A61D355EF200CE00BF /* Managers */,
+ 5DBAE0A71D355F0C00CE00BF /* Dispatchers */,
+ );
+ name = "Developer API";
+ sourceTree = "<group>";
+ };
+ 5DA3F3561BC4480E0026F2D0 /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */,
+ 5D616B501D59042B00553F6B /* Errors */,
+ 5DA3F35C1BC4484B0026F2D0 /* Notifications */,
+ 5DA3F3571BC448160026F2D0 /* Categories */,
+ 5D6008871BE3ED470094A505 /* State Machine */,
+ );
+ name = Utilities;
+ sourceTree = "<group>";
+ };
+ 5DA3F3571BC448160026F2D0 /* Categories */ = {
+ isa = PBXGroup;
+ children = (
+ 5D1665CA1CF8CA6700CC4CA1 /* NSNumber+NumberType.h */,
+ 5DA3F3521BC448060026F2D0 /* NSMapTable+Subscripting.h */,
+ 5DA3F3531BC448060026F2D0 /* NSMapTable+Subscripting.m */,
+ 5DA102A21D4122C700C15826 /* NSMutableDictionary+SafeRemove.h */,
+ 5DA102A31D4122C700C15826 /* NSMutableDictionary+SafeRemove.m */,
+ 5D3E48C91D7722FE0000BFEF /* NSBundle+SDLBundle.h */,
+ 5D3E48CA1D7722FE0000BFEF /* NSBundle+SDLBundle.m */,
+ );
+ name = Categories;
+ sourceTree = "<group>";
+ };
+ 5DA3F35C1BC4484B0026F2D0 /* Notifications */ = {
+ isa = PBXGroup;
+ children = (
+ 5DA3F35D1BC448590026F2D0 /* SDLNotificationConstants.h */,
+ 5DA3F35E1BC448590026F2D0 /* SDLNotificationConstants.m */,
+ );
+ name = Notifications;
+ sourceTree = "<group>";
+ };
+ 5DA3F3611BC448690026F2D0 /* Handler Additions */ = {
+ isa = PBXGroup;
+ children = (
+ 5D6F7A2A1BC45BF70070BF37 /* SDLRequestHandler.h */,
+ );
+ name = "Handler Additions";
+ sourceTree = "<group>";
+ };
+ 5DAE06711BDEC68700F9B498 /* Developer API Tests */ = {
+ isa = PBXGroup;
+ children = (
+ 5DBAE0A91D35888D00CE00BF /* Dispatchers */,
+ 5DBAE0A81D35886E00CE00BF /* Managers */,
+ 5DB1BCDB1D243DA8002FFC37 /* Configurations */,
+ 5D6EB4C61BF274F400693731 /* Utilities */,
+ );
+ name = "Developer API Tests";
+ sourceTree = "<group>";
+ };
+ 5DB1BCD61D243A91002FFC37 /* Operations */ = {
+ isa = PBXGroup;
+ children = (
+ 5DB1BCD01D243A8E002FFC37 /* SDLDeleteFileOperationSpec.m */,
+ 5DB1BCD11D243A8E002FFC37 /* SDLListFilesOperationSpec.m */,
+ 5DB1BCD21D243A8E002FFC37 /* SDLUploadFileOperationSpec.m */,
+ );
+ name = Operations;
+ sourceTree = "<group>";
+ };
+ 5DB1BCDB1D243DA8002FFC37 /* Configurations */ = {
+ isa = PBXGroup;
+ children = (
+ 5DB1BCDC1D243DC3002FFC37 /* SDLLifecycleConfigurationSpec.m */,
+ 5DB1BCDE1D243DD3002FFC37 /* SDLLockScreenConfigurationSpec.m */,
+ 5DB1BCE01D243DDE002FFC37 /* SDLConfigurationSpec.m */,
+ );
+ name = Configurations;
+ sourceTree = "<group>";
+ };
+ 5DB1BCE21D2455FD002FFC37 /* Connection Manager */ = {
+ isa = PBXGroup;
+ children = (
+ 5D9F50851BED412E00FEF399 /* TestConnectionManager.h */,
+ 5D9F50861BED412E00FEF399 /* TestConnectionManager.m */,
+ );
+ name = "Connection Manager";
+ sourceTree = "<group>";
+ };
+ 5DB1BCE31D245614002FFC37 /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ 5DB1BCE51D245647002FFC37 /* TestStateMachineTarget.h */,
+ 5DB1BCE61D245647002FFC37 /* TestStateMachineTarget.m */,
+ );
+ name = Utilities;
+ sourceTree = "<group>";
+ };
+ 5DB1BCE41D245629002FFC37 /* State Machine */ = {
+ isa = PBXGroup;
+ children = (
+ 5DB1BCE31D245614002FFC37 /* Utilities */,
+ 5DB1BCD91D243D85002FFC37 /* SDLStateMachineSpec.m */,
+ );
+ name = "State Machine";
+ sourceTree = "<group>";
+ };
5DB92D201AC47AC400C15BB0 /* UtilitiesSpecs */ = {
isa = PBXGroup;
children = (
@@ -2984,6 +3551,60 @@
name = "Prioritized Objects";
sourceTree = "<group>";
};
+ 5DBAE0A51D355EE700CE00BF /* Lock Screen */ = {
+ isa = PBXGroup;
+ children = (
+ 5D76E31F1D39731100647CFA /* Utilities */,
+ 5D4D67B21D30161600468B4A /* SDLLockScreenManager.h */,
+ 5D4D67B31D30161600468B4A /* SDLLockScreenManager.m */,
+ );
+ name = "Lock Screen";
+ sourceTree = "<group>";
+ };
+ 5DBAE0A61D355EF200CE00BF /* Managers */ = {
+ isa = PBXGroup;
+ children = (
+ 5DA3F36E1BC4489A0026F2D0 /* SDLManager.h */,
+ 5DA3F36F1BC4489A0026F2D0 /* SDLManager.m */,
+ 5D2F58071D0717D5001085CE /* SDLManagerDelegate.h */,
+ 5D1654571D3E79CA00554D93 /* Lifecycle */,
+ 5DBAE0A51D355EE700CE00BF /* Lock Screen */,
+ 5D82042A1BCEA91E00D0A41B /* Files */,
+ 5D8204291BCEA91400D0A41B /* Permissions */,
+ );
+ name = Managers;
+ sourceTree = "<group>";
+ };
+ 5DBAE0A71D355F0C00CE00BF /* Dispatchers */ = {
+ isa = PBXGroup;
+ children = (
+ 5D3E48781D6F86EC0000BFEF /* Notifications */,
+ 5D3E48821D74813B0000BFEF /* Responses */,
+ );
+ name = Dispatchers;
+ sourceTree = "<group>";
+ };
+ 5DBAE0A81D35886E00CE00BF /* Managers */ = {
+ isa = PBXGroup;
+ children = (
+ 5D1654541D3E753100554D93 /* Lifecycle */,
+ 5D76E31A1D3805E600647CFA /* LockScreen */,
+ 5D9F507F1BE7E6C900FEF399 /* Permissions */,
+ 5D9F507E1BE7E46600FEF399 /* Files */,
+ 5D5DBF0A1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m */,
+ );
+ name = Managers;
+ sourceTree = "<group>";
+ };
+ 5DBAE0A91D35888D00CE00BF /* Dispatchers */ = {
+ isa = PBXGroup;
+ children = (
+ 5DBAE0AA1D3588AC00CE00BF /* SDLNotificationDispatcherSpec.m */,
+ 5DBAE0AC1D368D1A00CE00BF /* SDLResponseDispatcherSpec.m */,
+ );
+ name = Dispatchers;
+ sourceTree = "<group>";
+ };
5DCC199D1B8221D2004FFAD9 /* HTTP Connection */ = {
isa = PBXGroup;
children = (
@@ -3024,6 +3645,103 @@
name = Touches;
sourceTree = "<group>";
};
+ DA7515951D95FAA000F29323 /* iOS 7 Assets */ = {
+ isa = PBXGroup;
+ children = (
+ DA7515961D95FAA000F29323 /* lock_arrow_down */,
+ DA75159F1D95FAA000F29323 /* lock_arrow_up */,
+ DA7515A81D95FAA000F29323 /* sdl_logo */,
+ );
+ path = "iOS 7 Assets";
+ sourceTree = "<group>";
+ };
+ DA7515961D95FAA000F29323 /* lock_arrow_down */ = {
+ isa = PBXGroup;
+ children = (
+ DA7515971D95FAA000F29323 /* black */,
+ DA75159B1D95FAA000F29323 /* white */,
+ );
+ path = lock_arrow_down;
+ sourceTree = "<group>";
+ };
+ DA7515971D95FAA000F29323 /* black */ = {
+ isa = PBXGroup;
+ children = (
+ DA7515981D95FAA000F29323 /* lock_arrow_down_black.png */,
+ DA7515991D95FAA000F29323 /* lock_arrow_down_black@2x.png */,
+ DA75159A1D95FAA000F29323 /* lock_arrow_down_black@3x.png */,
+ );
+ path = black;
+ sourceTree = "<group>";
+ };
+ DA75159B1D95FAA000F29323 /* white */ = {
+ isa = PBXGroup;
+ children = (
+ DA75159C1D95FAA000F29323 /* lock_arrow_down_white.png */,
+ DA75159D1D95FAA000F29323 /* lock_arrow_down_white@2x.png */,
+ DA75159E1D95FAA000F29323 /* lock_arrow_down_white@3x.png */,
+ );
+ path = white;
+ sourceTree = "<group>";
+ };
+ DA75159F1D95FAA000F29323 /* lock_arrow_up */ = {
+ isa = PBXGroup;
+ children = (
+ DA7515A01D95FAA000F29323 /* black */,
+ DA7515A41D95FAA000F29323 /* white */,
+ );
+ path = lock_arrow_up;
+ sourceTree = "<group>";
+ };
+ DA7515A01D95FAA000F29323 /* black */ = {
+ isa = PBXGroup;
+ children = (
+ DA7515A11D95FAA000F29323 /* lock_arrow_up_black.png */,
+ DA7515A21D95FAA000F29323 /* lock_arrow_up_black@2x.png */,
+ DA7515A31D95FAA000F29323 /* lock_arrow_up_black@3x.png */,
+ );
+ path = black;
+ sourceTree = "<group>";
+ };
+ DA7515A41D95FAA000F29323 /* white */ = {
+ isa = PBXGroup;
+ children = (
+ DA7515A51D95FAA000F29323 /* lock_arrow_up_white.png */,
+ DA7515A61D95FAA000F29323 /* lock_arrow_up_white@2x.png */,
+ DA7515A71D95FAA000F29323 /* lock_arrow_up_white@3x.png */,
+ );
+ path = white;
+ sourceTree = "<group>";
+ };
+ DA7515A81D95FAA000F29323 /* sdl_logo */ = {
+ isa = PBXGroup;
+ children = (
+ DA7515A91D95FAA000F29323 /* black */,
+ DA7515AD1D95FAA000F29323 /* white */,
+ );
+ path = sdl_logo;
+ sourceTree = "<group>";
+ };
+ DA7515A91D95FAA000F29323 /* black */ = {
+ isa = PBXGroup;
+ children = (
+ DA7515AA1D95FAA000F29323 /* sdl_logo_black.png */,
+ DA7515AB1D95FAA000F29323 /* sdl_logo_black@2x.png */,
+ DA7515AC1D95FAA000F29323 /* sdl_logo_black@3x.png */,
+ );
+ path = black;
+ sourceTree = "<group>";
+ };
+ DA7515AD1D95FAA000F29323 /* white */ = {
+ isa = PBXGroup;
+ children = (
+ DA7515AE1D95FAA000F29323 /* sdl_logo_white.png */,
+ DA7515AF1D95FAA000F29323 /* sdl_logo_white@2x.png */,
+ DA7515B01D95FAA000F29323 /* sdl_logo_white@3x.png */,
+ );
+ path = white;
+ sourceTree = "<group>";
+ };
DAC5724C1D0FE3B60004288B /* Touches */ = {
isa = PBXGroup;
children = (
@@ -3062,10 +3780,14 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
+ 5DA3F35A1BC448480026F2D0 /* SDLError.h in Headers */,
+ 5DA3F35F1BC448590026F2D0 /* SDLNotificationConstants.h in Headers */,
5DE5ABB71B0E38C90067BB02 /* SDLSystemRequest.h in Headers */,
+ 5DA3F3701BC4489A0026F2D0 /* SDLManager.h in Headers */,
E9C32B931AB20BA200F283AF /* SDLIAPSessionDelegate.h in Headers */,
5DE5ABB81B0E38C90067BB02 /* SDLSystemRequestResponse.h in Headers */,
5D61FCA51A84238C00846EE7 /* SDLEndAudioPassThruResponse.h in Headers */,
+ 5D3E48CB1D7722FE0000BFEF /* NSBundle+SDLBundle.h in Headers */,
5D61FD851A84238C00846EE7 /* SDLSetDisplayLayoutResponse.h in Headers */,
5D61FD751A84238C00846EE7 /* SDLRPCResponse.h in Headers */,
5D61FC901A84238C00846EE7 /* SDLDisplayCapabilities.h in Headers */,
@@ -3094,12 +3816,15 @@
5D61FDE71A84238C00846EE7 /* SDLUnsubscribeButton.h in Headers */,
5D61FC691A84238C00846EE7 /* SDLConsoleController.h in Headers */,
5D61FCAB1A84238C00846EE7 /* SDLFuelCutoffStatus.h in Headers */,
+ 5D1665C81CF8CA3D00CC4CA1 /* SDLPermissionFilter.h in Headers */,
E9C32B911AB20BA200F283AF /* SDLIAPSession.h in Headers */,
5D61FCD71A84238C00846EE7 /* SDLInteractionMode.h in Headers */,
5D61FC391A84238C00846EE7 /* SDLAlertManeuver.h in Headers */,
5D61FC861A84238C00846EE7 /* SDLDeviceStatus.h in Headers */,
5D61FCC71A84238C00846EE7 /* SDLIAPTransport.h in Headers */,
5D61FC6D1A84238C00846EE7 /* SDLCreateInteractionChoiceSetResponse.h in Headers */,
+ 5D8204221BCEA89A00D0A41B /* SDLFileManager.h in Headers */,
+ 5D4D67B41D30161600468B4A /* SDLLockScreenManager.h in Headers */,
5D61FE111A84238C00846EE7 /* SDLWarningLightStatus.h in Headers */,
5D61FC7A1A84238C00846EE7 /* SDLDeleteInteractionChoiceSet.h in Headers */,
5D61FC3B1A84238C00846EE7 /* SDLAlertManeuverResponse.h in Headers */,
@@ -3112,13 +3837,16 @@
5D61FDAF1A84238C00846EE7 /* SDLSubscribeButtonResponse.h in Headers */,
5D61FCB51A84238C00846EE7 /* SDLGetVehicleData.h in Headers */,
5D61FDEB1A84238C00846EE7 /* SDLUnsubscribeVehicleData.h in Headers */,
+ 5DA3F3541BC448060026F2D0 /* NSMapTable+Subscripting.h in Headers */,
5D61FC591A84238C00846EE7 /* SDLCarModeStatus.h in Headers */,
+ 5D1665C41CF8CA2700CC4CA1 /* SDLListFilesOperation.h in Headers */,
5D61FC2B1A84238C00846EE7 /* SDLAbstractTransport.h in Headers */,
5D61FD791A84238C00846EE7 /* SDLScreenParams.h in Headers */,
5D61FDCF1A84238C00846EE7 /* SDLTireStatus.h in Headers */,
5D61FDFD1A84238C00846EE7 /* SDLVehicleDataActiveStatus.h in Headers */,
5D61FD811A84238C00846EE7 /* SDLSetAppIconResponse.h in Headers */,
5D61FC551A84238C00846EE7 /* SDLButtonName.h in Headers */,
+ 5D616B531D59044400553F6B /* SDLErrorConstants.h in Headers */,
5D61FD9F1A84238C00846EE7 /* SDLSoftButton.h in Headers */,
5D61FD551A84238C00846EE7 /* SDLPutFile.h in Headers */,
5DE372A61ACC35B400849FAA /* SDLDebugToolConsole.h in Headers */,
@@ -3134,6 +3862,7 @@
5D61FCB71A84238C00846EE7 /* SDLGetVehicleDataResponse.h in Headers */,
5D61FDA91A84238C00846EE7 /* SDLSpeechCapabilities.h in Headers */,
5D61FCE01A84238C00846EE7 /* SDLKeyboardEvent.h in Headers */,
+ 5D3E48751D6F3B330000BFEF /* SDLAsynchronousOperation.h in Headers */,
5D61FCEA1A84238C00846EE7 /* SDLLayoutMode.h in Headers */,
5D61FD7F1A84238C00846EE7 /* SDLSetAppIcon.h in Headers */,
5D61FDD11A84238C00846EE7 /* SDLTouchCoord.h in Headers */,
@@ -3171,9 +3900,11 @@
5D61FD351A84238C00846EE7 /* SDLPowerModeStatus.h in Headers */,
5D61FD971A84238C00846EE7 /* SDLSingleTireStatus.h in Headers */,
5D61FCE21A84238C00846EE7 /* SDLKeyboardLayout.h in Headers */,
+ 5D76E3241D39767000647CFA /* SDLLockScreenPresenter.h in Headers */,
5D61FD891A84238C00846EE7 /* SDLSetGlobalPropertiesResponse.h in Headers */,
5D61FD8D1A84238C00846EE7 /* SDLSetMediaClockTimerResponse.h in Headers */,
5D61FD3B1A84238C00846EE7 /* SDLPresetBankCapabilities.h in Headers */,
+ 5D8204311BD001C700D0A41B /* SDLArtwork.h in Headers */,
5D53C46D1B7A99B9003526EA /* SDLStreamingMediaManager.h in Headers */,
5D61FD0F1A84238C00846EE7 /* SDLOnHMIStatus.h in Headers */,
5D61FD5F1A84238C00846EE7 /* SDLRegisterAppInterfaceResponse.h in Headers */,
@@ -3200,14 +3931,18 @@
5D61FD7B1A84238C00846EE7 /* SDLScrollableMessage.h in Headers */,
5D61FD3D1A84238C00846EE7 /* SDLPrimaryAudioSource.h in Headers */,
DAC5725C1D10B81E0004288B /* SDLTouch.h in Headers */,
+ 5D6F7A2E1BC5650B0070BF37 /* SDLLifecycleConfiguration.h in Headers */,
5D61FCCD1A84238C00846EE7 /* SDLImage.h in Headers */,
5D61FD481A84238C00846EE7 /* SDLProtocolMessage.h in Headers */,
+ 5D1665CD1CF8CA8A00CC4CA1 /* SDLPermissionConstants.h in Headers */,
5D61FC8C1A84238C00846EE7 /* SDLDIDResult.h in Headers */,
5D61FD1F1A84238C00846EE7 /* SDLOnTouchEvent.h in Headers */,
5D61FCB31A84238C00846EE7 /* SDLGetDTCsResponse.h in Headers */,
5D61FC4D1A84238C00846EE7 /* SDLBitsPerSample.h in Headers */,
5D61FD9B1A84238C00846EE7 /* SDLSlider.h in Headers */,
5D61FD111A84238C00846EE7 /* SDLOnKeyboardInput.h in Headers */,
+ 5D76E3211D39742300647CFA /* SDLViewControllerPresentable.h in Headers */,
+ 5DFFB9151BD7C89700DB3F04 /* SDLConnectionManagerType.h in Headers */,
5D61FC941A84238C00846EE7 /* SDLDriverDistractionState.h in Headers */,
5D61FD571A84238C00846EE7 /* SDLPutFileResponse.h in Headers */,
5D61FD411A84238C00846EE7 /* SDLPRNDL.h in Headers */,
@@ -3216,13 +3951,18 @@
5D61FD651A84238C00846EE7 /* SDLResetGlobalPropertiesResponse.h in Headers */,
5D61FD611A84238C00846EE7 /* SDLRequestType.h in Headers */,
5D61FCEC1A84238C00846EE7 /* SDLListFiles.h in Headers */,
+ 5D2F58081D0717D5001085CE /* SDLManagerDelegate.h in Headers */,
5D61FC881A84238C00846EE7 /* SDLDiagnosticMessage.h in Headers */,
5D61FDB31A84238C00846EE7 /* SDLSubscribeVehicleDataResponse.h in Headers */,
5D61FD991A84238C00846EE7 /* SDLSiphonServer.h in Headers */,
5D61FC961A84238C00846EE7 /* SDLECallConfirmationStatus.h in Headers */,
+ 5D4D67AC1D2ED37A00468B4A /* SDLNotificationDispatcher.h in Headers */,
5D61FDA51A84238C00846EE7 /* SDLSpeak.h in Headers */,
+ 5D82042D1BCEC32F00D0A41B /* SDLFile.h in Headers */,
5D61FD1B1A84238C00846EE7 /* SDLOnSystemRequest.h in Headers */,
5D61FD2F1A84238C00846EE7 /* SDLPermissionStatus.h in Headers */,
+ 5D3E487F1D6F88A30000BFEF /* SDLRPCNotificationNotification.h in Headers */,
+ 5D4D67B01D2FE2F900468B4A /* SDLResponseDispatcher.h in Headers */,
5D61FCF21A84238C00846EE7 /* SDLLockScreenStatus.h in Headers */,
5D61FCD31A84238C00846EE7 /* SDLImageResolution.h in Headers */,
5D61FD541A84238C00846EE7 /* SDLProxyListener.h in Headers */,
@@ -3232,8 +3972,10 @@
E9C32B961AB20BA200F283AF /* SDLTimer.h in Headers */,
5D61FC3D1A84238C00846EE7 /* SDLAlertResponse.h in Headers */,
5D61FDAD1A84238C00846EE7 /* SDLSubscribeButton.h in Headers */,
+ 5D8204261BCEA8A600D0A41B /* SDLPermissionManager.h in Headers */,
5D61FCF41A84238C00846EE7 /* SDLMaintenanceModeStatus.h in Headers */,
5D61FC571A84238C00846EE7 /* SDLButtonPressMode.h in Headers */,
+ 5D3E487B1D6F888E0000BFEF /* SDLRPCResponseNotification.h in Headers */,
5D61FC471A84238C00846EE7 /* SDLAudioStreamingState.h in Headers */,
5D61FE071A84238C00846EE7 /* SDLVehicleDataStatus.h in Headers */,
5D61FD2D1A84238C00846EE7 /* SDLPermissionItem.h in Headers */,
@@ -3242,11 +3984,14 @@
5D61FD391A84238C00846EE7 /* SDLPrerecordedSpeech.h in Headers */,
5D61FC671A84238C00846EE7 /* SDLComponentVolumeStatus.h in Headers */,
5D61FE0F1A84238C00846EE7 /* SDLVRHelpItem.h in Headers */,
+ 5D60088A1BE3ED540094A505 /* SDLStateMachine.h in Headers */,
5D61FC721A84238C00846EE7 /* SDLDeleteCommand.h in Headers */,
5D61FC821A84238C00846EE7 /* SDLDeviceInfo.h in Headers */,
5D61FCA91A84238C00846EE7 /* SDLFileType.h in Headers */,
5D61FD591A84238C00846EE7 /* SDLReadDID.h in Headers */,
+ 5D82041A1BCD80BA00D0A41B /* SDLLockScreenConfiguration.h in Headers */,
5D61FC611A84238C00846EE7 /* SDLChoice.h in Headers */,
+ 5D7F87F31CE3C29E002DD7C4 /* SDLFileWrapper.h in Headers */,
5D61FC7C1A84238C00846EE7 /* SDLDeleteInteractionChoiceSetResponse.h in Headers */,
5D61FDB91A84238C00846EE7 /* SDLSyncPDataResponse.h in Headers */,
DAC572631D10C5020004288B /* SDLPinchGesture.h in Headers */,
@@ -3260,17 +4005,21 @@
5D61FD331A84238C00846EE7 /* SDLPowerModeQualificationStatus.h in Headers */,
5D61FE011A84238C00846EE7 /* SDLVehicleDataNotificationStatus.h in Headers */,
5D61FDC91A84238C00846EE7 /* SDLTextField.h in Headers */,
+ 5D6F7A351BC5B9B60070BF37 /* SDLLockScreenViewController.h in Headers */,
5D61FCE41A84238C00846EE7 /* SDLKeyboardProperties.h in Headers */,
5D61FDED1A84238C00846EE7 /* SDLUnsubscribeVehicleDataResponse.h in Headers */,
5DCC19A41B822804004FFAD9 /* SDLURLRequestTask.h in Headers */,
5D61FCCF1A84238C00846EE7 /* SDLImageField.h in Headers */,
5D535DC51B72473800CF7760 /* SDLGlobals.h in Headers */,
+ 5D79A03B1CE36F030035797B /* SDLUploadFileOperation.h in Headers */,
5D61FD231A84238C00846EE7 /* SDLParameterPermissions.h in Headers */,
5D61FCB91A84238C00846EE7 /* SDLGlobalProperty.h in Headers */,
5D61FE051A84238C00846EE7 /* SDLVehicleDataResultCode.h in Headers */,
5D61FD2B1A84238C00846EE7 /* SDLPerformInteractionResponse.h in Headers */,
5D61FDA11A84238C00846EE7 /* SDLSoftButtonCapabilities.h in Headers */,
+ 5D6F7A2B1BC45BF70070BF37 /* SDLRequestHandler.h in Headers */,
5D61FDB51A84238C00846EE7 /* SDLSyncMsgVersion.h in Headers */,
+ 5DA102A41D4122C700C15826 /* NSMutableDictionary+SafeRemove.h in Headers */,
5D61FE031A84238C00846EE7 /* SDLVehicleDataResult.h in Headers */,
5D61FD911A84238C00846EE7 /* SDLShowConstantTBT.h in Headers */,
5D61FC331A84238C00846EE7 /* SDLAddSubMenuResponse.h in Headers */,
@@ -3286,6 +4035,7 @@
5D61FE0B1A84238C00846EE7 /* SDLVehicleType.h in Headers */,
5D61FCC31A84238C00846EE7 /* SDLHMIPermissions.h in Headers */,
5D61FE131A84238C00846EE7 /* SDLWiperStatus.h in Headers */,
+ 5D16545A1D3E7A1600554D93 /* SDLLifecycleManager.h in Headers */,
5D61FCBD1A84238C00846EE7 /* SDLHeadLampStatus.h in Headers */,
5D61FDC31A84238C00846EE7 /* SDLTBTState.h in Headers */,
5D61FD951A84238C00846EE7 /* SDLShowResponse.h in Headers */,
@@ -3306,6 +4056,7 @@
5D61FD251A84238C00846EE7 /* SDLPerformAudioPassThru.h in Headers */,
332A91501CED9CF10043824C /* SDLAppInfo.h in Headers */,
5D61FDA71A84238C00846EE7 /* SDLSpeakResponse.h in Headers */,
+ 5D1665CB1CF8CA6700CC4CA1 /* NSNumber+NumberType.h in Headers */,
5D61FD771A84238C00846EE7 /* SDLSamplingRate.h in Headers */,
5D61FCBB1A84238C00846EE7 /* SDLGPSData.h in Headers */,
5D61FDA31A84238C00846EE7 /* SDLSoftButtonType.h in Headers */,
@@ -3316,15 +4067,18 @@
5D61FD691A84238C00846EE7 /* SDLRPCMessage.h in Headers */,
5D61FCA71A84238C00846EE7 /* SDLEnum.h in Headers */,
5D8B174F1AC9D266006A6E1C /* SDLDialNumber.h in Headers */,
+ 5D7F87EF1CE3C294002DD7C4 /* SDLFileManagerConstants.h in Headers */,
5D61FCAD1A84238C00846EE7 /* SDLFunctionID.h in Headers */,
5D61FDF51A84238C00846EE7 /* SDLV1ProtocolHeader.h in Headers */,
DAC572671D10C5640004288B /* CGPoint_Util.h in Headers */,
5D61FDF91A84238C00846EE7 /* SDLV2ProtocolHeader.h in Headers */,
+ 5D82041E1BCD8E6100D0A41B /* SDLConfiguration.h in Headers */,
5D61FD4A1A84238C00846EE7 /* SDLProtocolMessageAssembler.h in Headers */,
5D61FD4C1A84238C00846EE7 /* SDLProtocolMessageDisassembler.h in Headers */,
5D61FD4E1A84238C00846EE7 /* SDLProtocolReceivedMessageRouter.h in Headers */,
5D61FDF71A84238C00846EE7 /* SDLV1ProtocolMessage.h in Headers */,
5D61FDFB1A84238C00846EE7 /* SDLV2ProtocolMessage.h in Headers */,
+ 5D7F87EB1CE3C1A1002DD7C4 /* SDLDeleteFileOperation.h in Headers */,
5D61FCFC1A84238C00846EE7 /* SDLNames.h in Headers */,
5D61FCFD1A84238C00846EE7 /* SDLObjectWithPriority.h in Headers */,
DAC5726C1D11B4840004288B /* SDLTouchManagerDelegate.h in Headers */,
@@ -3335,7 +4089,7 @@
5D61FCDC1A84238C00846EE7 /* SDLJsonDecoder.h in Headers */,
5D61FC711A84238C00846EE7 /* SDLDecoder.h in Headers */,
5D61FD6F1A84238C00846EE7 /* SDLRPCPayload.h in Headers */,
- 5D61FCF01A84238C00846EE7 /* SDLLockScreenManager.h in Headers */,
+ 5D61FCF01A84238C00846EE7 /* SDLLockScreenStatusManager.h in Headers */,
5D61FD311A84238C00846EE7 /* SDLPolicyDataParser.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -3359,7 +4113,7 @@
);
name = "SmartDeviceLink-Example";
productName = "SmartDeviceLink-iOS";
- productReference = 5D4019AF1A76EC350006B0C2 /* SmartDeviceLink-Example.app */;
+ productReference = 5D4019AF1A76EC350006B0C2 /* SDL Example.app */;
productType = "com.apple.product-type.application";
};
5D61FA1B1A84237100846EE7 /* SmartDeviceLink */ = {
@@ -3387,8 +4141,7 @@
5D61FA221A84237100846EE7 /* Sources */,
5D61FA231A84237100846EE7 /* Frameworks */,
5D61FA241A84237100846EE7 /* Resources */,
- 162E81CE1A9BDDBB00906325 /* CopyFiles */,
- 5DEE55C31B864A98004F0D0F /* CopyFiles */,
+ 5DA22C861D0745B000245F5F /* CopyFiles */,
);
buildRules = (
);
@@ -3407,7 +4160,7 @@
5D4019A71A76EC350006B0C2 /* Project object */ = {
isa = PBXProject;
attributes = {
- LastSwiftUpdateCheck = 0700;
+ LastSwiftUpdateCheck = 0710;
LastUpgradeCheck = 0800;
ORGANIZATIONNAME = smartdevicelink;
TargetAttributes = {
@@ -3467,6 +4220,26 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ DA7515B51D95FAA000F29323 /* lock_arrow_down_white@2x.png in Resources */,
+ DA7515BE1D95FAA000F29323 /* sdl_logo_black@2x.png in Resources */,
+ DA7515B91D95FAA000F29323 /* lock_arrow_up_black@3x.png in Resources */,
+ DA7515B71D95FAA000F29323 /* lock_arrow_up_black.png in Resources */,
+ DA7515BC1D95FAA000F29323 /* lock_arrow_up_white@3x.png in Resources */,
+ DA7515B81D95FAA000F29323 /* lock_arrow_up_black@2x.png in Resources */,
+ DA7515C21D95FAA000F29323 /* sdl_logo_white@3x.png in Resources */,
+ DA7515C01D95FAA000F29323 /* sdl_logo_white.png in Resources */,
+ DA7515C11D95FAA000F29323 /* sdl_logo_white@2x.png in Resources */,
+ DA7515BD1D95FAA000F29323 /* sdl_logo_black.png in Resources */,
+ DA7515B11D95FAA000F29323 /* lock_arrow_down_black.png in Resources */,
+ DA7515BA1D95FAA000F29323 /* lock_arrow_up_white.png in Resources */,
+ 5D6F7A3E1BC811FC0070BF37 /* SDLAssets.xcassets in Resources */,
+ 5D616B451D552F7A00553F6B /* SDLLockScreen.storyboard in Resources */,
+ DA7515BB1D95FAA000F29323 /* lock_arrow_up_white@2x.png in Resources */,
+ DA7515B61D95FAA000F29323 /* lock_arrow_down_white@3x.png in Resources */,
+ DA7515B21D95FAA000F29323 /* lock_arrow_down_black@2x.png in Resources */,
+ DA7515B41D95FAA000F29323 /* lock_arrow_down_white.png in Resources */,
+ DA7515B31D95FAA000F29323 /* lock_arrow_down_black@3x.png in Resources */,
+ DA7515BF1D95FAA000F29323 /* sdl_logo_black@3x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -3474,6 +4247,15 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 5D9F50781BE7DD4C00FEF399 /* testFileJSON.json in Resources */,
+ 5D9F50791BE7DD4C00FEF399 /* testImageBMP.bmp in Resources */,
+ 5D9F507A1BE7DD4C00FEF399 /* testImageJPEG.jpeg in Resources */,
+ 5D850AB01D4907C500E6E7EE /* TestLockScreenAppIcon.png in Resources */,
+ 5D9F507D1BE7DD4C00FEF399 /* testImageTIFF.tiff in Resources */,
+ 5D76E32B1D3D52CA00647CFA /* SDLAssets.xcassets in Resources */,
+ 5D9F507B1BE7DD4C00FEF399 /* testImageJPG.jpg in Resources */,
+ 5D9F507C1BE7DD4C00FEF399 /* testImagePNG.png in Resources */,
+ 5D616B461D552F7A00553F6B /* SDLLockScreen.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -3516,6 +4298,7 @@
5D61FCE71A84238C00846EE7 /* SDLKeypressMode.m in Sources */,
5D61FD9A1A84238C00846EE7 /* SDLSiphonServer.m in Sources */,
5D61FCDF1A84238C00846EE7 /* SDLJsonEncoder.m in Sources */,
+ 5D7F87F41CE3C29E002DD7C4 /* SDLFileWrapper.m in Sources */,
5D61FD941A84238C00846EE7 /* SDLShowConstantTBTResponse.m in Sources */,
5D61FE0A1A84238C00846EE7 /* SDLVehicleDataType.m in Sources */,
5D61FD1A1A84238C00846EE7 /* SDLOnSyncPData.m in Sources */,
@@ -3554,6 +4337,8 @@
5D61FD821A84238C00846EE7 /* SDLSetAppIconResponse.m in Sources */,
5D61FDF81A84238C00846EE7 /* SDLV1ProtocolMessage.m in Sources */,
5D61FDC81A84238C00846EE7 /* SDLTextAlignment.m in Sources */,
+ 5D82042E1BCEC32F00D0A41B /* SDLFile.m in Sources */,
+ 5DA3F3601BC448590026F2D0 /* SDLNotificationConstants.m in Sources */,
5D61FD5A1A84238C00846EE7 /* SDLReadDID.m in Sources */,
5D61FC8F1A84238C00846EE7 /* SDLDimension.m in Sources */,
5D61FC9B1A84238C00846EE7 /* SDLEmergencyEvent.m in Sources */,
@@ -3570,11 +4355,14 @@
5D61FD2E1A84238C00846EE7 /* SDLPermissionItem.m in Sources */,
5D61FD041A84238C00846EE7 /* SDLOnButtonEvent.m in Sources */,
5D61FD201A84238C00846EE7 /* SDLOnTouchEvent.m in Sources */,
+ 5DA3F35B1BC448480026F2D0 /* SDLError.m in Sources */,
5D61FD781A84238C00846EE7 /* SDLSamplingRate.m in Sources */,
5D61FC681A84238C00846EE7 /* SDLComponentVolumeStatus.m in Sources */,
5D61FDB61A84238C00846EE7 /* SDLSyncMsgVersion.m in Sources */,
5D61FC501A84238C00846EE7 /* SDLBodyInformation.m in Sources */,
+ 5D79A03C1CE36F030035797B /* SDLUploadFileOperation.m in Sources */,
5D61FD901A84238C00846EE7 /* SDLShow.m in Sources */,
+ 5D8204271BCEA8A600D0A41B /* SDLPermissionManager.m in Sources */,
5D61FDB21A84238C00846EE7 /* SDLSubscribeVehicleData.m in Sources */,
5D61FC991A84238C00846EE7 /* SDLECallInfo.m in Sources */,
5D61FD601A84238C00846EE7 /* SDLRegisterAppInterfaceResponse.m in Sources */,
@@ -3586,11 +4374,14 @@
E9C32B871AB20B4300F283AF /* NSThread+ThreadIndex.m in Sources */,
5D61FDE21A84238C00846EE7 /* SDLTurn.m in Sources */,
5D61FC5A1A84238C00846EE7 /* SDLCarModeStatus.m in Sources */,
+ 5D82041B1BCD80BA00D0A41B /* SDLLockScreenConfiguration.m in Sources */,
+ 5D3E48CC1D7722FE0000BFEF /* NSBundle+SDLBundle.m in Sources */,
5D61FCBC1A84238C00846EE7 /* SDLGPSData.m in Sources */,
5D61FD341A84238C00846EE7 /* SDLPowerModeQualificationStatus.m in Sources */,
5D61FC891A84238C00846EE7 /* SDLDiagnosticMessage.m in Sources */,
5D61FD6E1A84238C00846EE7 /* SDLRPCNotification.m in Sources */,
5D8B17501AC9D266006A6E1C /* SDLDialNumber.m in Sources */,
+ 5D6F7A361BC5B9B60070BF37 /* SDLLockScreenViewController.m in Sources */,
5D61FDE81A84238C00846EE7 /* SDLUnsubscribeButton.m in Sources */,
5D61FCF71A84238C00846EE7 /* SDLMediaClockFormat.m in Sources */,
5D61FD8A1A84238C00846EE7 /* SDLSetGlobalPropertiesResponse.m in Sources */,
@@ -3598,10 +4389,12 @@
5D61FDA41A84238C00846EE7 /* SDLSoftButtonType.m in Sources */,
5D61FC521A84238C00846EE7 /* SDLButtonCapabilities.m in Sources */,
5D61FC791A84238C00846EE7 /* SDLDeleteFileResponse.m in Sources */,
+ 5D3E48801D6F88A30000BFEF /* SDLRPCNotificationNotification.m in Sources */,
DAC572581D1067270004288B /* SDLTouchManager.m in Sources */,
5D61FC641A84238C00846EE7 /* SDLClusterModeStatus.m in Sources */,
5D61FCF91A84238C00846EE7 /* SDLMenuParams.m in Sources */,
5D61FD7C1A84238C00846EE7 /* SDLScrollableMessage.m in Sources */,
+ 5D4D67B11D2FE2F900468B4A /* SDLResponseDispatcher.m in Sources */,
5D61FD801A84238C00846EE7 /* SDLSetAppIcon.m in Sources */,
5D61FD3C1A84238C00846EE7 /* SDLPresetBankCapabilities.m in Sources */,
5D61FDB81A84238C00846EE7 /* SDLSyncPData.m in Sources */,
@@ -3642,6 +4435,7 @@
5D61FCCC1A84238C00846EE7 /* SDLIgnitionStatus.m in Sources */,
5D61FC3A1A84238C00846EE7 /* SDLAlertManeuver.m in Sources */,
5D61FC5E1A84238C00846EE7 /* SDLChangeRegistrationResponse.m in Sources */,
+ 5D8204231BCEA89A00D0A41B /* SDLFileManager.m in Sources */,
5D61FC7D1A84238C00846EE7 /* SDLDeleteInteractionChoiceSetResponse.m in Sources */,
DAC572661D10C5640004288B /* CGPoint_Util.m in Sources */,
E9C32B9D1AB20C5900F283AF /* EAAccessory+SDLProtocols.m in Sources */,
@@ -3651,6 +4445,7 @@
5D61FC581A84238C00846EE7 /* SDLButtonPressMode.m in Sources */,
5D61FDB01A84238C00846EE7 /* SDLSubscribeButtonResponse.m in Sources */,
5DCF76F61ACDBAD300BB647B /* SDLSendLocation.m in Sources */,
+ 5D76E3251D39767000647CFA /* SDLLockScreenPresenter.m in Sources */,
5D61FC771A84238C00846EE7 /* SDLDeleteFile.m in Sources */,
5D61FC811A84238C00846EE7 /* SDLDeleteSubMenuResponse.m in Sources */,
5D61FC7B1A84238C00846EE7 /* SDLDeleteInteractionChoiceSet.m in Sources */,
@@ -3674,6 +4469,7 @@
5D61FCE91A84238C00846EE7 /* SDLLanguage.m in Sources */,
5D61FC3E1A84238C00846EE7 /* SDLAlertResponse.m in Sources */,
5D61FD8C1A84238C00846EE7 /* SDLSetMediaClockTimer.m in Sources */,
+ 5D2996EA1BFCC0E3006106BF /* (null) in Sources */,
5D61FE121A84238C00846EE7 /* SDLWarningLightStatus.m in Sources */,
5D61FCDD1A84238C00846EE7 /* SDLJsonDecoder.m in Sources */,
5D61FCB81A84238C00846EE7 /* SDLGetVehicleDataResponse.m in Sources */,
@@ -3685,8 +4481,10 @@
5D61FDDE1A84238C00846EE7 /* SDLTTSChunk.m in Sources */,
5D61FD9E1A84238C00846EE7 /* SDLSliderResponse.m in Sources */,
5D61FC5C1A84238C00846EE7 /* SDLChangeRegistration.m in Sources */,
+ 5D1665C91CF8CA3D00CC4CA1 /* SDLPermissionFilter.m in Sources */,
5D61FDBA1A84238C00846EE7 /* SDLSyncPDataResponse.m in Sources */,
5D61FDDC1A84238C00846EE7 /* SDLTriggerSource.m in Sources */,
+ 5D16545B1D3E7A1600554D93 /* SDLLifecycleManager.m in Sources */,
E9C32B971AB20BA200F283AF /* SDLTimer.m in Sources */,
5D61FCB61A84238C00846EE7 /* SDLGetVehicleData.m in Sources */,
5D61FC9F1A84238C00846EE7 /* SDLEncodedSyncPData.m in Sources */,
@@ -3694,11 +4492,13 @@
5D61FCA41A84238C00846EE7 /* SDLEndAudioPassThru.m in Sources */,
5D8B17541AC9E11B006A6E1C /* SDLDialNumberResponse.m in Sources */,
5D61FC851A84238C00846EE7 /* SDLDeviceLevelStatus.m in Sources */,
+ 5D1665AB1CF5F7D000CC4CA1 /* (null) in Sources */,
5D61FD1E1A84238C00846EE7 /* SDLOnTBTClientState.m in Sources */,
5D61FD581A84238C00846EE7 /* SDLPutFileResponse.m in Sources */,
5D61FCB21A84238C00846EE7 /* SDLGetDTCs.m in Sources */,
5D61FD441A84238C00846EE7 /* SDLProtocol.m in Sources */,
5D61FC341A84238C00846EE7 /* SDLAddSubMenuResponse.m in Sources */,
+ 5D6F7A2F1BC5650B0070BF37 /* SDLLifecycleConfiguration.m in Sources */,
5D61FD141A84238C00846EE7 /* SDLOnLanguageChange.m in Sources */,
5D61FE041A84238C00846EE7 /* SDLVehicleDataResult.m in Sources */,
5D61FD5C1A84238C00846EE7 /* SDLReadDIDResponse.m in Sources */,
@@ -3707,28 +4507,38 @@
DAC5725B1D10B81E0004288B /* SDLTouch.m in Sources */,
5D61FCEB1A84238C00846EE7 /* SDLLayoutMode.m in Sources */,
5D61FC2E1A84238C00846EE7 /* SDLAddCommand.m in Sources */,
+ 5D1665C51CF8CA2700CC4CA1 /* SDLListFilesOperation.m in Sources */,
5D61FE021A84238C00846EE7 /* SDLVehicleDataNotificationStatus.m in Sources */,
5D61FDD81A84238C00846EE7 /* SDLTouchType.m in Sources */,
5D61FDD61A84238C00846EE7 /* SDLTouchEventCapabilities.m in Sources */,
- 5D61FCF11A84238C00846EE7 /* SDLLockScreenManager.m in Sources */,
+ 5DA102A51D4122C700C15826 /* NSMutableDictionary+SafeRemove.m in Sources */,
+ 5D61FCF11A84238C00846EE7 /* SDLLockScreenStatusManager.m in Sources */,
5D61FDAC1A84238C00846EE7 /* SDLStartTime.m in Sources */,
5D61FDA01A84238C00846EE7 /* SDLSoftButton.m in Sources */,
E9C32B951AB20BA200F283AF /* SDLStreamDelegate.m in Sources */,
5D61FCD21A84238C00846EE7 /* SDLImageFieldName.m in Sources */,
5D61FD761A84238C00846EE7 /* SDLRPCResponse.m in Sources */,
+ 5D3E48761D6F3B330000BFEF /* SDLAsynchronousOperation.m in Sources */,
5D61FE081A84238C00846EE7 /* SDLVehicleDataStatus.m in Sources */,
E9C32B9F1AB20C5900F283AF /* EAAccessoryManager+SDLProtocols.m in Sources */,
5D61FDA81A84238C00846EE7 /* SDLSpeakResponse.m in Sources */,
5DB92D331AC9C8BA00C15BB0 /* SDLRPCStruct.m in Sources */,
+ 5DA3F3551BC448060026F2D0 /* NSMapTable+Subscripting.m in Sources */,
5D61FCD61A84238C00846EE7 /* SDLImageType.m in Sources */,
+ 5D4D67AD1D2ED37A00468B4A /* SDLNotificationDispatcher.m in Sources */,
5D61FD7A1A84238C00846EE7 /* SDLScreenParams.m in Sources */,
5D61FC831A84238C00846EE7 /* SDLDeviceInfo.m in Sources */,
+ 5D7F87EC1CE3C1A1002DD7C4 /* SDLDeleteFileOperation.m in Sources */,
5D61FD641A84238C00846EE7 /* SDLResetGlobalProperties.m in Sources */,
+ 5D60088B1BE3ED540094A505 /* SDLStateMachine.m in Sources */,
5D61FD181A84238C00846EE7 /* SDLOnPermissionsChange.m in Sources */,
5D61FD3E1A84238C00846EE7 /* SDLPrimaryAudioSource.m in Sources */,
5D61FC2A1A84238C00846EE7 /* SDLAbstractProtocol.m in Sources */,
+ 5D82041F1BCD8E6100D0A41B /* SDLConfiguration.m in Sources */,
5D61FD381A84238C00846EE7 /* SDLPredefinedLayout.m in Sources */,
+ 5D3E487C1D6F888E0000BFEF /* SDLRPCResponseNotification.m in Sources */,
5D61FD0E1A84238C00846EE7 /* SDLOnHashChange.m in Sources */,
+ 5D4D67B51D30161600468B4A /* SDLLockScreenManager.m in Sources */,
5D61FDE41A84238C00846EE7 /* SDLUnregisterAppInterface.m in Sources */,
5D61FC361A84238C00846EE7 /* SDLAirbagStatus.m in Sources */,
5D61FD7E1A84238C00846EE7 /* SDLScrollableMessageResponse.m in Sources */,
@@ -3747,6 +4557,7 @@
5D61FD6A1A84238C00846EE7 /* SDLRPCMessage.m in Sources */,
5D61FCDB1A84238C00846EE7 /* SDLJingle.m in Sources */,
5D61FDA21A84238C00846EE7 /* SDLSoftButtonCapabilities.m in Sources */,
+ 5D8204321BD001C700D0A41B /* SDLArtwork.m in Sources */,
5D61FC2C1A84238C00846EE7 /* SDLAbstractTransport.m in Sources */,
5D61FD8E1A84238C00846EE7 /* SDLSetMediaClockTimerResponse.m in Sources */,
5D61FD721A84238C00846EE7 /* SDLRPCRequest.m in Sources */,
@@ -3756,6 +4567,7 @@
5D61FE0C1A84238C00846EE7 /* SDLVehicleType.m in Sources */,
5D61FDCC1A84238C00846EE7 /* SDLTextFieldName.m in Sources */,
5D61FC751A84238C00846EE7 /* SDLDeleteCommandResponse.m in Sources */,
+ 5DA3F3711BC4489A0026F2D0 /* SDLManager.m in Sources */,
5D61FD861A84238C00846EE7 /* SDLSetDisplayLayoutResponse.m in Sources */,
5D61FCB41A84238C00846EE7 /* SDLGetDTCsResponse.m in Sources */,
5D61FDFC1A84238C00846EE7 /* SDLV2ProtocolMessage.m in Sources */,
@@ -3770,6 +4582,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 5DBAE0AD1D368D1A00CE00BF /* SDLResponseDispatcherSpec.m in Sources */,
162E83951A9BDE8B00906325 /* SDLTurnSpec.m in Sources */,
162E83481A9BDE8B00906325 /* SDLUpdateTurnListSpec.m in Sources */,
1680B11E1A9CD7AD00DBD79E /* SDLProtocolReceivedMessageRouterSpec.m in Sources */,
@@ -3781,9 +4594,11 @@
162E82E01A9BDE8B00906325 /* SDLHMILevelSpec.m in Sources */,
162E83041A9BDE8B00906325 /* SDLUpdateModeSpec.m in Sources */,
162E83801A9BDE8B00906325 /* SDLHMIPermissionsSpec.m in Sources */,
+ 5D1654561D3E754F00554D93 /* SDLLifecycleManagerSpec.m in Sources */,
162E83021A9BDE8B00906325 /* SDLTouchTypeSpec.m in Sources */,
5DB92D2F1AC59F0000C15BB0 /* SDLObjectWithPrioritySpec.m in Sources */,
162E838A1A9BDE8B00906325 /* SDLSingleTireStatusSpec.m in Sources */,
+ 5D6EB4CC1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m in Sources */,
162E83051A9BDE8B00906325 /* SDLVehicleDataActiveStatusSpec.m in Sources */,
162E82E61A9BDE8B00906325 /* SDLInteractionModeSpec.m in Sources */,
162E83931A9BDE8B00906325 /* SDLTouchEventSpec.m in Sources */,
@@ -3791,6 +4606,7 @@
162E837D1A9BDE8B00906325 /* SDLEmergencyEventSpec.m in Sources */,
162E82D31A9BDE8A00906325 /* SDLCarModeStatusSpec.m in Sources */,
162E82EA1A9BDE8B00906325 /* SDLLanguageSpec.m in Sources */,
+ 5D76E3291D3D0A8800647CFA /* SDLFakeViewControllerPresenter.m in Sources */,
162E83331A9BDE8B00906325 /* SDLPerformInteractionSpec.m in Sources */,
1680B11A1A9CD7AD00DBD79E /* SDLAbstractProtocolSpec.m in Sources */,
1680B1151A9CD7AD00DBD79E /* SDLV2ProtocolHeaderSpec.m in Sources */,
@@ -3811,10 +4627,12 @@
162E82F11A9BDE8B00906325 /* SDLPowerModeStatusSpec.m in Sources */,
162E83881A9BDE8B00906325 /* SDLPresetBankCapabilitiesSpec.m in Sources */,
162E837E1A9BDE8B00906325 /* SDLGPSDataSpec.m in Sources */,
+ 5DAE06731BDEC6C000F9B498 /* SDLFileSpec.m in Sources */,
162E82E11A9BDE8B00906325 /* SDLHMIZoneCapabilitiesSpec.m in Sources */,
162E83721A9BDE8B00906325 /* SDLAudioPassThruCapabilitiesSpec.m in Sources */,
162E83681A9BDE8B00906325 /* SDLSpeakResponseSpec.m in Sources */,
162E83661A9BDE8B00906325 /* SDLShowResponseSpec.m in Sources */,
+ 5D9F50831BEA5C6100FEF399 /* SDLFileManagerSpec.m in Sources */,
162E83221A9BDE8B00906325 /* SDLAddCommandSpec.m in Sources */,
162E83121A9BDE8B00906325 /* SDLOnButtonPressSpec.m in Sources */,
162E838D1A9BDE8B00906325 /* SDLStartTimeSpec.m in Sources */,
@@ -3834,12 +4652,14 @@
162E83911A9BDE8B00906325 /* SDLTouchCoordSpec.m in Sources */,
162E832B1A9BDE8B00906325 /* SDLDeleteSubMenuSpec.m in Sources */,
162E83411A9BDE8B00906325 /* SDLSubscribeButtonSpec.m in Sources */,
- 5D59DD471B14FDEE00BE744D /* SDLLockScreenManagerSpec.m in Sources */,
+ 5D59DD471B14FDEE00BE744D /* SDLLockScreenStatusManagerSpec.m in Sources */,
162E82F31A9BDE8B00906325 /* SDLPrerecordedSpeechSpec.m in Sources */,
162E83691A9BDE8B00906325 /* SDLSubscribeButtonResponseSpec.m in Sources */,
+ 5DAE06751BDEC6D600F9B498 /* SDLArtworkSpec.m in Sources */,
162E83591A9BDE8B00906325 /* SDLListFilesResponseSpec.m in Sources */,
162E832A1A9BDE8B00906325 /* SDLDeleteInteractionChoiceSetSpec.m in Sources */,
162E839D1A9BDE8B00906325 /* SDLRPCResponseSpec.m in Sources */,
+ 5DB1BCDF1D243DD3002FFC37 /* SDLLockScreenConfigurationSpec.m in Sources */,
162E82E51A9BDE8B00906325 /* SDLImageTypeSpec.m in Sources */,
162E83421A9BDE8B00906325 /* SDLSubscribeVehicleDataSpec.m in Sources */,
162E83811A9BDE8B00906325 /* SDLImageFieldSpec.m in Sources */,
@@ -3855,6 +4675,7 @@
162E82DC1A9BDE8B00906325 /* SDLEmergencyEventTypeSpec.m in Sources */,
162E82CE1A9BDE8A00906325 /* SDLAudioTypeSpec.m in Sources */,
162E831C1A9BDE8B00906325 /* SDLOnSyncPDataSpec.m in Sources */,
+ 5D9F50871BED412E00FEF399 /* TestConnectionManager.m in Sources */,
162E83341A9BDE8B00906325 /* SDLPutFileSpec.m in Sources */,
162E837A1A9BDE8B00906325 /* SDLDIDResult.m in Sources */,
162E83171A9BDE8B00906325 /* SDLOnHMIStatusSpec.m in Sources */,
@@ -3871,6 +4692,7 @@
162E83291A9BDE8B00906325 /* SDLDeleteFileSpec.m in Sources */,
1680B11D1A9CD7AD00DBD79E /* SDLProtocolMessageDisassemblerSpec.m in Sources */,
162E838E1A9BDE8B00906325 /* SDLSyncMsgVersionSpec.m in Sources */,
+ 5D76E31C1D3805FF00647CFA /* SDLLockScreenManagerSpec.m in Sources */,
162E82DA1A9BDE8B00906325 /* SDLDriverDistractionStateSpec.m in Sources */,
162E83631A9BDE8B00906325 /* SDLSetGlobalPropertiesResponseSpec.m in Sources */,
162E837B1A9BDE8B00906325 /* SDLDisplayCapabilitiesSpec.m in Sources */,
@@ -3884,7 +4706,9 @@
162E82D21A9BDE8A00906325 /* SDLButtonPressModeSpec.m in Sources */,
162E82D71A9BDE8A00906325 /* SDLDeviceLevelStatusSpec.m in Sources */,
162E83841A9BDE8B00906325 /* SDLMenuParamsSpec.m in Sources */,
+ 5DB1BCE11D243DDE002FFC37 /* SDLConfigurationSpec.m in Sources */,
162E83071A9BDE8B00906325 /* SDLVehicleDataNotificationStatusSpec.m in Sources */,
+ 5D9F50811BE7E6E300FEF399 /* SDLPermissionsManagerSpec.m in Sources */,
162E83361A9BDE8B00906325 /* SDLRegisterAppInterfaceSpec.m in Sources */,
162E82DD1A9BDE8B00906325 /* SDLFileTypeSpec.m in Sources */,
162E836A1A9BDE8B00906325 /* SDLSubscribeVehicleDataResponseSpec.m in Sources */,
@@ -3902,9 +4726,12 @@
162E83381A9BDE8B00906325 /* SDLScrollableMessageSpec.m in Sources */,
162E82E81A9BDE8B00906325 /* SDLKeyboardLayoutSpec.m in Sources */,
DA4353EB1D2721680099B8C4 /* SDLTouchSpec.m in Sources */,
+ 5DB1BCE71D245647002FFC37 /* TestStateMachineTarget.m in Sources */,
162E83541A9BDE8B00906325 /* SDLEncodedSyncPDataResponseSpec.m in Sources */,
162E83161A9BDE8B00906325 /* SDLOnHashChangeSpec.m in Sources */,
162E82FE1A9BDE8B00906325 /* SDLTBTStateSpec.m in Sources */,
+ 5D5DBF0B1D48E5E600D4F914 /* SDLLockScreenViewControllerSnapshotTests.m in Sources */,
+ 5DB1BCD41D243A8E002FFC37 /* SDLListFilesOperationSpec.m in Sources */,
162E834B1A9BDE8B00906325 /* SDLAlertManeuverResponseSpec.m in Sources */,
162E833E1A9BDE8B00906325 /* SDLShowSpec.m in Sources */,
162E83241A9BDE8B00906325 /* SDLAlertManeuverSpec.m in Sources */,
@@ -3919,6 +4746,7 @@
162E838B1A9BDE8B00906325 /* SDLSoftButtonCapabilitiesSpec.m in Sources */,
162E834C1A9BDE8B00906325 /* SDLAlertResponseSpec.m in Sources */,
1680B11B1A9CD7AD00DBD79E /* SDLFunctionIDSpec.m in Sources */,
+ 5DB1BCDA1D243D85002FFC37 /* SDLStateMachineSpec.m in Sources */,
162E83131A9BDE8B00906325 /* SDLOnCommandSpec.m in Sources */,
162E833A1A9BDE8B00906325 /* SDLSetDisplayLayoutSpec.m in Sources */,
162E838F1A9BDE8B00906325 /* SDLTextFieldSpec.m in Sources */,
@@ -3951,6 +4779,7 @@
162E833F1A9BDE8B00906325 /* SDLSliderSpec.m in Sources */,
162E838C1A9BDE8B00906325 /* SDLSoftButtonSpec.m in Sources */,
162E83191A9BDE8B00906325 /* SDLOnLanguageChangeSpec.m in Sources */,
+ 5DB1BCDD1D243DC3002FFC37 /* SDLLifecycleConfigurationSpec.m in Sources */,
162E83611A9BDE8B00906325 /* SDLSetAppIconResponseSpec.m in Sources */,
162E83471A9BDE8B00906325 /* SDLUnsubscribeVehicleDataSpec.m in Sources */,
162E839A1A9BDE8B00906325 /* SDLRPCMessageSpec.m in Sources */,
@@ -3992,8 +4821,10 @@
1680B1171A9CD7AD00DBD79E /* SDLProtocolSpec.m in Sources */,
162E836D1A9BDE8B00906325 /* SDLUnregisterAppInterfaceResponseSpec.m in Sources */,
162E837C1A9BDE8B00906325 /* SDLECallInfoSpec.m in Sources */,
+ 5DB1BCD51D243A8E002FFC37 /* SDLUploadFileOperationSpec.m in Sources */,
162E83401A9BDE8B00906325 /* SDLSpeakSpec.m in Sources */,
5DCF76FC1ACDDB4200BB647B /* SDLSendLocationSpec.m in Sources */,
+ 5DB1BCD81D243AA6002FFC37 /* SDLPermissionFilterSpec.m in Sources */,
162E83561A9BDE8B00906325 /* SDLGenericResponseSpec.m in Sources */,
162E82D51A9BDE8A00906325 /* SDLCompassDirectionSpec.m in Sources */,
162E83861A9BDE8B00906325 /* SDLParameterPermissionsSpec.m in Sources */,
@@ -4010,7 +4841,9 @@
162E83551A9BDE8B00906325 /* SDLEndAudioPassThruResponseSpec.m in Sources */,
162E83251A9BDE8B00906325 /* SDLAlertSpec.m in Sources */,
162E830A1A9BDE8B00906325 /* SDLVehicleDataTypeSpec.m in Sources */,
+ 5DB1BCD31D243A8E002FFC37 /* SDLDeleteFileOperationSpec.m in Sources */,
162E82F41A9BDE8B00906325 /* SDLPrimaryAudioSource.m in Sources */,
+ 5DBAE0AB1D3588AC00CE00BF /* SDLNotificationDispatcherSpec.m in Sources */,
162E83461A9BDE8B00906325 /* SDLUnsubscribeButtonSpec.m in Sources */,
162E82EB1A9BDE8B00906325 /* SDLLayoutModeSpec.m in Sources */,
DACBA1DE1D22D642002356F8 /* SDLTouchType.m in Sources */,
@@ -4074,6 +4907,21 @@
name = Main.storyboard;
sourceTree = "<group>";
};
+ 5D616B481D552F7A00553F6B /* SDLLockScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 5D616B471D552F7A00553F6B /* Base */,
+ 5D616B561D5A233100553F6B /* en */,
+ 5D616B571D5A23C500553F6B /* fr */,
+ 5D616B581D5A23CC00553F6B /* de */,
+ 5D616B591D5A23D400553F6B /* ja */,
+ 5D616B5A1D5A23DC00553F6B /* zh-Hans */,
+ 5D616B5B1D5A23E400553F6B /* es */,
+ );
+ name = SDLLockScreen.storyboard;
+ path = Assets;
+ sourceTree = "<group>";
+ };
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
@@ -4081,6 +4929,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
@@ -4115,7 +4964,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.1;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -4126,6 +4975,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
@@ -4153,7 +5003,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.1;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@@ -4170,7 +5020,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
- PRODUCT_NAME = "$(TARGET_NAME)";
+ PRODUCT_NAME = "SDL Example";
};
name = Debug;
};
@@ -4183,7 +5033,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.smartdevicelink.SDLTestApp;
- PRODUCT_NAME = "$(TARGET_NAME)";
+ PRODUCT_NAME = "SDL Example";
};
name = Release;
};
@@ -4203,10 +5053,7 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Carthage/Build/iOS",
- );
+ FRAMEWORK_SEARCH_PATHS = "$(inherited)";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
@@ -4220,6 +5067,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
RUN_CLANG_STATIC_ANALYZER = YES;
SKIP_INSTALL = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
@@ -4242,10 +5090,7 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Carthage/Build/iOS",
- );
+ FRAMEWORK_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = SmartDeviceLink/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
@@ -4264,7 +5109,6 @@
5D61FA391A84237100846EE7 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
@@ -4300,7 +5144,6 @@
5D61FA3A1A84237100846EE7 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
diff --git a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme
index 522c67a57..c50ed7d5c 100644
--- a/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme
+++ b/SmartDeviceLink-iOS.xcodeproj/xcshareddata/xcschemes/SmartDeviceLink.xcscheme
@@ -26,8 +26,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
- shouldUseLaunchSchemeArgsEnv = "YES"
- codeCoverageEnabled = "YES">
+ shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
@@ -71,6 +70,13 @@
ReferencedContainer = "container:SmartDeviceLink-iOS.xcodeproj">
</BuildableReference>
</MacroExpansion>
+ <EnvironmentVariables>
+ <EnvironmentVariable
+ key = "FB_REFERENCE_IMAGE_DIR"
+ value = "$(SOURCE_ROOT)/$(TARGET_NAME)Tests/ReferenceImages"
+ isEnabled = "YES">
+ </EnvironmentVariable>
+ </EnvironmentVariables>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
diff --git a/SmartDeviceLink/Assets/Base.lproj/SDLLockScreen.storyboard b/SmartDeviceLink/Assets/Base.lproj/SDLLockScreen.storyboard
new file mode 100644
index 000000000..4743ae983
--- /dev/null
+++ b/SmartDeviceLink/Assets/Base.lproj/SDLLockScreen.storyboard
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="sao-xX-Ugl">
+ <dependencies>
+ <deployment version="1536" identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
+ <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <scenes>
+ <!--Lock Screen View Controller-->
+ <scene sceneID="390-LV-jKT">
+ <objects>
+ <viewController id="sao-xX-Ugl" customClass="SDLLockScreenViewController" sceneMemberID="viewController">
+ <layoutGuides>
+ <viewControllerLayoutGuide type="top" id="mqk-8V-oes"/>
+ <viewControllerLayoutGuide type="bottom" id="wh4-r5-yql"/>
+ </layoutGuides>
+ <view key="view" contentMode="scaleToFill" id="daa-1b-9se">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="480"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="fyC-E0-YKF">
+ <constraints>
+ <constraint firstAttribute="width" constant="120" id="Pm5-yr-PT3"/>
+ <constraint firstAttribute="height" constant="36" id="yVy-ww-yMp"/>
+ </constraints>
+ </imageView>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qlE-SZ-K9i">
+ <constraints>
+ <constraint firstAttribute="width" constant="240" id="Bk8-YV-DHy"/>
+ <constraint firstAttribute="height" constant="128" id="boE-Tt-Ols"/>
+ </constraints>
+ </imageView>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Locked for your safety" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2GC-iG-Bjq">
+ <fontDescription key="fontDescription" type="boldSystem" pointSize="14"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="lock_arrow_up_black" translatesAutoresizingMaskIntoConstraints="NO" id="bgC-hp-jto">
+ <constraints>
+ <constraint firstAttribute="height" constant="68" id="TX0-CV-jWt"/>
+ <constraint firstAttribute="width" constant="30" id="qg1-7M-JOH"/>
+ </constraints>
+ </imageView>
+ <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="lock_arrow_down_black" translatesAutoresizingMaskIntoConstraints="NO" id="QwS-i6-nIR">
+ <constraints>
+ <constraint firstAttribute="width" constant="30" id="dH7-wX-ij9"/>
+ <constraint firstAttribute="height" constant="68" id="hm6-eY-q7P"/>
+ </constraints>
+ </imageView>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="M7Q-8D-weT">
+ <constraints>
+ <constraint firstAttribute="height" constant="128" id="1Px-le-yzw"/>
+ <constraint firstAttribute="width" constant="240" id="eVl-bJ-3TM"/>
+ </constraints>
+ </imageView>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="b2o-8D-i9T">
+ <constraints>
+ <constraint firstAttribute="width" constant="185" id="CE6-0z-Lmn"/>
+ <constraint firstAttribute="height" constant="76" id="emS-mJ-Ryy"/>
+ </constraints>
+ </imageView>
+ <view opaque="NO" alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="yyo-mJ-82g" userLabel="Center Spacer View">
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="2" id="1D8-iN-cG4"/>
+ <constraint firstAttribute="width" constant="2" id="BOG-80-2W5"/>
+ </constraints>
+ </view>
+ </subviews>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ <constraints>
+ <constraint firstItem="bgC-hp-jto" firstAttribute="centerY" secondItem="daa-1b-9se" secondAttribute="centerY" id="3M5-ke-rxH"/>
+ <constraint firstAttribute="trailingMargin" secondItem="2GC-iG-Bjq" secondAttribute="trailing" id="8ye-Ub-7tt"/>
+ <constraint firstItem="wh4-r5-yql" firstAttribute="top" secondItem="2GC-iG-Bjq" secondAttribute="bottom" constant="8" id="BNz-vd-t0G"/>
+ <constraint firstItem="QwS-i6-nIR" firstAttribute="centerY" secondItem="daa-1b-9se" secondAttribute="centerY" id="Bda-7E-hB1"/>
+ <constraint firstItem="M7Q-8D-weT" firstAttribute="centerX" secondItem="daa-1b-9se" secondAttribute="centerX" id="FpJ-PV-OTU"/>
+ <constraint firstItem="b2o-8D-i9T" firstAttribute="centerY" secondItem="daa-1b-9se" secondAttribute="centerY" id="Irb-tb-I3c"/>
+ <constraint firstItem="yyo-mJ-82g" firstAttribute="centerY" secondItem="daa-1b-9se" secondAttribute="centerY" id="KJS-9f-Xk1"/>
+ <constraint firstItem="b2o-8D-i9T" firstAttribute="centerX" secondItem="daa-1b-9se" secondAttribute="centerX" id="TOb-Qt-FwN"/>
+ <constraint firstItem="fyC-E0-YKF" firstAttribute="centerX" secondItem="daa-1b-9se" secondAttribute="centerX" id="VU4-AJ-Uzf"/>
+ <constraint firstItem="yyo-mJ-82g" firstAttribute="centerX" secondItem="daa-1b-9se" secondAttribute="centerX" id="YcC-cU-iOu"/>
+ <constraint firstItem="qlE-SZ-K9i" firstAttribute="centerX" secondItem="daa-1b-9se" secondAttribute="centerX" id="a80-NE-fUz"/>
+ <constraint firstItem="2GC-iG-Bjq" firstAttribute="top" secondItem="fyC-E0-YKF" secondAttribute="bottom" constant="12" id="aY6-Wi-6Ss"/>
+ <constraint firstItem="yyo-mJ-82g" firstAttribute="leading" secondItem="bgC-hp-jto" secondAttribute="trailing" constant="8" id="cFE-fa-NpO"/>
+ <constraint firstItem="QwS-i6-nIR" firstAttribute="leading" secondItem="yyo-mJ-82g" secondAttribute="trailing" constant="8" id="d7Z-Gl-Q0P"/>
+ <constraint firstItem="M7Q-8D-weT" firstAttribute="top" secondItem="bgC-hp-jto" secondAttribute="bottom" constant="16" id="eba-BW-tt4"/>
+ <constraint firstItem="bgC-hp-jto" firstAttribute="top" secondItem="qlE-SZ-K9i" secondAttribute="bottom" constant="16" id="gwo-mS-ib9"/>
+ <constraint firstAttribute="leadingMargin" secondItem="2GC-iG-Bjq" secondAttribute="leading" id="vFo-Ag-WyF"/>
+ </constraints>
+ </view>
+ <connections>
+ <outlet property="arrowDownImageView" destination="QwS-i6-nIR" id="saq-rY-Rze"/>
+ <outlet property="arrowUpImageView" destination="bgC-hp-jto" id="Eej-gQ-YBF"/>
+ <outlet property="backupImageView" destination="b2o-8D-i9T" id="uRA-dC-93k"/>
+ <outlet property="lockedLabel" destination="2GC-iG-Bjq" id="Eth-07-rcX"/>
+ <outlet property="primaryAppIconImageView" destination="qlE-SZ-K9i" id="ZPL-Vy-bL7"/>
+ <outlet property="primaryVehicleIconImageView" destination="M7Q-8D-weT" id="axq-sb-8oP"/>
+ <outlet property="sdlIconImageView" destination="fyC-E0-YKF" id="eLG-nh-TLc"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="Wfa-ZV-GKT" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="639" y="866"/>
+ </scene>
+ </scenes>
+ <resources>
+ <image name="lock_arrow_down_black" width="30" height="68"/>
+ <image name="lock_arrow_up_black" width="30" height="68"/>
+ </resources>
+</document>
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/Contents.json b/SmartDeviceLink/Assets/SDLAssets.xcassets/Contents.json
new file mode 100644
index 000000000..da4a164c9
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/Contents.json b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/Contents.json
new file mode 100644
index 000000000..85553c22d
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_down_black.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_down_black@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_down_black@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black.png
new file mode 100644
index 000000000..68f1c3ca7
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black@2x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black@2x.png
new file mode 100644
index 000000000..85fbc3446
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black@2x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black@3x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black@3x.png
new file mode 100644
index 000000000..af14aa8bb
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_black.imageset/lock_arrow_down_black@3x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/Contents.json b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/Contents.json
new file mode 100644
index 000000000..765c60c66
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_down_white.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_down_white@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_down_white@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white.png
new file mode 100644
index 000000000..07e620d05
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white@2x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white@2x.png
new file mode 100644
index 000000000..57fa8120f
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white@2x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white@3x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white@3x.png
new file mode 100644
index 000000000..b354c1a13
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_down_white.imageset/lock_arrow_down_white@3x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/Contents.json b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/Contents.json
new file mode 100644
index 000000000..2a088dfef
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_up_black.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_up_black@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_up_black@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black.png
new file mode 100644
index 000000000..ecc048331
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black@2x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black@2x.png
new file mode 100644
index 000000000..fa38a0772
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black@2x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black@3x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black@3x.png
new file mode 100644
index 000000000..b59bda372
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_black.imageset/lock_arrow_up_black@3x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/Contents.json b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/Contents.json
new file mode 100644
index 000000000..3140e0f82
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_up_white.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_up_white@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "lock_arrow_up_white@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white.png
new file mode 100644
index 000000000..bb0662fe5
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white@2x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white@2x.png
new file mode 100644
index 000000000..f45e6b299
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white@2x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white@3x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white@3x.png
new file mode 100644
index 000000000..d30fc404c
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/lock_arrow_up_white.imageset/lock_arrow_up_white@3x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/Contents.json b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/Contents.json
new file mode 100644
index 000000000..2ab4626e9
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "sdl_logo_black.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "sdl_logo_black@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "sdl_logo_black@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black.png
new file mode 100644
index 000000000..68cf3a52d
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black@2x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black@2x.png
new file mode 100644
index 000000000..1427721a7
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black@2x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black@3x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black@3x.png
new file mode 100644
index 000000000..dfe0ab3f8
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_black.imageset/sdl_logo_black@3x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/Contents.json b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/Contents.json
new file mode 100644
index 000000000..3943b868e
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "sdl_logo_white.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "sdl_logo_white@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "sdl_logo_white@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white.png
new file mode 100644
index 000000000..1c35ef9b3
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white@2x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white@2x.png
new file mode 100644
index 000000000..b7d0bd92a
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white@2x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white@3x.png b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white@3x.png
new file mode 100644
index 000000000..b8b9ef757
--- /dev/null
+++ b/SmartDeviceLink/Assets/SDLAssets.xcassets/sdl_logo_white.imageset/sdl_logo_white@3x.png
Binary files differ
diff --git a/SmartDeviceLink/Assets/de.lproj/SDLLockScreen.strings b/SmartDeviceLink/Assets/de.lproj/SDLLockScreen.strings
new file mode 100644
index 000000000..67b3bf70b
--- /dev/null
+++ b/SmartDeviceLink/Assets/de.lproj/SDLLockScreen.strings
@@ -0,0 +1,3 @@
+
+/* Class = "UILabel"; text = "Locked for your safety"; ObjectID = "2GC-iG-Bjq"; */
+"2GC-iG-Bjq.text" = "Für Ihre Sicherheit gesperrt";
diff --git a/SmartDeviceLink/Assets/en.lproj/SDLLockScreen.strings b/SmartDeviceLink/Assets/en.lproj/SDLLockScreen.strings
new file mode 100644
index 000000000..97c0f7787
--- /dev/null
+++ b/SmartDeviceLink/Assets/en.lproj/SDLLockScreen.strings
@@ -0,0 +1,3 @@
+
+/* Class = "UILabel"; text = "Locked for your safety"; ObjectID = "2GC-iG-Bjq"; */
+"2GC-iG-Bjq.text" = "Locked for your safety";
diff --git a/SmartDeviceLink/Assets/es.lproj/SDLLockScreen.strings b/SmartDeviceLink/Assets/es.lproj/SDLLockScreen.strings
new file mode 100644
index 000000000..67f1aaabc
--- /dev/null
+++ b/SmartDeviceLink/Assets/es.lproj/SDLLockScreen.strings
@@ -0,0 +1,3 @@
+
+/* Class = "UILabel"; text = "Locked for your safety"; ObjectID = "2GC-iG-Bjq"; */
+"2GC-iG-Bjq.text" = "Bloqueado para su seguridad";
diff --git a/SmartDeviceLink/Assets/fr.lproj/SDLLockScreen.strings b/SmartDeviceLink/Assets/fr.lproj/SDLLockScreen.strings
new file mode 100644
index 000000000..cdeb13b3a
--- /dev/null
+++ b/SmartDeviceLink/Assets/fr.lproj/SDLLockScreen.strings
@@ -0,0 +1,3 @@
+
+/* Class = "UILabel"; text = "Locked for your safety"; ObjectID = "2GC-iG-Bjq"; */
+"2GC-iG-Bjq.text" = "Verrouillé pour votre sécurité";
diff --git a/SmartDeviceLink/Assets/ja.lproj/SDLLockScreen.strings b/SmartDeviceLink/Assets/ja.lproj/SDLLockScreen.strings
new file mode 100644
index 000000000..c7e55c324
--- /dev/null
+++ b/SmartDeviceLink/Assets/ja.lproj/SDLLockScreen.strings
@@ -0,0 +1,3 @@
+
+/* Class = "UILabel"; text = "Locked for your safety"; ObjectID = "2GC-iG-Bjq"; */
+"2GC-iG-Bjq.text" = "安全上の理由からロックされています";
diff --git a/SmartDeviceLink/Assets/zh-Hans.lproj/SDLLockScreen.strings b/SmartDeviceLink/Assets/zh-Hans.lproj/SDLLockScreen.strings
new file mode 100644
index 000000000..18c00d532
--- /dev/null
+++ b/SmartDeviceLink/Assets/zh-Hans.lproj/SDLLockScreen.strings
@@ -0,0 +1,3 @@
+
+/* Class = "UILabel"; text = "Locked for your safety"; ObjectID = "2GC-iG-Bjq"; */
+"2GC-iG-Bjq.text" = "出于您的安全而锁屏";
diff --git a/SmartDeviceLink/Info.plist b/SmartDeviceLink/Info.plist
index bd54e0ec6..b94d08631 100644
--- a/SmartDeviceLink/Info.plist
+++ b/SmartDeviceLink/Info.plist
@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
- <string>4.2.4</string>
+ <string>4.3.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
diff --git a/SmartDeviceLink/NSBundle+SDLBundle.h b/SmartDeviceLink/NSBundle+SDLBundle.h
new file mode 100644
index 000000000..6ca61461d
--- /dev/null
+++ b/SmartDeviceLink/NSBundle+SDLBundle.h
@@ -0,0 +1,19 @@
+//
+// NSBundle+SDLBundle.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 8/31/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NSBundle (SDLBundle)
+
++ (nullable NSBundle *)sdlBundle;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/NSBundle+SDLBundle.m b/SmartDeviceLink/NSBundle+SDLBundle.m
new file mode 100644
index 000000000..032994883
--- /dev/null
+++ b/SmartDeviceLink/NSBundle+SDLBundle.m
@@ -0,0 +1,36 @@
+//
+// NSBundle+SDLBundle.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 8/31/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "NSBundle+SDLBundle.h"
+
+#import "SDLManager.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation NSBundle (SDLBundle)
+
++ (nullable NSBundle *)sdlBundle {
+ NSURL *sdlBundleURL = [[NSBundle mainBundle] URLForResource:@"SmartDeviceLink" withExtension:@"bundle"];
+ NSBundle *sdlBundle = nil;
+
+ if (sdlBundleURL != nil) {
+ sdlBundle = [NSBundle bundleWithURL:sdlBundleURL];
+ }
+ if (sdlBundle == nil) {
+ sdlBundle = [NSBundle bundleForClass:[SDLManager class]];
+ }
+ if (sdlBundle == nil) {
+ @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"SDL WARNING: The 'SmartDeviceLink.bundle' resources bundle was not found. If you are using cocoapods, try dragging the bundle from the SmartDeviceLink-iOS pod 'products' directory into your resources build phase. If this does not work, please go to the SDL slack at slack.smartdevicelink.com and explain your issue. You may disable the lockscreen in configuration to prevent this failure, for now." userInfo:nil];
+ }
+
+ return sdlBundle;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/NSMapTable+Subscripting.h b/SmartDeviceLink/NSMapTable+Subscripting.h
new file mode 100644
index 000000000..313e25be4
--- /dev/null
+++ b/SmartDeviceLink/NSMapTable+Subscripting.h
@@ -0,0 +1,23 @@
+//
+// NSMapTable+Subscripting.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/5/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Implement subscripting methods for NSMapTable to allow for easily pushing and pulling objects.
+ */
+@interface NSMapTable (Subscripting)
+
+- (void)setObject:(nullable id)anObject forKeyedSubscript:(id<NSCopying>)key;
+- (nullable id)objectForKeyedSubscript:(id<NSCopying>)key;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/NSMapTable+Subscripting.m b/SmartDeviceLink/NSMapTable+Subscripting.m
new file mode 100644
index 000000000..3ac063f62
--- /dev/null
+++ b/SmartDeviceLink/NSMapTable+Subscripting.m
@@ -0,0 +1,25 @@
+//
+// NSMapTable+Subscripting.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/5/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "NSMapTable+Subscripting.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation NSMapTable (Subscripting)
+
+- (void)setObject:(nullable id)anObject forKeyedSubscript:(id<NSCopying>)key {
+ [self setObject:anObject forKey:key];
+}
+
+- (nullable id)objectForKeyedSubscript:(id<NSCopying>)key {
+ return [self objectForKey:key];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/NSMutableDictionary+SafeRemove.h b/SmartDeviceLink/NSMutableDictionary+SafeRemove.h
new file mode 100644
index 000000000..c72371395
--- /dev/null
+++ b/SmartDeviceLink/NSMutableDictionary+SafeRemove.h
@@ -0,0 +1,37 @@
+//
+// NSDictionary+SafeRemove.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/21/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface NSMutableDictionary <KeyType, ObjectType>
+(SafeRemove)
+
+ /**
+ * Safely attempt to remove a key/object pair by no-oping if they don't exist in the Mutable Dictionary instead of throwing an exception
+ *
+ * @param aKey The key to attempt removal of
+ *
+ * @return Whether or not the key/object pair existed to remove.
+ */
+ - (BOOL)safeRemoveObjectForKey : (KeyType)aKey;
+
+@end
+
+@interface NSMapTable <KeyType, ObjectType>
+(SafeRemove)
+
+ /**
+ * Safely attempt to remove a key/object pair by no-oping if they don't exist in the MapTable instead of throwing an exception
+ *
+ * @param aKey The key to attempt removal of
+ *
+ * @return Whether or not the key/object pair existed to remove.
+ */
+ - (BOOL)safeRemoveObjectForKey : (KeyType)aKey;
+
+@end
diff --git a/SmartDeviceLink/NSMutableDictionary+SafeRemove.m b/SmartDeviceLink/NSMutableDictionary+SafeRemove.m
new file mode 100644
index 000000000..250c1a896
--- /dev/null
+++ b/SmartDeviceLink/NSMutableDictionary+SafeRemove.m
@@ -0,0 +1,37 @@
+//
+// NSDictionary+SafeRemove.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/21/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "NSMutableDictionary+SafeRemove.h"
+
+@implementation NSMutableDictionary (SafeRemove)
+
+- (BOOL)safeRemoveObjectForKey:(id)aKey {
+ if ([self objectForKey:aKey] != nil) {
+ [self removeObjectForKey:aKey];
+
+ return YES;
+ }
+
+ return NO;
+}
+
+@end
+
+@implementation NSMapTable (SafeRemove)
+
+- (BOOL)safeRemoveObjectForKey:(id)aKey {
+ if ([self objectForKey:aKey] != nil) {
+ [self removeObjectForKey:aKey];
+
+ return YES;
+ }
+
+ return NO;
+}
+
+@end
diff --git a/SmartDeviceLink/NSNumber+NumberType.h b/SmartDeviceLink/NSNumber+NumberType.h
new file mode 100644
index 000000000..935fba96d
--- /dev/null
+++ b/SmartDeviceLink/NSNumber+NumberType.h
@@ -0,0 +1,37 @@
+//
+// NSNumber+NumberType.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 11/19/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+/**
+ * A decleration that this NSNumber contains an NSInteger.
+ */
+@protocol SDLInt
+@end
+
+/**
+ * A declaration that this NSNumber contains an NSUInteger.
+ */
+@protocol SDLUInt
+@end
+
+/**
+ * A declaration that this NSNumber contains a BOOL.
+ */
+@protocol SDLBool
+@end
+
+/**
+ * A declaration that this NSNumber contains a float.
+ */
+@protocol SDLFloat
+@end
+
+@interface NSNumber (NumberType) <SDLInt, SDLUInt, SDLBool, SDLFloat>
+
+@end
diff --git a/SmartDeviceLink/SDLAddCommand.h b/SmartDeviceLink/SDLAddCommand.h
index bce12fafd..d933cff61 100644
--- a/SmartDeviceLink/SDLAddCommand.h
+++ b/SmartDeviceLink/SDLAddCommand.h
@@ -3,9 +3,12 @@
#import "SDLRPCRequest.h"
+#import "SDLNotificationConstants.h"
+#import "SDLRequestHandler.h"
+
@class SDLMenuParams;
@class SDLImage;
-
+@class SDLImageType;
/**
* This class will add a command to the application's Command Menu SDLMenuParams
@@ -31,8 +34,7 @@
*
* @see SDLDeleteCommand SDLAddSubMenu SDLDeleteSubMenu
*/
-@interface SDLAddCommand : SDLRPCRequest {
-}
+@interface SDLAddCommand : SDLRPCRequest <SDLRequestHandler>
/**
* Constructs a new SDLAddCommand object
@@ -40,12 +42,34 @@
- (instancetype)init;
/**
+ * Construct a SDLAddCommand with a handler callback when an event occurs.
+ *
+ * @param handler A callback that will be called when a button event occurs for the command
+ *
+ * @return An SDLAddCommand object
+ */
+- (instancetype)initWithHandler:(SDLRPCNotificationHandler)handler;
+
+/**
* Constructs a new *SDLAddCommand* object indicated by the dictionary parameter
*
* @param dict The dictionary to use
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithId:(UInt32)commandId vrCommands:(NSArray<NSString *> *)vrCommands handler:(SDLRPCNotificationHandler)handler;
+
+- (instancetype)initWithId:(UInt32)commandId vrCommands:(NSArray<NSString *> *)vrCommands menuName:(NSString *)menuName handler:(SDLRPCNotificationHandler)handler;
+
+- (instancetype)initWithId:(UInt32)commandId vrCommands:(NSArray<NSString *> *)vrCommands menuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position iconValue:(NSString *)iconValue iconType:(SDLImageType *)iconType handler:(SDLRPCNotificationHandler)handler;
+
+/**
+ * A handler that will let you know when the button you created is subscribed.
+ *
+ * @warning This will only work if you use SDLManager.
+ */
+@property (copy, nonatomic) SDLRPCNotificationHandler handler;
+
/**
* @abstract A Unique Command ID that identifies the command
*
diff --git a/SmartDeviceLink/SDLAddCommand.m b/SmartDeviceLink/SDLAddCommand.m
index e9630665e..75524881c 100644
--- a/SmartDeviceLink/SDLAddCommand.m
+++ b/SmartDeviceLink/SDLAddCommand.m
@@ -17,12 +17,61 @@
return self;
}
+- (instancetype)initWithHandler:(SDLRPCNotificationHandler)handler {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ _handler = handler;
+
+ return self;
+}
+
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict {
if (self = [super initWithDictionary:dict]) {
}
return self;
}
+- (instancetype)initWithId:(UInt32)commandId vrCommands:(NSArray<NSString *> *)vrCommands handler:(SDLRPCNotificationHandler)handler {
+ return [self initWithId:commandId vrCommands:vrCommands menuName:nil handler:handler];
+}
+
+- (instancetype)initWithId:(UInt32)commandId vrCommands:(NSArray<NSString *> *)vrCommands menuName:(NSString *)menuName handler:(SDLRPCNotificationHandler)handler {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.cmdID = @(commandId);
+
+ if (menuName != nil) {
+ self.menuParams = [[SDLMenuParams alloc] initWithMenuName:menuName];
+ }
+
+ self.vrCommands = [vrCommands mutableCopy];
+ self.handler = handler;
+
+ return self;
+}
+
+- (instancetype)initWithId:(UInt32)commandId vrCommands:(NSArray<NSString *> *)vrCommands menuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position iconValue:(NSString *)iconValue iconType:(SDLImageType *)iconType handler:(SDLRPCNotificationHandler)handler {
+ self = [self initWithId:commandId vrCommands:vrCommands menuName:menuName handler:handler];
+ if (!self) {
+ return nil;
+ }
+
+ self.menuParams.parentID = @(parentId);
+ self.menuParams.position = @(position);
+
+ if (iconValue != nil && iconType != nil) {
+ self.cmdIcon = [[SDLImage alloc] initWithName:iconValue ofType:iconType];
+ }
+
+ return self;
+}
+
- (void)setCmdID:(NSNumber *)cmdID {
if (cmdID != nil) {
[parameters setObject:cmdID forKey:NAMES_cmdID];
diff --git a/SmartDeviceLink/SDLAddSubMenu.h b/SmartDeviceLink/SDLAddSubMenu.h
index 0a749b382..94577ba68 100644
--- a/SmartDeviceLink/SDLAddSubMenu.h
+++ b/SmartDeviceLink/SDLAddSubMenu.h
@@ -31,6 +31,10 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithId:(UInt8)menuId menuName:(NSString *)menuName;
+
+- (instancetype)initWithId:(UInt8)menuId menuName:(NSString *)menuName position:(UInt8)position;
+
/**
* @abstract a Menu ID that identifies a sub menu
* @discussion This value is used in
diff --git a/SmartDeviceLink/SDLAddSubMenu.m b/SmartDeviceLink/SDLAddSubMenu.m
index f02192b00..a4d22a284 100644
--- a/SmartDeviceLink/SDLAddSubMenu.m
+++ b/SmartDeviceLink/SDLAddSubMenu.m
@@ -18,6 +18,30 @@
return self;
}
+
+- (instancetype)initWithId:(UInt8)menuId menuName:(NSString *)menuName position:(UInt8)position {
+ self = [self initWithId:menuId menuName:menuName];
+ if (!self) {
+ return nil;
+ }
+
+ self.position = @(position);
+
+ return self;
+}
+
+- (instancetype)initWithId:(UInt8)menuId menuName:(NSString *)menuName {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.menuID = @(menuId);
+ self.menuName = menuName;
+
+ return self;
+}
+
- (void)setMenuID:(NSNumber *)menuID {
if (menuID != nil) {
[parameters setObject:menuID forKey:NAMES_menuID];
diff --git a/SmartDeviceLink/SDLAlert.h b/SmartDeviceLink/SDLAlert.h
index 59f909caa..303c8b439 100644
--- a/SmartDeviceLink/SDLAlert.h
+++ b/SmartDeviceLink/SDLAlert.h
@@ -4,6 +4,9 @@
#import "SDLRPCRequest.h"
+@class SDLSoftButton;
+@class SDLTTSChunk;
+
/**
* 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.
*
@@ -47,6 +50,26 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 duration:(UInt16)duration;
+
+- (instancetype)initWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3;
+
+- (instancetype)initWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 duration:(UInt16)duration;
+
+- (instancetype)initWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 duration:(UInt16)duration softButtons:(NSArray<SDLSoftButton *> *)softButtons;
+
+- (instancetype)initWithTTS:(NSString *)ttsText playTone:(BOOL)playTone;
+
+- (instancetype)initWithTTS:(NSString *)ttsText alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 playTone:(BOOL)playTone duration:(UInt16)duration;
+
+- (instancetype)initWithTTS:(NSString *)ttsText alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(BOOL)playTone duration:(UInt16)duration;
+
+- (instancetype)initWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks playTone:(BOOL)playTone;
+
+- (instancetype)initWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(BOOL)playTone softButtons:(NSArray<SDLSoftButton *> *)softButtons;
+
+- (instancetype)initWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(BOOL)playTone duration:(UInt16)duration softButtons:(NSArray<SDLSoftButton *> *)softButtons;
+
/**
* @abstract The String to be displayed in the first field of the display during the Alert
diff --git a/SmartDeviceLink/SDLAlert.m b/SmartDeviceLink/SDLAlert.m
index ddc7fdc3a..d5e11a12b 100644
--- a/SmartDeviceLink/SDLAlert.m
+++ b/SmartDeviceLink/SDLAlert.m
@@ -5,6 +5,9 @@
#import "SDLNames.h"
#import "SDLSoftButton.h"
#import "SDLTTSChunk.h"
+#import "SDLTTSChunkFactory.h"
+
+static UInt16 const SDLDefaultDuration = 5000;
@implementation SDLAlert
@@ -20,6 +23,60 @@
return self;
}
+- (instancetype)initWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 {
+ return [self initWithAlertText1:alertText1 alertText2:alertText2 alertText3:alertText3 duration:SDLDefaultDuration];
+}
+
+- (instancetype)initWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 duration:(UInt16)duration {
+ return [self initWithAlertText1:alertText1 alertText2:alertText2 alertText3:nil duration:duration];
+}
+
+- (instancetype)initWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 duration:(UInt16)duration {
+ return [self initWithAlertText1:alertText1 alertText2:alertText2 alertText3:alertText3 duration:duration softButtons:nil];
+}
+
+- (instancetype)initWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 duration:(UInt16)duration softButtons:(NSArray<SDLSoftButton *> *)softButtons {
+ return [self initWithTTSChunks:nil alertText1:alertText1 alertText2:alertText2 alertText3:alertText3 playTone:NO duration:duration softButtons:softButtons];
+}
+
+- (instancetype)initWithTTS:(NSString *)ttsText playTone:(BOOL)playTone {
+ return [self initWithTTS:ttsText alertText1:nil alertText2:nil playTone:playTone duration:SDLDefaultDuration];
+}
+
+- (instancetype)initWithTTS:(NSString *)ttsText alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 playTone:(BOOL)playTone duration:(UInt16)duration {
+ return [self initWithTTS:ttsText alertText1:alertText1 alertText2:alertText2 alertText3:nil playTone:playTone duration:duration];
+}
+
+- (instancetype)initWithTTS:(NSString *)ttsText alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(BOOL)playTone duration:(UInt16)duration {
+ NSMutableArray *ttsChunks = [SDLTTSChunk textChunksFromString:ttsText];
+ return [self initWithTTSChunks:ttsChunks alertText1:alertText1 alertText2:alertText2 alertText3:alertText3 playTone:playTone duration:duration softButtons:nil];
+}
+
+- (instancetype)initWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks playTone:(BOOL)playTone {
+ return [self initWithTTSChunks:ttsChunks alertText1:nil alertText2:nil alertText3:nil playTone:playTone duration:SDLDefaultDuration softButtons:nil];
+}
+
+- (instancetype)initWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(BOOL)playTone softButtons:(NSArray<SDLSoftButton *> *)softButtons {
+ return [self initWithTTSChunks:ttsChunks alertText1:alertText1 alertText2:alertText2 alertText3:alertText3 playTone:playTone duration:SDLDefaultDuration softButtons:softButtons];
+}
+
+- (instancetype)initWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(BOOL)playTone duration:(UInt16)duration softButtons:(NSArray<SDLSoftButton *> *)softButtons {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.ttsChunks = [ttsChunks mutableCopy];
+ self.alertText1 = alertText1;
+ self.alertText2 = alertText2;
+ self.alertText3 = alertText3;
+ self.playTone = @(playTone);
+ self.duration = @(duration);
+ self.softButtons = [softButtons mutableCopy];
+
+ return self;
+}
+
- (void)setAlertText1:(NSString *)alertText1 {
if (alertText1 != nil) {
[parameters setObject:alertText1 forKey:NAMES_alertText1];
diff --git a/SmartDeviceLink/SDLAlertManeuver.h b/SmartDeviceLink/SDLAlertManeuver.h
index 2bb8e12ed..d3ac7a8ed 100644
--- a/SmartDeviceLink/SDLAlertManeuver.h
+++ b/SmartDeviceLink/SDLAlertManeuver.h
@@ -4,6 +4,10 @@
#import "SDLRPCRequest.h"
+@class SDLSoftButton;
+@class SDLTTSChunk;
+
+
/**
* @since SmartDeviceLink 1.0
*/
@@ -13,6 +17,9 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithTTS:(NSString *)ttsText softButtons:(NSArray<SDLSoftButton *> *)softButtons;
+- (instancetype)initWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks softButtons:(NSArray<SDLSoftButton *> *)softButtons;
+
@property (strong) NSMutableArray *ttsChunks;
@property (strong) NSMutableArray *softButtons;
diff --git a/SmartDeviceLink/SDLAlertManeuver.m b/SmartDeviceLink/SDLAlertManeuver.m
index 81717506f..a3e6899b9 100644
--- a/SmartDeviceLink/SDLAlertManeuver.m
+++ b/SmartDeviceLink/SDLAlertManeuver.m
@@ -7,6 +7,7 @@
#import "SDLNames.h"
#import "SDLSoftButton.h"
#import "SDLTTSChunk.h"
+#import "SDLTTSChunkFactory.h"
@implementation SDLAlertManeuver
@@ -22,6 +23,23 @@
return self;
}
+- (instancetype)initWithTTS:(NSString *)ttsText softButtons:(NSArray<SDLSoftButton *> *)softButtons {
+ NSMutableArray *ttsChunks = [SDLTTSChunk textChunksFromString:ttsText];
+ return [self initWithTTSChunks:ttsChunks softButtons:softButtons];
+}
+
+- (instancetype)initWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks softButtons:(NSArray<SDLSoftButton *> *)softButtons {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.ttsChunks = [ttsChunks mutableCopy];
+ self.softButtons = [softButtons mutableCopy];
+
+ return self;
+}
+
- (void)setTtsChunks:(NSMutableArray *)ttsChunks {
if (ttsChunks != nil) {
[parameters setObject:ttsChunks forKey:NAMES_ttsChunks];
diff --git a/SmartDeviceLink/SDLAppInfo.h b/SmartDeviceLink/SDLAppInfo.h
index 414ee074e..c08fba9fd 100644
--- a/SmartDeviceLink/SDLAppInfo.h
+++ b/SmartDeviceLink/SDLAppInfo.h
@@ -5,6 +5,8 @@
@interface SDLAppInfo : SDLRPCStruct
++ (instancetype)currentAppInfo;
+
@property (strong) NSString *appDisplayName;
@property (strong) NSString *appBundleID;
@property (strong) NSString *appVersion;
diff --git a/SmartDeviceLink/SDLAppInfo.m b/SmartDeviceLink/SDLAppInfo.m
index 7318187bf..968bbf6e7 100644
--- a/SmartDeviceLink/SDLAppInfo.m
+++ b/SmartDeviceLink/SDLAppInfo.m
@@ -4,8 +4,24 @@
#import "SDLAppInfo.h"
#import "SDLNames.h"
+static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionString";
+static NSString *const SDLBundleAppNameKey = @"CFBundleName";
+
@implementation SDLAppInfo
++ (instancetype)currentAppInfo {
+ static SDLAppInfo *appInfo = nil;
+ if (appInfo == nil) {
+ appInfo = [[SDLAppInfo alloc] init];
+ NSBundle *mainBundle = [NSBundle mainBundle];
+ NSDictionary *bundleDictionary = mainBundle.infoDictionary;
+ appInfo.appDisplayName = bundleDictionary[SDLBundleAppNameKey];
+ appInfo.appVersion = bundleDictionary[SDLBundleShortVersionStringKey];
+ appInfo.appBundleID = mainBundle.bundleIdentifier;
+ }
+ return appInfo;
+}
+
- (void)setAppDisplayName:(NSString *)appDisplayName {
if (appDisplayName != nil) {
[store setObject:appDisplayName forKey:NAMES_appDisplayName];
diff --git a/SmartDeviceLink/SDLArtwork.h b/SmartDeviceLink/SDLArtwork.h
new file mode 100644
index 000000000..9bbd81cb9
--- /dev/null
+++ b/SmartDeviceLink/SDLArtwork.h
@@ -0,0 +1,70 @@
+//
+// SDLArtwork.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/15/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+@import UIKit;
+
+#import "SDLFile.h"
+
+typedef NS_ENUM(NSUInteger, SDLArtworkImageFormat) {
+ SDLArtworkImageFormatPNG,
+ SDLArtworkImageFormatJPG
+};
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLArtwork : SDLFile
+
+/**
+ * Convenience Helper to create an ephemeral artwork from an image.
+ *
+ * This is an ephemeral file, it will not be persisted through sessions / ignition cycles. Any files that you do not *know* you will use in future sessions should be created through this method. For example, album / artist artwork should be ephemeral.
+ *
+ * Persistent files should be created using `persistentArtworkWithImage:name:asImageFormat:`
+ *
+ * @warning It is strongly recommended to pass the file url using an SDLFile initializer instead of the image. If you pass the UIImage, it is loaded into memory, and will be dumped to a temporary file. This will create a duplicate file. *Only pass a UIImage if the image is not stored on disk*.
+ *
+ * @param image The UIImage to be sent to the remote head unit
+ * @param name The name of the file that will be used to reference the file in the future (for example on the remote file system).
+ * @param imageFormat Whether the image should be converted to a PNG or JPG before transmission. Images with transparency or few colors should be PNGs. Images with many colors should be JPGs.
+ *
+ * @return An instance of this class to be passed to the file manager.
+ */
++ (instancetype)artworkWithImage:(UIImage *)image name:(NSString *)name asImageFormat:(SDLArtworkImageFormat)imageFormat;
+
+/**
+ * Convenience Helper to create a persistent artwork from an image.
+ *
+ * This is a persistent file, it will be persisted through sessions / ignition cycles. You will only have a limited space for all files, so be sure to only persist files that are required for all or most sessions. For example, menu artwork should be persistent.
+ *
+ * Ephemeral files should be created using `ephemeralArtworkWithImage:name:asImageFormat:`
+ *
+ * @warning It is strongly recommended to pass the file url using an SDLFile initializer instead of the image. If you pass the UIImage, it is loaded into memory, and will be dumped to a temporary file. This will create a duplicate file. *Only pass a UIImage if the image is not stored on disk*.
+ *
+ * @param image The UIImage to be sent to the remote head unit
+ * @param name The name of the file that will be used to reference the file in the future (for example on the remote file system).
+ * @param imageFormat Whether the image should be converted to a PNG or JPG before transmission. Images with transparency or few colors should be PNGs. Images with many colors should be JPGs.
+ *
+ * @return An instance of this class to be passed to the file manager.
+ */
++ (instancetype)persistentArtworkWithImage:(UIImage *)image name:(NSString *)name asImageFormat:(SDLArtworkImageFormat)imageFormat;
+
+/**
+ * Create a file for transmission to the remote system from a UIImage.
+ *
+ * @param image The UIImage to be sent to the remote head unit
+ * @param name The name of the file that will be used to reference the file in the future (for example on the remote file system).
+ * @param persistent Whether or not the artwork should be persistent.
+ * @param imageFormat Whether the image should be converted to a PNG or JPG before transmission. Images with transparency or few colors should be PNGs. Images with many colors should be JPGs.
+ *
+ * @return An instance of this class to be passed to the file manager.
+ */
+- (instancetype)initWithImage:(UIImage *)image name:(NSString *)name persistent:(BOOL)persistent asImageFormat:(SDLArtworkImageFormat)imageFormat;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLArtwork.m b/SmartDeviceLink/SDLArtwork.m
new file mode 100644
index 000000000..5cd877bc0
--- /dev/null
+++ b/SmartDeviceLink/SDLArtwork.m
@@ -0,0 +1,58 @@
+//
+// SDLArtwork.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/15/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLArtwork.h"
+
+#import "SDLFileType.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLArtwork ()
+
+@property (strong, nonatomic) UIImage *image;
+
+@end
+
+
+@implementation SDLArtwork
+
+#pragma mark - Lifecycle
+
++ (instancetype)artworkWithImage:(UIImage *)image name:(NSString *)name asImageFormat:(SDLArtworkImageFormat)imageFormat {
+ return [[self alloc] initWithImage:image name:name persistent:NO asImageFormat:imageFormat];
+}
+
++ (instancetype)persistentArtworkWithImage:(UIImage *)image name:(NSString *)name asImageFormat:(SDLArtworkImageFormat)imageFormat {
+ return [[self alloc] initWithImage:image name:name persistent:YES asImageFormat:imageFormat];
+}
+
+
+#pragma Private Lifecycle
+
+- (instancetype)initWithImage:(UIImage *)image name:(NSString *)name persistent:(BOOL)persistent asImageFormat:(SDLArtworkImageFormat)imageFormat {
+ NSData *imageData = nil;
+ NSString *fileExtension = nil;
+
+ switch (imageFormat) {
+ case SDLArtworkImageFormatPNG: {
+ imageData = UIImagePNGRepresentation(image);
+ fileExtension = @"png";
+ } break;
+ case SDLArtworkImageFormatJPG: {
+ imageData = UIImageJPEGRepresentation(image, 0.85);
+ fileExtension = @"jpg";
+ } break;
+ }
+
+ return [super initWithData:imageData name:name fileExtension:fileExtension persistent:persistent];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLAsynchronousOperation.h b/SmartDeviceLink/SDLAsynchronousOperation.h
new file mode 100644
index 000000000..f090aea40
--- /dev/null
+++ b/SmartDeviceLink/SDLAsynchronousOperation.h
@@ -0,0 +1,15 @@
+//
+// SDLAsychronousOperation.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 8/25/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface SDLAsynchronousOperation : NSOperation
+
+- (void)finishOperation;
+
+@end
diff --git a/SmartDeviceLink/SDLAsynchronousOperation.m b/SmartDeviceLink/SDLAsynchronousOperation.m
new file mode 100644
index 000000000..bb49f1c1e
--- /dev/null
+++ b/SmartDeviceLink/SDLAsynchronousOperation.m
@@ -0,0 +1,53 @@
+//
+// SDLAsychronousOperation.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 8/25/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLAsynchronousOperation.h"
+
+@implementation SDLAsynchronousOperation {
+ BOOL executing;
+ BOOL finished;
+}
+
+- (void)start {
+ if (self.isCancelled) {
+ [self willChangeValueForKey:@"isFinished"];
+ finished = YES;
+ [self didChangeValueForKey:@"isFinished"];
+
+ return;
+ }
+
+ [self willChangeValueForKey:@"isExecuting"];
+ executing = YES;
+ [self didChangeValueForKey:@"isExecuting"];
+}
+
+- (void)finishOperation {
+ [self willChangeValueForKey:@"isExecuting"];
+ [self willChangeValueForKey:@"isFinished"];
+ executing = NO;
+ finished = YES;
+ [self didChangeValueForKey:@"isFinished"];
+ [self didChangeValueForKey:@"isExecuting"];
+}
+
+#pragma mark - Property Overrides
+
+- (BOOL)isAsynchronous {
+ return YES;
+}
+
+- (BOOL)isExecuting {
+ return executing;
+}
+
+- (BOOL)isFinished {
+ return finished;
+}
+
+@end
diff --git a/SmartDeviceLink/SDLChangeRegistration.h b/SmartDeviceLink/SDLChangeRegistration.h
index 4bbc7c234..194c525da 100644
--- a/SmartDeviceLink/SDLChangeRegistration.h
+++ b/SmartDeviceLink/SDLChangeRegistration.h
@@ -29,6 +29,10 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithLanguage:(SDLLanguage *)language hmiDisplayLanguage:(SDLLanguage *)hmiDisplayLanguage;
+
+- (instancetype)initWithLanguage:(SDLLanguage *)language hmiDisplayLanguage:(SDLLanguage *)hmiDisplayLanguage appName:(NSString *)appName ttsName:(NSArray<SDLTTSChunk *> *)ttsName ngnMediaScreenAppName:(NSString *)ngnMediaScreenAppName vrSynonyms:(NSArray<NSString *> *)vrSynonyms;
+
/**
* @abstract The language the app wants to change to
*/
diff --git a/SmartDeviceLink/SDLChangeRegistration.m b/SmartDeviceLink/SDLChangeRegistration.m
index 00a7de885..3a5c8051b 100644
--- a/SmartDeviceLink/SDLChangeRegistration.m
+++ b/SmartDeviceLink/SDLChangeRegistration.m
@@ -21,6 +21,31 @@
return self;
}
+- (instancetype)initWithLanguage:(SDLLanguage *)language hmiDisplayLanguage:(SDLLanguage *)hmiDisplayLanguage {
+ self = [self initWithLanguage:language hmiDisplayLanguage:hmiDisplayLanguage appName:nil ttsName:nil ngnMediaScreenAppName:nil vrSynonyms:nil];
+ if (!self) {
+ return nil;
+ }
+
+ return self;
+}
+
+- (instancetype)initWithLanguage:(SDLLanguage *)language hmiDisplayLanguage:(SDLLanguage *)hmiDisplayLanguage appName:(NSString *)appName ttsName:(NSArray *)ttsName ngnMediaScreenAppName:(NSString *)ngnMediaScreenAppName vrSynonyms:(NSArray *)vrSynonyms {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.language = language;
+ self.hmiDisplayLanguage = hmiDisplayLanguage;
+ self.appName = appName;
+ self.ttsName = ttsName;
+ self.ngnMediaScreenAppName = ngnMediaScreenAppName;
+ self.vrSynonyms = vrSynonyms;
+
+ return self;
+}
+
- (void)setLanguage:(SDLLanguage *)language {
if (language != nil) {
[parameters setObject:language forKey:NAMES_language];
diff --git a/SmartDeviceLink/SDLChoice.h b/SmartDeviceLink/SDLChoice.h
index 478b33b5f..d084ab33e 100644
--- a/SmartDeviceLink/SDLChoice.h
+++ b/SmartDeviceLink/SDLChoice.h
@@ -64,6 +64,10 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithId:(UInt16)choiceId menuName:(NSString *)menuName vrCommands:(NSArray *)vrCommands;
+
+- (instancetype)initWithId:(UInt16)choiceId menuName:(NSString *)menuName vrCommands:(NSArray *)vrCommands image:(SDLImage *)image secondaryText:(NSString *)secondaryText secondaryImage:(SDLImage *)secondaryImage tertiaryText:(NSString *)tertiaryText;
+
/**
* @abstract the application-scoped identifier that uniquely identifies this choice
*
diff --git a/SmartDeviceLink/SDLChoice.m b/SmartDeviceLink/SDLChoice.m
index 83e1d56ae..3195ddd9f 100644
--- a/SmartDeviceLink/SDLChoice.m
+++ b/SmartDeviceLink/SDLChoice.m
@@ -21,6 +21,33 @@
return self;
}
+- (instancetype)initWithId:(UInt16)choiceId menuName:(NSString *)menuName vrCommands:(NSArray *)vrCommands image:(SDLImage *)image secondaryText:(NSString *)secondaryText secondaryImage:(SDLImage *)secondaryImage tertiaryText:(NSString *)tertiaryText {
+ self = [self initWithId:choiceId menuName:menuName vrCommands:vrCommands];
+ if (!self) {
+ return nil;
+ }
+
+ self.image = image;
+ self.secondaryText = secondaryText;
+ self.secondaryImage = secondaryImage;
+ self.tertiaryText = tertiaryText;
+
+ return self;
+}
+
+- (instancetype)initWithId:(UInt16)choiceId menuName:(NSString *)menuName vrCommands:(NSArray *)vrCommands {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.choiceID = @(choiceId);
+ self.menuName = menuName;
+ self.vrCommands = [vrCommands mutableCopy];
+
+ return self;
+}
+
- (void)setChoiceID:(NSNumber *)choiceID {
if (choiceID != nil) {
[store setObject:choiceID forKey:NAMES_choiceID];
diff --git a/SmartDeviceLink/SDLConfiguration.h b/SmartDeviceLink/SDLConfiguration.h
new file mode 100644
index 000000000..ad3a8cb95
--- /dev/null
+++ b/SmartDeviceLink/SDLConfiguration.h
@@ -0,0 +1,50 @@
+//
+// SDLConfiguration.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/13/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLLifecycleConfiguration;
+@class SDLLockScreenConfiguration;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLConfiguration : NSObject <NSCopying>
+
+/**
+ * The lifecycle configuration.
+ */
+@property (copy, nonatomic, readonly) SDLLifecycleConfiguration *lifecycleConfig;
+
+/**
+ * The lock screen configuration.
+ */
+@property (copy, nonatomic, readonly) SDLLockScreenConfiguration *lockScreenConfig;
+
+/**
+ * Create a new configuration to be passed into SDLManager.
+ *
+ * @param lifecycleConfig The lifecycle configuration to be used.
+ * @param lockScreenConfig The lockscreen configuration to be used. If nil, this will be `enabledConfiguration`.
+ *
+ * @return The configuration
+ */
+- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(SDLLockScreenConfiguration *)lockScreenConfig;
+
+/**
+ * Create a new configuration to be passed into SDLManager.
+ *
+ * @param lifecycleConfig The lifecycle configuration to be used.
+ * @param lockScreenConfig The lockscreen configuration to be used. If nil, this will be `enabledConfiguration`.
+ *
+ * @return The configuration
+ */
++ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(SDLLockScreenConfiguration *)lockScreenConfig;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLConfiguration.m b/SmartDeviceLink/SDLConfiguration.m
new file mode 100644
index 000000000..3ad25dbd8
--- /dev/null
+++ b/SmartDeviceLink/SDLConfiguration.m
@@ -0,0 +1,42 @@
+//
+// SDLConfiguration.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/13/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLConfiguration.h"
+
+#import "SDLLifecycleConfiguration.h"
+#import "SDLLockScreenConfiguration.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLConfiguration
+
+- (instancetype)initWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(SDLLockScreenConfiguration *)lockScreenConfig {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _lifecycleConfig = lifecycleConfig;
+ _lockScreenConfig = lockScreenConfig;
+
+ return self;
+}
+
++ (instancetype)configurationWithLifecycle:(SDLLifecycleConfiguration *)lifecycleConfig lockScreen:(SDLLockScreenConfiguration *)lockScreenConfig {
+ return [[self alloc] initWithLifecycle:lifecycleConfig lockScreen:lockScreenConfig];
+}
+
+- (id)copyWithZone:(nullable NSZone *)zone {
+ SDLConfiguration *new = [[SDLConfiguration allocWithZone:zone] initWithLifecycle : _lifecycleConfig lockScreen : _lockScreenConfig];
+
+ return new;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLConnectionManagerType.h b/SmartDeviceLink/SDLConnectionManagerType.h
new file mode 100644
index 000000000..5f2e03a39
--- /dev/null
+++ b/SmartDeviceLink/SDLConnectionManagerType.h
@@ -0,0 +1,29 @@
+//
+// SDLConnectionManagerType.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/21/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLNotificationConstants.h"
+#import <Foundation/Foundation.h>
+
+@class SDLRPCRequest;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol SDLConnectionManagerType <NSObject>
+
+/**
+ * A special method on the connection manager which is used by managers that must bypass the default block on RPC sends before managers complete setup.
+ *
+ * @param request The RPC request to be sent to the remote head unit.
+ * @param handler A completion block called when the response is received.
+ */
+- (void)sendManagerRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLConsoleController.m b/SmartDeviceLink/SDLConsoleController.m
index bf7f600ec..ade1c17df 100644
--- a/SmartDeviceLink/SDLConsoleController.m
+++ b/SmartDeviceLink/SDLConsoleController.m
@@ -190,7 +190,7 @@
alertText = [NSString stringWithFormat:@"%@", [obj description]];
}
- UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"RPCMessage" message:alertText delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
+ UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"RPCMessage", nil) message:alertText delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
alertView = nil;
diff --git a/SmartDeviceLink/SDLCreateInteractionChoiceSet.h b/SmartDeviceLink/SDLCreateInteractionChoiceSet.h
index 721f505d7..18d910728 100644
--- a/SmartDeviceLink/SDLCreateInteractionChoiceSet.h
+++ b/SmartDeviceLink/SDLCreateInteractionChoiceSet.h
@@ -4,6 +4,8 @@
#import "SDLRPCRequest.h"
+@class SDLChoice;
+
/**
* Creates a Choice Set which can be used in subsequent *SDLPerformInteraction* Operations.
*
@@ -32,6 +34,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithId:(UInt32)choiceId choiceSet:(NSArray<SDLChoice *> *)choiceSet;
+
/**
* @abstract A unique ID that identifies the Choice Set
*
diff --git a/SmartDeviceLink/SDLCreateInteractionChoiceSet.m b/SmartDeviceLink/SDLCreateInteractionChoiceSet.m
index 32324d46e..25539d8ea 100644
--- a/SmartDeviceLink/SDLCreateInteractionChoiceSet.m
+++ b/SmartDeviceLink/SDLCreateInteractionChoiceSet.m
@@ -21,6 +21,17 @@
return self;
}
+- (instancetype)initWithId:(UInt32)choiceId choiceSet:(NSArray *)choiceSet {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.interactionChoiceSetID = @(choiceId);
+ self.choiceSet = [choiceSet mutableCopy];
+ return self;
+}
+
- (void)setInteractionChoiceSetID:(NSNumber *)interactionChoiceSetID {
if (interactionChoiceSetID != nil) {
[parameters setObject:interactionChoiceSetID forKey:NAMES_interactionChoiceSetID];
diff --git a/SmartDeviceLink/SDLDebugTool.h b/SmartDeviceLink/SDLDebugTool.h
index 0e487303b..98ddc6c77 100644
--- a/SmartDeviceLink/SDLDebugTool.h
+++ b/SmartDeviceLink/SDLDebugTool.h
@@ -28,11 +28,14 @@ typedef NS_ENUM(UInt8, SDLDebugOutput) {
@interface SDLDebugTool : NSObject {
}
++ (void)enable;
++ (void)disable;
+ (void)addConsole:(NSObject<SDLDebugToolConsole> *)console;
+ (void)addConsole:(NSObject<SDLDebugToolConsole> *)console toGroup:(NSString *)groupName;
+ (void)removeConsole:(NSObject<SDLDebugToolConsole> *)console;
+ (void)removeConsole:(NSObject<SDLDebugToolConsole> *)console fromGroup:(NSString *)groupName;
+ (void)logInfo:(NSString *)info;
++ (void)logFormat:(NSString *)info, ...;
+ (void)logInfo:(NSString *)info withType:(SDLDebugType)type;
+ (void)logInfo:(NSString *)info withType:(SDLDebugType)type toOutput:(SDLDebugOutput)output;
+ (void)logInfo:(NSString *)info andBinaryData:(NSData *)data withType:(SDLDebugType)type toOutput:(SDLDebugOutput)output;
diff --git a/SmartDeviceLink/SDLDebugTool.m b/SmartDeviceLink/SDLDebugTool.m
index 1f0312c9c..8bf8c7bda 100644
--- a/SmartDeviceLink/SDLDebugTool.m
+++ b/SmartDeviceLink/SDLDebugTool.m
@@ -7,10 +7,10 @@
#import "SDLRPCMessage.h"
#import "SDLSiphonServer.h"
-#define LOG_ERROR_ENABLED
@interface SDLDebugTool ()
+@property (nonatomic, assign) BOOL enabled;
@property (nonatomic, assign) BOOL debugToLogFile;
@property (nonatomic, strong) NSMutableDictionary *namedConsoleSets;
@property (nonatomic, strong) NSDateFormatter *logDateFormatter;
@@ -30,6 +30,7 @@
return nil;
}
+ _enabled = YES;
_debugToLogFile = NO;
_logQueue = dispatch_queue_create("com.sdl.log.file", DISPATCH_QUEUE_SERIAL);
@@ -40,12 +41,20 @@
static SDLDebugTool *sharedTool = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
- sharedTool = [[self.class alloc] init];
+ sharedTool = [[self alloc] init];
});
return sharedTool;
}
++ (void)enable {
+ [SDLDebugTool sharedTool].enabled = YES;
+}
+
++ (void)disable {
+ [SDLDebugTool sharedTool].enabled = NO;
+}
+
#pragma mark - Console Management
@@ -95,6 +104,14 @@
[self logInfo:info withType:SDLDebugType_Debug toOutput:SDLDebugOutput_All toGroup:@"default"];
}
++ (void)logFormat:(NSString *)info, ... {
+ va_list args;
+ va_start(args, info);
+
+ NSString *format = [[NSString alloc] initWithFormat:info arguments:args];
+ [self logInfo:format];
+}
+
+ (void)logInfo:(NSString *)info withType:(SDLDebugType)type {
[self logInfo:info withType:type toOutput:SDLDebugOutput_All toGroup:@"default"];
}
@@ -104,6 +121,10 @@
}
+ (void)logInfo:(NSString *)info andBinaryData:(NSData *)data withType:(SDLDebugType)type toOutput:(SDLDebugOutput)output {
+ if (![SDLDebugTool sharedTool].enabled) {
+ return;
+ }
+
// convert binary data to string, append the two strings, then pass to usual log method.
NSMutableString *outputString = [[NSMutableString alloc] init];
if (info) {
@@ -124,18 +145,22 @@
// The designated logInfo method. All outputs should be performed here.
+ (void)logInfo:(NSString *)info withType:(SDLDebugType)type toOutput:(SDLDebugOutput)output toGroup:(NSString *)consoleGroupName {
+ if (![SDLDebugTool sharedTool].enabled) {
+ return;
+ }
+
// Format the message, prepend the thread id
NSString *outputString = [NSString stringWithFormat:@"[%li] %@", (long)[[NSThread currentThread] threadIndex], info];
// Output to the various destinations
//Output To DeviceConsole
- if (output & SDLDebugOutput_DeviceConsole) {
+ if ((output & SDLDebugOutput_DeviceConsole) == SDLDebugOutput_DeviceConsole) {
NSLog(@"%@", outputString);
}
//Output To DebugToolConsoles
- if (output & SDLDebugOutput_DebugToolConsole) {
+ if ((output & SDLDebugOutput_DebugToolConsole) == SDLDebugOutput_DebugToolConsole) {
NSSet *consoleListeners = [self getConsoleListenersForGroup:consoleGroupName];
for (NSObject<SDLDebugToolConsole> *console in consoleListeners) {
[console logInfo:outputString];
@@ -143,7 +168,7 @@
}
//Output To LogFile
- if (output & SDLDebugOutput_File) {
+ if ((output & SDLDebugOutput_File) == SDLDebugOutput_File) {
[SDLDebugTool writeToLogFile:outputString];
}
diff --git a/SmartDeviceLink/SDLDeleteCommand.h b/SmartDeviceLink/SDLDeleteCommand.h
index 4f3b74d90..24adaa9cd 100644
--- a/SmartDeviceLink/SDLDeleteCommand.h
+++ b/SmartDeviceLink/SDLDeleteCommand.h
@@ -32,6 +32,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithId:(UInt32)commandId;
+
/**
* @abstract the Command ID that identifies the Command to be deleted from Command Menu
* @discussion an NSNumber value representing Command ID
diff --git a/SmartDeviceLink/SDLDeleteCommand.m b/SmartDeviceLink/SDLDeleteCommand.m
index 13c51d7ed..0f876e0ed 100644
--- a/SmartDeviceLink/SDLDeleteCommand.m
+++ b/SmartDeviceLink/SDLDeleteCommand.m
@@ -20,6 +20,17 @@
return self;
}
+- (instancetype)initWithId:(UInt32)commandId {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.cmdID = @(commandId);
+
+ return self;
+}
+
- (void)setCmdID:(NSNumber *)cmdID {
if (cmdID != nil) {
[parameters setObject:cmdID forKey:NAMES_cmdID];
diff --git a/SmartDeviceLink/SDLDeleteFile.h b/SmartDeviceLink/SDLDeleteFile.h
index 325782673..b0b1295ff 100644
--- a/SmartDeviceLink/SDLDeleteFile.h
+++ b/SmartDeviceLink/SDLDeleteFile.h
@@ -27,6 +27,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithFileName:(NSString *)fileName;
+
/**
* @abstract a file reference name
* @discussion a String value representing a file reference name
diff --git a/SmartDeviceLink/SDLDeleteFile.m b/SmartDeviceLink/SDLDeleteFile.m
index d7a4c18b2..188a2ef1f 100644
--- a/SmartDeviceLink/SDLDeleteFile.m
+++ b/SmartDeviceLink/SDLDeleteFile.m
@@ -20,6 +20,17 @@
return self;
}
+- (instancetype)initWithFileName:(NSString *)fileName {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.syncFileName = fileName;
+
+ return self;
+}
+
- (void)setSyncFileName:(NSString *)syncFileName {
if (syncFileName != nil) {
[parameters setObject:syncFileName forKey:NAMES_syncFileName];
diff --git a/SmartDeviceLink/SDLDeleteFileOperation.h b/SmartDeviceLink/SDLDeleteFileOperation.h
new file mode 100644
index 000000000..78563c58f
--- /dev/null
+++ b/SmartDeviceLink/SDLDeleteFileOperation.h
@@ -0,0 +1,34 @@
+//
+// SDLDeleteFileOperation.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 5/11/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLAsynchronousOperation.h"
+#import "SDLFileManagerConstants.h"
+
+@protocol SDLConnectionManagerType;
+
+
+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;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLDeleteFileOperation.m b/SmartDeviceLink/SDLDeleteFileOperation.m
new file mode 100644
index 000000000..7ebecffa5
--- /dev/null
+++ b/SmartDeviceLink/SDLDeleteFileOperation.m
@@ -0,0 +1,80 @@
+//
+// SDLDeleteFileOperation.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 5/11/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLDeleteFileOperation.h"
+
+#import "SDLConnectionManagerType.h"
+#import "SDLDeleteFile.h"
+#import "SDLDeleteFileResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLDeleteFileOperation ()
+
+@property (copy, nonatomic) NSString *fileName;
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (copy, nonatomic, nullable) SDLFileManagerDeleteCompletionHandler completionHandler;
+
+@end
+
+
+@implementation SDLDeleteFileOperation
+
+- (instancetype)initWithFileName:(NSString *)fileName connectionManager:(id<SDLConnectionManagerType>)connectionManager completionHandler:(nullable SDLFileManagerDeleteCompletionHandler)completionHandler {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _fileName = fileName;
+ _connectionManager = connectionManager;
+ _completionHandler = completionHandler;
+
+ return self;
+}
+
+- (void)start {
+ [super start];
+
+ [self sdl_deleteFile];
+}
+
+- (void)sdl_deleteFile {
+ SDLDeleteFile *deleteFile = [[SDLDeleteFile alloc] initWithFileName:self.fileName];
+
+ typeof(self) weakself = self;
+ [self.connectionManager sendManagerRequest:deleteFile
+ withResponseHandler:^(__kindof SDLRPCRequest *request, __kindof SDLRPCResponse *response, NSError *error) {
+ // Pull out the parameters
+ SDLDeleteFileResponse *deleteFileResponse = (SDLDeleteFileResponse *)response;
+ BOOL success = [deleteFileResponse.success boolValue];
+ NSUInteger bytesAvailable = [deleteFileResponse.spaceAvailable unsignedIntegerValue];
+
+ // Callback
+ if (weakself.completionHandler != nil) {
+ weakself.completionHandler(success, bytesAvailable, error);
+ }
+
+ [weakself finishOperation];
+ }];
+}
+
+
+#pragma mark Property Overrides
+
+- (nullable NSString *)name {
+ return self.fileName;
+}
+
+- (NSOperationQueuePriority)queuePriority {
+ return NSOperationQueuePriorityVeryHigh;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLDeleteInteractionChoiceSet.h b/SmartDeviceLink/SDLDeleteInteractionChoiceSet.h
index 28058064b..74acae89d 100644
--- a/SmartDeviceLink/SDLDeleteInteractionChoiceSet.h
+++ b/SmartDeviceLink/SDLDeleteInteractionChoiceSet.h
@@ -34,6 +34,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithId:(UInt32)choiceId;
+
/**
* @abstract a unique ID that identifies the Choice Set
* @discussion a unique ID that identifies the Choice Set
diff --git a/SmartDeviceLink/SDLDeleteInteractionChoiceSet.m b/SmartDeviceLink/SDLDeleteInteractionChoiceSet.m
index fd5d202b1..4fe99ae45 100644
--- a/SmartDeviceLink/SDLDeleteInteractionChoiceSet.m
+++ b/SmartDeviceLink/SDLDeleteInteractionChoiceSet.m
@@ -20,6 +20,17 @@
return self;
}
+- (instancetype)initWithId:(UInt32)choiceId {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.interactionChoiceSetID = @(choiceId);
+
+ return self;
+}
+
- (void)setInteractionChoiceSetID:(NSNumber *)interactionChoiceSetID {
if (interactionChoiceSetID != nil) {
[parameters setObject:interactionChoiceSetID forKey:NAMES_interactionChoiceSetID];
diff --git a/SmartDeviceLink/SDLDeleteSubMenu.h b/SmartDeviceLink/SDLDeleteSubMenu.h
index 37c2dc544..a7d8aa5ad 100644
--- a/SmartDeviceLink/SDLDeleteSubMenu.h
+++ b/SmartDeviceLink/SDLDeleteSubMenu.h
@@ -29,6 +29,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithId:(UInt32)menuId;
+
/**
* @abstract the MenuID that identifies the SDLSubMenu to be delete
* @discussion <b>Notes: </b>Min Value: 0; Max Value: 2000000000
diff --git a/SmartDeviceLink/SDLDeleteSubMenu.m b/SmartDeviceLink/SDLDeleteSubMenu.m
index 8727f44d3..e3eed71a4 100644
--- a/SmartDeviceLink/SDLDeleteSubMenu.m
+++ b/SmartDeviceLink/SDLDeleteSubMenu.m
@@ -20,6 +20,17 @@
return self;
}
+- (instancetype)initWithId:(UInt32)menuId {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.menuID = @(menuId);
+
+ return self;
+}
+
- (void)setMenuID:(NSNumber *)menuID {
if (menuID != nil) {
[parameters setObject:menuID forKey:NAMES_menuID];
diff --git a/SmartDeviceLink/SDLDeviceInfo.h b/SmartDeviceLink/SDLDeviceInfo.h
index 1bcbdaa27..b2ab1423c 100644
--- a/SmartDeviceLink/SDLDeviceInfo.h
+++ b/SmartDeviceLink/SDLDeviceInfo.h
@@ -10,6 +10,8 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
++ (instancetype)currentDevice;
+
@property (strong) NSString *hardware;
@property (strong) NSString *firmwareRev;
@property (strong) NSString *os;
diff --git a/SmartDeviceLink/SDLDeviceInfo.m b/SmartDeviceLink/SDLDeviceInfo.m
index 134aea629..a91e04935 100644
--- a/SmartDeviceLink/SDLDeviceInfo.m
+++ b/SmartDeviceLink/SDLDeviceInfo.m
@@ -3,8 +3,11 @@
#import "SDLDeviceInfo.h"
-#import "SDLNames.h"
+#import <CoreTelephony/CTCarrier.h>
+#import <CoreTelephony/CTTelephonyNetworkInfo.h>
+#import <UIKit/UIKit.h>
+#import "SDLNames.h"
@implementation SDLDeviceInfo
@@ -20,6 +23,21 @@
return self;
}
++ (instancetype)currentDevice {
+ static SDLDeviceInfo *deviceInfo = nil;
+ if (deviceInfo == nil) {
+ deviceInfo = [[SDLDeviceInfo alloc] init];
+ deviceInfo.hardware = [UIDevice currentDevice].model;
+ deviceInfo.os = [UIDevice currentDevice].systemName;
+ deviceInfo.osVersion = [UIDevice currentDevice].systemVersion;
+ CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
+ CTCarrier *carrier = netinfo.subscriberCellularProvider;
+ NSString *carrierName = carrier.carrierName;
+ deviceInfo.carrier = carrierName;
+ }
+ return deviceInfo;
+}
+
- (void)setHardware:(NSString *)hardware {
if (hardware != nil) {
[store setObject:hardware forKey:NAMES_hardware];
diff --git a/SmartDeviceLink/SDLDiagnosticMessage.h b/SmartDeviceLink/SDLDiagnosticMessage.h
index 40ca013f2..bdce4110d 100644
--- a/SmartDeviceLink/SDLDiagnosticMessage.h
+++ b/SmartDeviceLink/SDLDiagnosticMessage.h
@@ -15,6 +15,8 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithTargetId:(UInt16)targetId length:(UInt16)length data:(NSArray<NSNumber<SDLInt> *> *)data;
+
/**
* Name of target ECU
*
diff --git a/SmartDeviceLink/SDLDiagnosticMessage.m b/SmartDeviceLink/SDLDiagnosticMessage.m
index 8a45a8650..c92f17f90 100644
--- a/SmartDeviceLink/SDLDiagnosticMessage.m
+++ b/SmartDeviceLink/SDLDiagnosticMessage.m
@@ -20,6 +20,19 @@
return self;
}
+- (instancetype)initWithTargetId:(UInt16)targetId length:(UInt16)length data:(NSArray *)data {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.targetID = @(targetId);
+ self.messageLength = @(length);
+ self.messageData = [data mutableCopy];
+
+ return self;
+}
+
- (void)setTargetID:(NSNumber *)targetID {
if (targetID != nil) {
[parameters setObject:targetID forKey:NAMES_targetID];
diff --git a/SmartDeviceLink/SDLDialNumber.h b/SmartDeviceLink/SDLDialNumber.h
index 48cca6a6d..e04ccfb37 100644
--- a/SmartDeviceLink/SDLDialNumber.h
+++ b/SmartDeviceLink/SDLDialNumber.h
@@ -14,6 +14,8 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithNumber:(NSString *)number;
+
/**
* Up to 40 character string representing the phone number. All characters stripped except for '0'-'9', '*', '#', ',', ';', and '+'
*/
diff --git a/SmartDeviceLink/SDLDialNumber.m b/SmartDeviceLink/SDLDialNumber.m
index 856f9ad75..95b51e226 100644
--- a/SmartDeviceLink/SDLDialNumber.m
+++ b/SmartDeviceLink/SDLDialNumber.m
@@ -20,6 +20,17 @@
return self;
}
+- (instancetype)initWithNumber:(NSString *)number {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.number = number;
+
+ return self;
+}
+
- (void)setNumber:(NSString *)number {
if (number != nil) {
parameters[NAMES_number] = number;
diff --git a/SmartDeviceLink/SDLEnum.h b/SmartDeviceLink/SDLEnum.h
index bed0fffa3..c12c1ec97 100644
--- a/SmartDeviceLink/SDLEnum.h
+++ b/SmartDeviceLink/SDLEnum.h
@@ -5,7 +5,7 @@
#import <Foundation/Foundation.h>
-@interface SDLEnum : NSObject {
+@interface SDLEnum : NSObject <NSCopying> {
NSString *value;
}
diff --git a/SmartDeviceLink/SDLEnum.m b/SmartDeviceLink/SDLEnum.m
index f5ca2db2e..7a474437d 100644
--- a/SmartDeviceLink/SDLEnum.m
+++ b/SmartDeviceLink/SDLEnum.m
@@ -23,6 +23,9 @@
return value;
}
+
+#pragma mark - Equality
+
- (NSUInteger)hash {
return [self.value hash];
}
@@ -49,4 +52,11 @@
return NO;
}
+
+#pragma mark - NSCopying
+
+- (id)copyWithZone:(NSZone *)zone {
+ return [[self.class alloc] initWithValue:[self.value copy]];
+}
+
@end
diff --git a/SmartDeviceLink/SDLError.h b/SmartDeviceLink/SDLError.h
new file mode 100644
index 000000000..7572adc9a
--- /dev/null
+++ b/SmartDeviceLink/SDLError.h
@@ -0,0 +1,51 @@
+//
+// SDLErrorConstants.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/5/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLErrorConstants.h"
+
+@class SDLResult;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+#pragma mark Error Domains
+typedef NSString SDLErrorDomain;
+extern SDLErrorDomain *const SDLErrorDomainLifecycleManager;
+extern SDLErrorDomain *const SDLErrorDomainFileManager;
+
+@interface NSError (SDLErrors)
+
+#pragma mark SDLManager
+
++ (NSError *)sdl_lifecycle_rpcErrorWithDescription:(NSString *)description andReason:(NSString *)reason;
++ (NSError *)sdl_lifecycle_notConnectedError;
++ (NSError *)sdl_lifecycle_notReadyError;
++ (NSError *)sdl_lifecycle_unknownRemoteErrorWithDescription:(NSString *)description andReason:(NSString *)reason;
++ (NSError *)sdl_lifecycle_managersFailedToStart;
++ (NSError *)sdl_lifecycle_startedWithBadResult:(SDLResult *)result info:(NSString *)info;
++ (NSError *)sdl_lifecycle_failedWithBadResult:(SDLResult *)result info:(NSString *)info;
+
+#pragma mark SDLFileManager
+
++ (NSError *)sdl_fileManager_cannotOverwriteError;
++ (NSError *)sdl_fileManager_noKnownFileError;
++ (NSError *)sdl_fileManager_unableToStartError;
++ (NSError *)sdl_fileManager_unableToUploadError;
+
+@end
+
+@interface NSException (SDLExceptions)
+
++ (NSException *)sdl_missingHandlerException;
++ (NSException *)sdl_missingIdException;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLError.m b/SmartDeviceLink/SDLError.m
new file mode 100644
index 000000000..07d28878b
--- /dev/null
+++ b/SmartDeviceLink/SDLError.m
@@ -0,0 +1,157 @@
+//
+// SDLErrorConstants.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/5/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLError.h"
+
+#import "SDLResult.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+#pragma mark Error Domains
+
+SDLErrorDomain *const SDLErrorDomainLifecycleManager = @"com.sdl.lifecyclemanager.error";
+SDLErrorDomain *const SDLErrorDomainFileManager = @"com.sdl.filemanager.error";
+
+@implementation NSError (SDLErrors)
+
+#pragma mark - SDLManager
+
++ (NSError *)sdl_lifecycle_rpcErrorWithDescription:(NSString *)description andReason:(NSString *)reason {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: NSLocalizedString(description, nil),
+ NSLocalizedFailureReasonErrorKey: NSLocalizedString(reason, nil),
+ NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Have you tried turning it off and on again?", nil)
+ };
+ return [NSError errorWithDomain:SDLErrorDomainLifecycleManager
+ code:SDLManagerErrorRPCRequestFailed
+ userInfo:userInfo];
+}
+
++ (NSError *)sdl_lifecycle_notConnectedError {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: NSLocalizedString(@"Could not find a connection", nil),
+ NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The SDL library could not find a current connection to an SDL hardware device", nil),
+ NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Have you tried turning it off and on again?", nil)
+ };
+
+ return [NSError errorWithDomain:SDLErrorDomainLifecycleManager
+ code:SDLManagerErrorNotConnected
+ userInfo:userInfo];
+}
+
++ (NSError *)sdl_lifecycle_notReadyError {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: NSLocalizedString(@"Lifecycle manager not ready", nil),
+ NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The SDL library is not finished setting up the connection, please wait until the lifecycleState is SDLLifecycleStateReady", nil),
+ NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Have you tried turning it off and on again?", nil)
+ };
+
+ return [NSError errorWithDomain:SDLErrorDomainLifecycleManager
+ code:SDLManagerErrorNotConnected
+ userInfo:userInfo];
+}
+
++ (NSError *)sdl_lifecycle_unknownRemoteErrorWithDescription:(NSString *)description andReason:(NSString *)reason {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: NSLocalizedString(description, nil),
+ NSLocalizedFailureReasonErrorKey: NSLocalizedString(reason, nil),
+ NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Have you tried turning it off and on again?", nil)
+ };
+ return [NSError errorWithDomain:SDLErrorDomainLifecycleManager
+ code:SDLManagerErrorUnknownRemoteError
+ userInfo:userInfo];
+}
+
++ (NSError *)sdl_lifecycle_managersFailedToStart {
+ return [NSError errorWithDomain:SDLErrorDomainLifecycleManager
+ code:SDLManagerErrorManagersFailedToStart
+ userInfo:nil];
+}
+
++ (NSError *)sdl_lifecycle_startedWithBadResult:(SDLResult *)result info:(NSString *)info {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: NSLocalizedString(result.value, nil),
+ NSLocalizedFailureReasonErrorKey: NSLocalizedString(info, nil)
+ };
+ return [NSError errorWithDomain:SDLErrorDomainLifecycleManager
+ code:SDLManagerErrorRegistrationFailed
+ userInfo:userInfo];
+}
+
++ (NSError *)sdl_lifecycle_failedWithBadResult:(SDLResult *)result info:(NSString *)info {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: NSLocalizedString(result.value, nil),
+ NSLocalizedFailureReasonErrorKey: NSLocalizedString(info, nil)
+ };
+ return [NSError errorWithDomain:SDLErrorDomainLifecycleManager
+ code:SDLManagerErrorRegistrationFailed
+ userInfo:userInfo];
+}
+
+
+#pragma mark SDLFileManager
+
++ (NSError *)sdl_fileManager_cannotOverwriteError {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: NSLocalizedString(@"Cannot overwrite remote file", nil),
+ NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The remote file system already has a file of this name, and the file manager is set to not automatically overwrite files", nil),
+ NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Set SDLFileManager autoOverwrite to YES, or call forceUploadFile:completion:", nil)
+ };
+ return [NSError errorWithDomain:SDLErrorDomainFileManager code:SDLFileManagerErrorCannotOverwrite userInfo:userInfo];
+}
+
++ (NSError *)sdl_fileManager_noKnownFileError {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: NSLocalizedString(@"No such remote file is currently known", nil),
+ NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The remote file is not currently known by the file manager. It could be that this file does not exist on the remote system or that the file manager has not completed its initialization and received a list of files from the remote system.", nil),
+ NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Make sure a file with this name is present on the remote system and that the file manager has finished its initialization.", nil)
+ };
+ return [NSError errorWithDomain:SDLErrorDomainFileManager code:SDLFileManagerErrorNoKnownFile userInfo:userInfo];
+}
+
++ (NSError *)sdl_fileManager_unableToStartError {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: NSLocalizedString(@"The file manager was unable to start", nil),
+ NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"This may be because files are not supported on this unit and / or LISTFILES returned an error", nil),
+ NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Make sure that the system is sending back a proper LIST FILES response", nil)
+ };
+ return [NSError errorWithDomain:SDLErrorDomainFileManager code:SDLFileManagerErrorUnableToStart userInfo:userInfo];
+}
+
++ (NSError *)sdl_fileManager_unableToUploadError {
+ NSDictionary *userInfo = @{
+ NSLocalizedDescriptionKey: NSLocalizedString(@"The file manager was unable to send this file", nil),
+ NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"This could be because the file manager has not started, or the head unit does not support files", nil),
+ NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Make sure that the system is sending back a proper LIST FILES response and check the file manager's state", nil)
+ };
+ return [NSError errorWithDomain:SDLErrorDomainFileManager code:SDLFileManagerErrorUnableToUpload userInfo:userInfo];
+}
+
+@end
+
+
+@implementation NSException (SDLExceptions)
+
++ (NSException *)sdl_missingHandlerException {
+ return [NSException
+ exceptionWithName:@"MissingHandlerException"
+ reason:@"This request requires a handler to be specified using the <RPC>WithHandler class"
+ userInfo:nil];
+}
+
++ (NSException *)sdl_missingIdException {
+ return [NSException
+ exceptionWithName:@"MissingIdException"
+ reason:@"This request requires an ID (command, softbutton, etc) to be specified"
+ userInfo:nil];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLErrorConstants.h b/SmartDeviceLink/SDLErrorConstants.h
new file mode 100644
index 000000000..24d1d58f7
--- /dev/null
+++ b/SmartDeviceLink/SDLErrorConstants.h
@@ -0,0 +1,61 @@
+//
+// SDLErrorConstants.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 8/8/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+/**
+ * Errors associated with the SDLManager class.
+ */
+typedef NS_ENUM(NSInteger, SDLManagerError) {
+ /**
+ * An RPC request failed to send.
+ */
+ SDLManagerErrorRPCRequestFailed = -1,
+ /**
+ * Some action was attempted that requires a connection to the remote head unit.
+ */
+ SDLManagerErrorNotConnected = -2,
+ /**
+ * Some action was attempted before the ready state was reached.
+ */
+ SDLManagerErrorNotReady = -3,
+ /**
+ * The remote system encountered an unknown error.
+ */
+ SDLManagerErrorUnknownRemoteError = -4,
+ /**
+ * One or more of the sub-managers failed to start.
+ */
+ SDLManagerErrorManagersFailedToStart = -5,
+ /**
+ * Registering with the remote system failed.
+ */
+ SDLManagerErrorRegistrationFailed = -6,
+};
+
+/**
+ * Errors associated with the SDLFileManager class.
+ */
+typedef NS_ENUM(NSInteger, SDLFileManagerError) {
+ /**
+ * 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.
+ */
+ SDLFileManagerErrorCannotOverwrite = -1,
+ /**
+ * A file was attempted to be accessed but it does not exist.
+ */
+ SDLFileManagerErrorNoKnownFile = -2,
+ /**
+ * The file manager attempted to start but encountered an error.
+ */
+ SDLFileManagerErrorUnableToStart = -3,
+ /**
+ * The file manager was unable to send this file.
+ */
+ SDLFileManagerErrorUnableToUpload = -4,
+};
diff --git a/SmartDeviceLink/SDLFile.h b/SmartDeviceLink/SDLFile.h
new file mode 100644
index 000000000..3995f6722
--- /dev/null
+++ b/SmartDeviceLink/SDLFile.h
@@ -0,0 +1,134 @@
+//
+// SDLFile.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/14/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLFileType;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLFile : NSObject <NSCopying>
+
+/**
+ * Whether or not the file should persist on disk between car ignition cycles.
+ */
+@property (assign, nonatomic, readonly, getter=isPersistent) BOOL persistent;
+
+/**
+ * Whether or not the file should overwrite an existing file on the remote disk with the same name.
+ */
+@property (assign, nonatomic) BOOL overwrite;
+
+/**
+ * The name the file should be stored under on the remote disk. This is how the file will be referenced in all later calls.
+ */
+@property (copy, nonatomic, readonly) NSString *name;
+
+/**
+ * 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.
+ */
+@property (copy, nonatomic, readonly, nullable) NSURL *fileURL;
+
+/**
+ * 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.
+ */
+@property (copy, nonatomic, readonly) NSData *data;
+
+/**
+ * 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.
+ */
+@property (strong, nonatomic, readonly) SDLFileType *fileType;
+
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/**
+ * The designated initializer for an SDL File. The only major property that is not set using this is "overwrite", which defaults to NO.
+ *
+ * @param url The file URL pointing to the local data that will be pushed to the remote system.
+ * @param name The name that the file will be stored under on the remote system and how it will be referenced from the local system.
+ * @param persistent Whether or not the file will persist between ignition cycles.
+ *
+ * @return An SDLFile object.
+ */
+- (instancetype)initWithFileURL:(NSURL *)url name:(NSString *)name persistent:(BOOL)persistent NS_DESIGNATED_INITIALIZER;
+
+/**
+ * Create an SDL file using a local file URL.
+ *
+ * This is a persistent file, it will be persisted through sessions / ignition cycles. You will only have a limited space for all files, so be sure to only persist files that are required for all or most sessions. For example, menu artwork should be persistent.
+ *
+ * Ephemeral files should be created using ephemeralFileAtURL:name:
+ *
+ * @warning If this is not a readable file, this will return nil
+ *
+ * @param url The url to the file that should be uploaded.
+ * @param name The name of the file that will be used to reference the file in the future (for example on the remote file system).
+ *
+ * @return An instance of this class, or nil if a readable file at the path could not be found.
+ */
++ (instancetype)persistentFileAtFileURL:(NSURL *)url name:(NSString *)name;
+
+/**
+ * Create an SDL file using a local file URL.
+ *
+ * This is an ephemeral file, it will not be persisted through sessions / ignition cycles. Any files that you do not *know* you will use in future sessions should be created through this method. For example, album / artist artwork should be ephemeral.
+ *
+ * Persistent files should be created using persistentFileAtURL:name:
+ *
+ * @warning If this is not a readable file, this will return nil
+ *
+ * @param url The url to the file on disk that will be uploaded
+ * @param name The name of the file that will be used to reference the file in the future (for example on the remote file system).
+ *
+ * @return An instance of this class, or nil if a readable file at the url could not be found.
+ */
++ (instancetype)fileAtFileURL:(NSURL *)url name:(NSString *)name;
+
+/**
+ * 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.
+ *
+ * @param data The raw data to be used for the file
+ * @param name The name of the file that will be used to reference the file in the future (for example on the remote file system).
+ * @param extension The file extension. For example "png". Currently supported file extensions are: "bmp", "jpg", "jpeg", "png", "wav", "mp3", "aac", "json". All others will be sent as binary files.
+ * @param persistent Whether or not the remote file with this data should be persistent
+ *
+ * @return An instance of this class
+ */
+- (instancetype)initWithData:(NSData *)data name:(NSString *)name fileExtension:(NSString *)extension persistent:(BOOL)persistent NS_DESIGNATED_INITIALIZER;
+
+/**
+ * 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.
+ *
+ * This is a persistent file, it will be persisted through sessions / ignition cycles. You will only have a limited space for all files, so be sure to only persist files that are required for all or most sessions. For example, menu artwork should be persistent.
+ *
+ * @param data The raw data to be used for the file
+ * @param name The name of the file that will be used to reference the file in the future (for example on the remote file system).
+ * @param extension The file extension. For example "png". Currently supported file extensions are: "bmp", "jpg", "jpeg", "png", "wav", "mp3", "aac", "json". All others will be sent as binary files.
+ *
+ * @return An instance of this class
+ */
++ (instancetype)persistentFileWithData:(NSData *)data name:(NSString *)name fileExtension:(NSString *)extension;
+
+/**
+ * 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.
+ *
+ * This is an ephemeral file, it will not be persisted through sessions / ignition cycles. Any files that you do not *know* you will use in future sessions should be created through this method. For example, album / artist artwork should be ephemeral.
+ *
+ * @param data The raw data to be used for the file
+ * @param name The name of the file that will be used to reference the file in the future (for example on the remote file system).
+ * @param extension The file extension. For example "png". Currently supported file extensions are: "bmp", "jpg", "jpeg", "png", "wav", "mp3", "aac", "json". All others will be sent as binary files.
+ *
+ * @return An instance of this class
+ */
++ (instancetype)fileWithData:(NSData *)data name:(NSString *)name fileExtension:(NSString *)extension;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLFile.m b/SmartDeviceLink/SDLFile.m
new file mode 100644
index 000000000..c711feaa0
--- /dev/null
+++ b/SmartDeviceLink/SDLFile.m
@@ -0,0 +1,133 @@
+//
+// SDLFile.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/14/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLFile.h"
+
+#import "SDLFileManager.h"
+#import "SDLFileType.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLFile ()
+
+@property (copy, nonatomic, readwrite, nullable) NSURL *fileURL;
+@property (copy, nonatomic, readwrite) NSData *data;
+
+@property (strong, nonatomic, readwrite) SDLFileType *fileType;
+@property (assign, nonatomic, readwrite) BOOL persistent;
+@property (copy, nonatomic, readwrite) NSString *name;
+
+@end
+
+
+@implementation SDLFile
+
+#pragma mark - Lifecycle
+
+- (instancetype)initWithFileURL:(NSURL *)url name:(NSString *)name persistent:(BOOL)persistent {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ BOOL exists = url.isFileURL && [url checkResourceIsReachableAndReturnError:nil];
+ if (!exists) {
+ return nil;
+ }
+
+ _fileURL = url;
+ _data = [NSData data];
+ _name = name;
+ _persistent = persistent;
+ _fileType = [self.class sdl_fileTypeFromFileExtension:url.pathExtension];
+ _overwrite = NO;
+
+ return self;
+}
+
++ (instancetype)persistentFileAtFileURL:(NSURL *)url name:(NSString *)name {
+ return [[self alloc] initWithFileURL:url name:name persistent:YES];
+}
+
++ (instancetype)fileAtFileURL:(NSURL *)url name:(NSString *)name {
+ return [[self alloc] initWithFileURL:url name:name persistent:NO];
+}
+
+- (instancetype)initWithData:(NSData *)data name:(NSString *)name fileExtension:(NSString *)extension persistent:(BOOL)persistent {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+ if (data.length == 0) {
+ return nil;
+ }
+
+ _fileURL = nil;
+ _data = data;
+ _name = name;
+ _persistent = persistent;
+ _fileType = [self.class sdl_fileTypeFromFileExtension:extension];
+ _overwrite = NO;
+
+ return self;
+}
+
++ (instancetype)persistentFileWithData:(NSData *)data name:(NSString *)name fileExtension:(NSString *)extension {
+ return [[self alloc] initWithData:data name:name fileExtension:extension persistent:YES];
+}
+
++ (instancetype)fileWithData:(NSData *)data name:(NSString *)name fileExtension:(NSString *)extension {
+ return [[self alloc] initWithData:data name:name fileExtension:extension persistent:NO];
+}
+
+
+#pragma mark - Getters
+
+- (NSData *)data {
+ if (_data.length == 0 && _fileURL != nil) {
+ _data = [NSData dataWithContentsOfURL:_fileURL];
+ }
+
+ return _data;
+}
+
+
+#pragma mark - File Type
+
++ (SDLFileType *)sdl_fileTypeFromFileExtension:(NSString *)fileExtension {
+ if ([fileExtension caseInsensitiveCompare:@"bmp"] == NSOrderedSame) {
+ return [SDLFileType GRAPHIC_BMP];
+ } else if (([fileExtension caseInsensitiveCompare:@"jpg"] == NSOrderedSame) ||
+ ([fileExtension caseInsensitiveCompare:@"jpeg"] == NSOrderedSame)) {
+ return [SDLFileType GRAPHIC_JPEG];
+ } else if ([fileExtension caseInsensitiveCompare:@"png"] == NSOrderedSame) {
+ return [SDLFileType GRAPHIC_PNG];
+ } else if ([fileExtension caseInsensitiveCompare:@"wav"] == NSOrderedSame) {
+ return [SDLFileType AUDIO_WAVE];
+ } else if ([fileExtension caseInsensitiveCompare:@"mp3"] == NSOrderedSame) {
+ return [SDLFileType AUDIO_MP3];
+ } else if ([fileExtension caseInsensitiveCompare:@"aac"] == NSOrderedSame) {
+ return [SDLFileType AUDIO_AAC];
+ } else if ([fileExtension caseInsensitiveCompare:@"json"] == NSOrderedSame) {
+ return [SDLFileType JSON];
+ } else {
+ return [SDLFileType BINARY];
+ }
+}
+
+
+#pragma mark - NSCopying
+
+- (id)copyWithZone:(nullable NSZone *)zone {
+ return [[self.class allocWithZone:zone] initWithFileURL:_fileURL name:_name persistent:_persistent];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLFileManager.h b/SmartDeviceLink/SDLFileManager.h
new file mode 100644
index 000000000..0831a1ecd
--- /dev/null
+++ b/SmartDeviceLink/SDLFileManager.h
@@ -0,0 +1,109 @@
+//
+// SDLFileManager.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/14/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLFileManagerConstants.h"
+
+@class SDLFile;
+@protocol SDLConnectionManagerType;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NSString SDLFileName;
+
+typedef void (^SDLFileManagerStartupCompletionHandler)(BOOL success, NSError *__nullable error);
+
+
+/**
+ * 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.
+ */
+@interface SDLFileManager : NSObject
+
+/**
+ * A set of all names of files known on the remote head unit. Known files can be used or deleted on the remote system.
+ */
+@property (copy, nonatomic, readonly) NSSet<SDLFileName *> *remoteFileNames;
+
+/**
+ * The number of bytes still available for files for this app.
+ */
+@property (assign, nonatomic, readonly) NSUInteger bytesAvailable;
+
+/**
+ * The state of the file manager.
+ */
+@property (copy, nonatomic, readonly) NSString *currentState;
+
+/**
+ * The currently pending transactions (Upload, Delete, and List Files) in the file manager
+ */
+@property (copy, nonatomic, readonly) NSArray<__kindof NSOperation *> *pendingTransactions;
+
+/**
+ * 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.
+ */
+@property (assign, nonatomic) BOOL suspended;
+
+/**
+ * Initialize the class...or not, since this method is unavailable. Dependencies must be injected using initWithConnectionManager:
+ *
+ * @return nil
+ */
+- (instancetype)init NS_UNAVAILABLE;
+
+/**
+ * Creates a new file manager with a specified connection manager
+ *
+ * @param manager A connection manager to use to forward on RPCs
+ *
+ * @return An instance of SDLFileManager
+ */
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)manager NS_DESIGNATED_INITIALIZER;
+
+/**
+ * The manager stars up and attempts to fetch its initial list and transfer initial files.
+ *
+ * @param completionHandler The handler called when the manager is set up or failed to set up with an error. Use weak self when accessing self from the completion handler.
+ */
+- (void)startWithCompletionHandler:(nullable SDLFileManagerStartupCompletionHandler)completionHandler;
+
+/**
+ * Cancels all file manager operations and deletes all associated data.
+ */
+- (void)stop;
+
+/**
+ * Delete a file stored on the remote system
+ *
+ * @param name The name of the remote file. It should be a name currently stored in remoteFileNames
+ * @param completion An optional completion handler that sends an error should one occur.
+ */
+- (void)deleteRemoteFileWithName:(SDLFileName *)name completionHandler:(nullable SDLFileManagerDeleteCompletionHandler)completion;
+
+/**
+ * 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.
+ *
+ * @param file An SDLFile that contains metadata about the file to be sent
+ * @param completion An optional completion handler that sends an error should one occur.
+ */
+- (void)uploadFile:(SDLFile *)file completionHandler:(nullable SDLFileManagerUploadCompletionHandler)completion;
+
+/**
+ * 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.
+ *
+ * The SDL library manages the creation and deletion of these files and you should not have to touch this directory at all.
+ *
+ * @return An NSURL pointing to the location on disk where SDL's temporary files are stored.
+ */
++ (NSURL *)temporaryFileDirectory;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLFileManager.m b/SmartDeviceLink/SDLFileManager.m
new file mode 100644
index 000000000..84b20b890
--- /dev/null
+++ b/SmartDeviceLink/SDLFileManager.m
@@ -0,0 +1,310 @@
+//
+// SDLFileManager.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/14/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLFileManager.h"
+
+#import "SDLConnectionManagerType.h"
+#import "SDLDebugTool.h"
+#import "SDLDeleteFileOperation.h"
+#import "SDLError.h"
+#import "SDLFile.h"
+#import "SDLFileWrapper.h"
+#import "SDLGlobals.h"
+#import "SDLListFilesOperation.h"
+#import "SDLManager.h"
+#import "SDLNotificationConstants.h"
+#import "SDLPutFile.h"
+#import "SDLPutFileResponse.h"
+#import "SDLStateMachine.h"
+#import "SDLUploadFileOperation.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NSString SDLFileManagerState;
+SDLFileManagerState *const SDLFileManagerStateShutdown = @"Shutdown";
+SDLFileManagerState *const SDLFileManagerStateFetchingInitialList = @"FetchingInitialList";
+SDLFileManagerState *const SDLFileManagerStateReady = @"Ready";
+SDLFileManagerState *const SDLFileManagerStateStartupError = @"StartupError";
+
+
+#pragma mark - SDLFileManager class
+
+@interface SDLFileManager ()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+
+// Remote state
+@property (copy, nonatomic, readwrite) NSMutableSet<SDLFileName *> *mutableRemoteFileNames;
+@property (assign, nonatomic, readwrite) NSUInteger bytesAvailable;
+
+// Local state
+@property (strong, nonatomic) NSOperationQueue *transactionQueue;
+@property (strong, nonatomic) SDLStateMachine *stateMachine;
+@property (copy, nonatomic, nullable) SDLFileManagerStartupCompletionHandler startupCompletionHandler;
+
+@end
+
+
+@implementation SDLFileManager
+
+#pragma mark - Lifecycle
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)manager {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _connectionManager = manager;
+ _bytesAvailable = 0;
+
+ _mutableRemoteFileNames = [NSMutableSet set];
+ _transactionQueue = [[NSOperationQueue alloc] init];
+ _transactionQueue.name = @"SDLFileManager Transaction Queue";
+ _transactionQueue.maxConcurrentOperationCount = 1;
+
+ _stateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLFileManagerStateShutdown states:[self.class sdl_stateTransitionDictionary]];
+
+ return self;
+}
+
+
+#pragma mark - Setup / Shutdown
+
+- (void)startWithCompletionHandler:(nullable SDLFileManagerStartupCompletionHandler)handler {
+ if ([self.currentState isEqualToString:SDLFileManagerStateShutdown]) {
+ self.startupCompletionHandler = handler;
+ [self.stateMachine transitionToState:SDLFileManagerStateFetchingInitialList];
+ } else {
+ // If we already started, just tell the handler we're started.
+ handler(YES, nil);
+ }
+}
+
+- (void)stop {
+ [self.stateMachine transitionToState:SDLFileManagerStateShutdown];
+}
+
+
+#pragma mark - Getters
+
+- (NSSet<SDLFileName *> *)remoteFileNames {
+ return [NSSet setWithSet:self.mutableRemoteFileNames];
+}
+
+- (NSString *)currentState {
+ return self.stateMachine.currentState;
+}
+
+- (NSArray<__kindof NSOperation *> *)pendingTransactions {
+ return self.transactionQueue.operations;
+}
+
+- (BOOL)suspended {
+ return self.transactionQueue.suspended;
+}
+
+
+#pragma mark Setters
+
+- (void)setSuspended:(BOOL)suspended {
+ self.transactionQueue.suspended = suspended;
+}
+
+
+#pragma mark - State
+
++ (NSDictionary<SDLState *, SDLAllowableStateTransitions *> *)sdl_stateTransitionDictionary {
+ return @{
+ SDLFileManagerStateShutdown: @[SDLFileManagerStateFetchingInitialList],
+ SDLFileManagerStateFetchingInitialList: @[SDLFileManagerStateShutdown, SDLFileManagerStateReady, SDLFileManagerStateStartupError],
+ SDLFileManagerStateReady: @[SDLFileManagerStateShutdown],
+ SDLFileManagerStateStartupError: @[SDLFileManagerStateShutdown]
+ };
+}
+
+- (void)didEnterStateStartupError {
+ if (self.startupCompletionHandler != nil) {
+ self.startupCompletionHandler(NO, [NSError sdl_fileManager_unableToStartError]);
+ self.startupCompletionHandler = nil;
+ }
+}
+
+- (void)willEnterStateShutdown {
+ [self.transactionQueue cancelAllOperations];
+ [self.mutableRemoteFileNames removeAllObjects];
+ [self.class sdl_clearTemporaryFileDirectory];
+ self.bytesAvailable = 0;
+
+ self.startupCompletionHandler = nil;
+}
+
+- (void)didEnterStateFetchingInitialList {
+ __weak typeof(self) weakSelf = self;
+ [self sdl_listRemoteFilesWithCompletionHandler:^(BOOL success, NSUInteger bytesAvailable, NSArray<NSString *> *_Nonnull fileNames, NSError *_Nullable error) {
+ // If there was an error, we'll pass the error to the startup handler and cancel out
+ if (error != nil) {
+ [weakSelf.stateMachine transitionToState:SDLFileManagerStateStartupError];
+ BLOCK_RETURN;
+ }
+
+ // If no error, make sure we're in the ready state
+ [weakSelf.stateMachine transitionToState:SDLFileManagerStateReady];
+ }];
+}
+
+- (void)didEnterStateReady {
+ if (self.startupCompletionHandler != nil) {
+ self.startupCompletionHandler(YES, nil);
+ self.startupCompletionHandler = nil;
+ }
+}
+
+
+#pragma mark - Private Listing Remote Files
+
+- (void)sdl_listRemoteFilesWithCompletionHandler:(SDLFileManagerListFilesCompletionHandler)handler {
+ __weak typeof(self) weakSelf = self;
+ SDLListFilesOperation *listOperation = [[SDLListFilesOperation alloc] initWithConnectionManager:self.connectionManager
+ completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSArray<NSString *> *_Nonnull fileNames, NSError *_Nullable error) {
+ if (error != nil || !success) {
+ handler(success, bytesAvailable, fileNames, error);
+ BLOCK_RETURN;
+ }
+
+ // If there was no error, set our properties and call back to the startup completion handler
+ [weakSelf.mutableRemoteFileNames addObjectsFromArray:fileNames];
+ weakSelf.bytesAvailable = bytesAvailable;
+
+ handler(success, bytesAvailable, fileNames, error);
+ }];
+
+ [self.transactionQueue addOperation:listOperation];
+}
+
+
+#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]);
+ }
+
+ __weak typeof(self) weakSelf = self;
+ SDLDeleteFileOperation *deleteOperation = [[SDLDeleteFileOperation alloc] initWithFileName:name
+ connectionManager:self.connectionManager
+ completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError *_Nullable error) {
+ __strong typeof(weakSelf) strongSelf = weakSelf;
+
+ // Mutate self based on the changes
+ strongSelf.bytesAvailable = bytesAvailable;
+ if (success) {
+ [strongSelf.mutableRemoteFileNames removeObject:name];
+ }
+
+ if (handler != nil) {
+ handler(YES, self.bytesAvailable, nil);
+ }
+ }];
+
+ [self.transactionQueue addOperation:deleteOperation];
+}
+
+
+#pragma mark - Uploading
+
+- (void)uploadFile:(SDLFile *)file completionHandler:(nullable SDLFileManagerUploadCompletionHandler)handler {
+ if (file == nil) {
+ handler(NO, self.bytesAvailable, [NSError sdl_fileManager_unableToUploadError]);
+ }
+
+ // Make sure we are able to send files
+ if (![self.currentState isEqualToString:SDLFileManagerStateReady]) {
+ handler(NO, self.bytesAvailable, [NSError sdl_fileManager_unableToUploadError]);
+ return;
+ }
+
+ // Check our overwrite settings and error out if it would overwrite
+ if (file.overwrite == NO && [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];
+
+ __weak typeof(self) weakSelf = self;
+ SDLFileWrapper *fileWrapper = [SDLFileWrapper wrapperWithFile:file
+ completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError *_Nullable error) {
+ [weakSelf.class sdl_deleteTemporaryFile:file.fileURL];
+
+ if (bytesAvailable != 0) {
+ weakSelf.bytesAvailable = bytesAvailable;
+ }
+ if (success) {
+ [weakSelf.mutableRemoteFileNames addObject:fileName];
+ }
+ if (uploadCompletion != nil) {
+ uploadCompletion(success, bytesAvailable, error);
+ }
+ }];
+
+ SDLUploadFileOperation *uploadOperation = [[SDLUploadFileOperation alloc] initWithFile:fileWrapper connectionManager:self.connectionManager];
+
+ [self.transactionQueue addOperation:uploadOperation];
+}
+
+
+#pragma mark - Temporary Files
+
++ (NSURL *)temporaryFileDirectory {
+ NSURL *directoryURL = [self.class sdl_temporaryFileDirectoryName];
+ if (![[NSFileManager defaultManager] fileExistsAtPath:[directoryURL path]]) {
+ [[NSFileManager defaultManager] createDirectoryAtURL:directoryURL withIntermediateDirectories:NO attributes:nil error:nil];
+ }
+
+ return directoryURL;
+}
+
++ (NSURL *)sdl_temporaryFileDirectoryName {
+ return [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"SDL"]];
+}
+
++ (void)sdl_clearTemporaryFileDirectory {
+ NSError *error = nil;
+ if (![[NSFileManager defaultManager] fileExistsAtPath:[self.class sdl_temporaryFileDirectoryName].absoluteString]) {
+ [[NSFileManager defaultManager] removeItemAtURL:[self.class sdl_temporaryFileDirectoryName] error:&error];
+ }
+
+ if (error != nil) {
+ NSString *debugString = [NSString stringWithFormat:@"[Error clearing temporary file directory] %@", error];
+ [SDLDebugTool logInfo:debugString];
+ }
+}
+
++ (void)sdl_deleteTemporaryFile:(NSURL *)fileURL {
+ NSError *error = nil;
+ if (![[NSFileManager defaultManager] removeItemAtURL:fileURL error:&error]) {
+ NSString *debugString = [NSString stringWithFormat:@"[Error clearing temporary file directory] %@ (%@)", error, fileURL];
+ [SDLDebugTool logInfo:debugString];
+ }
+}
+
+@end
+
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLFileManagerConstants.h b/SmartDeviceLink/SDLFileManagerConstants.h
new file mode 100644
index 000000000..c0241b020
--- /dev/null
+++ b/SmartDeviceLink/SDLFileManagerConstants.h
@@ -0,0 +1,17 @@
+//
+// SDLFileManagerConstants.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 5/11/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void (^SDLFileManagerUploadCompletionHandler)(BOOL success, NSUInteger bytesAvailable, NSError *__nullable error);
+typedef void (^SDLFileManagerDeleteCompletionHandler)(BOOL success, NSUInteger bytesAvailable, NSError *__nullable error);
+typedef void (^SDLFileManagerListFilesCompletionHandler)(BOOL success, NSUInteger bytesAvailable, NSArray<NSString *> *fileNames, NSError *__nullable error);
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLFileWrapper.h b/SmartDeviceLink/SDLFileWrapper.h
new file mode 100644
index 000000000..212e4c8b9
--- /dev/null
+++ b/SmartDeviceLink/SDLFileWrapper.h
@@ -0,0 +1,30 @@
+//
+// SDLFileWrapper.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 5/11/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLFileManagerConstants.h"
+
+
+@class SDLFile;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLFileWrapper : NSObject
+
+@property (strong, nonatomic, readonly) SDLFile *file;
+@property (copy, nonatomic, readonly) SDLFileManagerUploadCompletionHandler completionHandler;
+
+- (instancetype)initWithFile:(SDLFile *)file completionHandler:(SDLFileManagerUploadCompletionHandler)completionHandler;
+
++ (instancetype)wrapperWithFile:(SDLFile *)file completionHandler:(SDLFileManagerUploadCompletionHandler)completionHandler;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLFileWrapper.m b/SmartDeviceLink/SDLFileWrapper.m
new file mode 100644
index 000000000..fac2b6580
--- /dev/null
+++ b/SmartDeviceLink/SDLFileWrapper.m
@@ -0,0 +1,36 @@
+//
+// SDLFileWrapper.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 5/11/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLFileWrapper.h"
+
+#import "SDLFile.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLFileWrapper
+
+- (instancetype)initWithFile:(SDLFile *)file completionHandler:(SDLFileManagerUploadCompletionHandler)completionHandler {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _file = file;
+ _completionHandler = completionHandler;
+
+ return self;
+}
+
++ (instancetype)wrapperWithFile:(SDLFile *)file completionHandler:(SDLFileManagerUploadCompletionHandler)completionHandler {
+ return [[self alloc] initWithFile:file completionHandler:completionHandler];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLGetDTCs.h b/SmartDeviceLink/SDLGetDTCs.h
index 3d38a0079..e2e5ef438 100644
--- a/SmartDeviceLink/SDLGetDTCs.h
+++ b/SmartDeviceLink/SDLGetDTCs.h
@@ -26,6 +26,11 @@
* @param dict The dictionary to use
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+
+- (instancetype)initWithECUName:(UInt16)name;
+
+- (instancetype)initWithECUName:(UInt16)name mask:(UInt8)mask;
+
/**
* @abstract a name of the module to receive the DTC form
* @discussion an NSNumber value representing a name of the module to receive
diff --git a/SmartDeviceLink/SDLGetDTCs.m b/SmartDeviceLink/SDLGetDTCs.m
index cf7db88e5..7041e44d4 100644
--- a/SmartDeviceLink/SDLGetDTCs.m
+++ b/SmartDeviceLink/SDLGetDTCs.m
@@ -20,6 +20,28 @@
return self;
}
+- (instancetype)initWithECUName:(UInt16)name mask:(UInt8)mask {
+ self = [self initWithECUName:name];
+ if (!self) {
+ return nil;
+ }
+
+ self.dtcMask = @(mask);
+
+ return self;
+}
+
+- (instancetype)initWithECUName:(UInt16)name {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.ecuName = @(name);
+
+ return self;
+}
+
- (void)setEcuName:(NSNumber *)ecuName {
if (ecuName != nil) {
[parameters setObject:ecuName forKey:NAMES_ecuName];
diff --git a/SmartDeviceLink/SDLGetVehicleData.h b/SmartDeviceLink/SDLGetVehicleData.h
index df2c1923e..6f7fddd1e 100644
--- a/SmartDeviceLink/SDLGetVehicleData.h
+++ b/SmartDeviceLink/SDLGetVehicleData.h
@@ -30,6 +30,7 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus;
/**
* @abstract A boolean value. If true, requests Gps data
*/
@@ -137,4 +138,4 @@
@property (strong) NSNumber *clusterModeStatus;
@property (strong) NSNumber *myKey;
-@end \ No newline at end of file
+@end
diff --git a/SmartDeviceLink/SDLGetVehicleData.m b/SmartDeviceLink/SDLGetVehicleData.m
index ab5d59a19..320350fc2 100644
--- a/SmartDeviceLink/SDLGetVehicleData.m
+++ b/SmartDeviceLink/SDLGetVehicleData.m
@@ -20,6 +20,41 @@
return self;
}
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.accPedalPosition = @(accelerationPedalPosition);
+ self.airbagStatus = @(airbagStatus);
+ self.beltStatus = @(beltStatus);
+ self.bodyInformation = @(bodyInformation);
+ self.clusterModeStatus = @(clusterModeStatus);
+ self.deviceStatus = @(deviceStatus);
+ self.driverBraking = @(driverBraking);
+ self.eCallInfo = @(eCallInfo);
+ self.emergencyEvent = @(emergencyEvent);
+ self.engineTorque = @(engineTorque);
+ self.externalTemperature = @(externalTemperature);
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
+ self.myKey = @(myKey);
+ self.odometer = @(odometer);
+ self.gps = @(gps);
+ self.headLampStatus = @(headLampStatus);
+ self.instantFuelConsumption = @(instantFuelConsumption);
+ self.prndl = @(prndl);
+ self.rpm = @(rpm);
+ self.speed = @(speed);
+ self.steeringWheelAngle = @(steeringWheelAngle);
+ self.tirePressure = @(tirePressure);
+ self.vin = @(vin);
+ self.wiperStatus = @(wiperStatus);
+
+ return self;
+}
+
- (void)setGps:(NSNumber *)gps {
if (gps != nil) {
[parameters setObject:gps forKey:NAMES_gps];
diff --git a/SmartDeviceLink/SDLGlobals.h b/SmartDeviceLink/SDLGlobals.h
index 2b6fe2c47..fced9d4e9 100644
--- a/SmartDeviceLink/SDLGlobals.h
+++ b/SmartDeviceLink/SDLGlobals.h
@@ -9,6 +9,7 @@
#import <Foundation/Foundation.h>
#define SDL_SYSTEM_VERSION_LESS_THAN(version) ([[[UIDevice currentDevice] systemVersion] compare:version options:NSNumericSearch] == NSOrderedAscending)
+#define BLOCK_RETURN return
@interface SDLGlobals : NSObject
diff --git a/SmartDeviceLink/SDLImage.h b/SmartDeviceLink/SDLImage.h
index 993107ec3..24c6dcdab 100644
--- a/SmartDeviceLink/SDLImage.h
+++ b/SmartDeviceLink/SDLImage.h
@@ -25,6 +25,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithName:(NSString *)name ofType:(SDLImageType *)imageType;
+
/**
* @abstract The static hex icon value or the binary image file name identifier (sent by SDLPutFile)
*
diff --git a/SmartDeviceLink/SDLImage.m b/SmartDeviceLink/SDLImage.m
index ef646f794..84721ec0e 100644
--- a/SmartDeviceLink/SDLImage.m
+++ b/SmartDeviceLink/SDLImage.m
@@ -21,6 +21,18 @@
return self;
}
+- (instancetype)initWithName:(NSString *)name ofType:(SDLImageType *)imageType {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.value = name;
+ self.imageType = imageType;
+
+ return self;
+}
+
- (void)setValue:(NSString *)value {
if (value != nil) {
[store setObject:value forKey:NAMES_value];
diff --git a/SmartDeviceLink/SDLKeyboardProperties.h b/SmartDeviceLink/SDLKeyboardProperties.h
index 8215a8938..75611a03e 100644
--- a/SmartDeviceLink/SDLKeyboardProperties.h
+++ b/SmartDeviceLink/SDLKeyboardProperties.h
@@ -14,6 +14,8 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithLanguage:(SDLLanguage *)language layout:(SDLKeyboardLayout *)layout keypressMode:(SDLKeypressMode *)keypressMode limitedCharacterList:(NSArray *)limitedCharacterList autoCompleteText:(NSString *)autoCompleteText;
+
@property (strong) SDLLanguage *language;
@property (strong) SDLKeyboardLayout *keyboardLayout;
@property (strong) SDLKeypressMode *keypressMode;
diff --git a/SmartDeviceLink/SDLKeyboardProperties.m b/SmartDeviceLink/SDLKeyboardProperties.m
index 896f3a99a..d5c95bbc2 100644
--- a/SmartDeviceLink/SDLKeyboardProperties.m
+++ b/SmartDeviceLink/SDLKeyboardProperties.m
@@ -23,6 +23,21 @@
return self;
}
+- (instancetype)initWithLanguage:(SDLLanguage *)language layout:(SDLKeyboardLayout *)layout keypressMode:(SDLKeypressMode *)keypressMode limitedCharacterList:(NSArray *)limitedCharacterList autoCompleteText:(NSString *)autoCompleteText {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.language = language;
+ self.keyboardLayout = layout;
+ self.keypressMode = keypressMode;
+ self.limitedCharacterList = [limitedCharacterList mutableCopy];
+ self.autoCompleteText = autoCompleteText;
+
+ return self;
+}
+
- (void)setLanguage:(SDLLanguage *)language {
if (language != nil) {
[store setObject:language forKey:NAMES_language];
diff --git a/SmartDeviceLink/SDLLifecycleConfiguration.h b/SmartDeviceLink/SDLLifecycleConfiguration.h
new file mode 100644
index 000000000..638c1703a
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleConfiguration.h
@@ -0,0 +1,142 @@
+//
+// SDLManagerConfiguration.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/7/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+@import UIKit;
+
+#import <Foundation/Foundation.h>
+
+@class SDLAppHMIType;
+@class SDLFile;
+@class SDLLanguage;
+@class SDLTTSChunk;
+
+@protocol SDLSecurityType;
+
+
+typedef NS_OPTIONS(NSUInteger, SDLLogOutput) {
+ SDLLogOutputNone = 0,
+ SDLLogOutputConsole = 1 << 0,
+ SDLLogOutputFile = 1 << 1,
+ SDLLogOutputSiphon = 1 << 2
+};
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Configuration options for SDLManager
+ */
+@interface SDLLifecycleConfiguration : NSObject <NSCopying>
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/**
+ * A production configuration that runs using IAP. Additional functionality should be customized on the properties.
+ *
+ * @param appName The name of the app.
+ * @param appId The appId to be used. This should be registered with the radio's manufacturer.
+ *
+ * @return The lifecycle configuration
+ */
++ (SDLLifecycleConfiguration *)defaultConfigurationWithAppName:(NSString *)appName appId:(NSString *)appId;
+
+/**
+ * A debug configuration that runs using TCP. Additional functionality should be customized on the properties.
+ *
+ * @param appName The name of the app.
+ * @param appId The appId to be used. This should be registered with the radio's manufacturer.
+ * @param ipAddress The ip address of the server to connect to
+ * @param port The port of the server to connect to
+ *
+ * @return The lifecycle configuration
+ */
++ (SDLLifecycleConfiguration *)debugConfigurationWithAppName:(NSString *)appName appId:(NSString *)appId ipAddress:(NSString *)ipAddress port:(UInt16)port;
+
+/**
+ * Whether or not debug mode is enabled
+ */
+@property (assign, nonatomic, readonly) BOOL tcpDebugMode;
+
+/**
+ * The ip address at which the library will look for a server
+ */
+@property (copy, nonatomic, readonly, null_resettable) NSString *tcpDebugIPAddress;
+
+/**
+ * The port at which the library will look for a server
+ */
+@property (assign, nonatomic, readonly) UInt16 tcpDebugPort;
+
+/**
+ * The full name of the app
+ */
+@property (copy, nonatomic, readonly) NSString *appName;
+
+/**
+ * The app id. This must be the same as the app id received from the SDL developer portal or OEM.
+ */
+@property (copy, nonatomic, readonly) NSString *appId;
+
+/**
+ * A hash id which should be passed to the remote system in the RegisterAppInterface
+ */
+@property (copy, nonatomic, nullable) NSString *resumeHash;
+
+/**
+ * This is an automatically set based on the app type
+ */
+@property (assign, nonatomic, readonly) BOOL isMedia;
+
+/**
+ * The application type
+ */
+@property (strong, nonatomic, null_resettable) SDLAppHMIType *appType;
+
+/**
+ * The default language to use
+ */
+@property (strong, nonatomic) SDLLanguage *language;
+
+/**
+ * An array of all the supported languages
+ */
+@property (strong, nonatomic) NSArray<SDLLanguage *> *languagesSupported;
+
+/**
+ * The application icon to be used on an app launching screen
+ */
+@property (strong, nonatomic, nullable) SDLFile *appIcon;
+
+/**
+ * An abbrevited application name that will be used on the app launching screen if the full one would be truncated
+ */
+@property (copy, nonatomic, nullable) NSString *shortAppName;
+
+/**
+ * A Text to Speech String for voice recognition of the mobile application name.
+ */
+@property (copy, nonatomic, nullable) NSArray<SDLTTSChunk *> *ttsName;
+
+/**
+ * Additional voice recognition commands. May not interfere with any other app name or global commands.
+ */
+@property (copy, nonatomic, nullable) NSArray<NSString *> *voiceRecognitionCommandNames;
+
+/**
+ * Set security managers which could be used. This is primarily used with video streaming applications to authenticate and perhaps encrypt traffic data.
+ */
+@property (copy, nonatomic, nullable) NSArray<Class<SDLSecurityType>> *securityManagers;
+
+/**
+ * Which logging capabilities are currently enabled. The default is Console logging only.
+ */
+@property (assign, nonatomic) SDLLogOutput logFlags;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLifecycleConfiguration.m b/SmartDeviceLink/SDLLifecycleConfiguration.m
new file mode 100644
index 000000000..f1b8acf7e
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleConfiguration.m
@@ -0,0 +1,121 @@
+//
+// SDLManagerConfiguration.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/7/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLLifecycleConfiguration.h"
+
+#import "SDLAppHMIType.h"
+#import "SDLFile.h"
+#import "SDLLanguage.h"
+
+static NSString *const DefaultTCPIPAddress = @"192.168.0.1";
+static UInt16 const DefaultTCPIPPort = 12345;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLifecycleConfiguration ()
+
+@property (assign, nonatomic, readwrite) BOOL tcpDebugMode;
+@property (copy, nonatomic, readwrite, null_resettable) NSString *tcpDebugIPAddress;
+@property (assign, nonatomic, readwrite) UInt16 tcpDebugPort;
+
+@end
+
+
+@implementation SDLLifecycleConfiguration
+
+#pragma mark Lifecycle
+
+- (instancetype)initDefaultConfigurationWithAppName:(NSString *)appName appId:(NSString *)appId {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _tcpDebugMode = NO;
+ _tcpDebugIPAddress = DefaultTCPIPAddress;
+ _tcpDebugPort = DefaultTCPIPPort;
+
+ _appName = appName;
+ _appId = appId;
+
+ _appType = [SDLAppHMIType DEFAULT];
+ _language = [SDLLanguage EN_US];
+ _languagesSupported = @[_language];
+ _appIcon = nil;
+ _shortAppName = nil;
+ _ttsName = nil;
+ _voiceRecognitionCommandNames = nil;
+ _logFlags = SDLLogOutputNone;
+
+ return self;
+}
+
++ (SDLLifecycleConfiguration *)defaultConfigurationWithAppName:(NSString *)appName appId:(NSString *)appId {
+ return [[self alloc] initDefaultConfigurationWithAppName:appName appId:appId];
+}
+
++ (SDLLifecycleConfiguration *)debugConfigurationWithAppName:(NSString *)appName appId:(NSString *)appId ipAddress:(NSString *)ipAddress port:(UInt16)port {
+ SDLLifecycleConfiguration *config = [[self alloc] initDefaultConfigurationWithAppName:appName appId:appId];
+ config.tcpDebugMode = YES;
+ config.tcpDebugIPAddress = ipAddress;
+ config.tcpDebugPort = port;
+
+ config.logFlags = SDLLogOutputConsole;
+
+ return config;
+}
+
+#pragma mark Computed Properties
+
+- (BOOL)isMedia {
+ if ([self.appType isEqualToEnum:[SDLAppHMIType MEDIA]]) {
+ return YES;
+ }
+
+ return NO;
+}
+
+- (void)setTcpDebugIPAddress:(nullable NSString *)tcpDebugIPAddress {
+ if (tcpDebugIPAddress == nil) {
+ _tcpDebugIPAddress = DefaultTCPIPAddress;
+ } else {
+ _tcpDebugIPAddress = tcpDebugIPAddress;
+ }
+}
+
+- (void)setAppType:(nullable SDLAppHMIType *)appType {
+ if (appType == nil) {
+ _appType = [SDLAppHMIType DEFAULT];
+ }
+
+ _appType = appType;
+}
+
+
+#pragma mark NSCopying
+
+- (id)copyWithZone:(nullable NSZone *)zone {
+ SDLLifecycleConfiguration *newConfig = [[self.class allocWithZone:zone] initDefaultConfigurationWithAppName:_appName appId:_appId];
+ newConfig->_tcpDebugMode = _tcpDebugMode;
+ newConfig->_tcpDebugIPAddress = _tcpDebugIPAddress;
+ newConfig->_tcpDebugPort = _tcpDebugPort;
+ newConfig->_appType = _appType;
+ newConfig->_language = _language;
+ newConfig->_languagesSupported = _languagesSupported;
+ newConfig->_appIcon = _appIcon;
+ newConfig->_shortAppName = _shortAppName;
+ newConfig->_ttsName = _ttsName;
+ newConfig->_voiceRecognitionCommandNames = _voiceRecognitionCommandNames;
+
+ return newConfig;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLifecycleManager.h b/SmartDeviceLink/SDLLifecycleManager.h
new file mode 100644
index 000000000..ae63f92d2
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleManager.h
@@ -0,0 +1,120 @@
+//
+// SDLLifecycleManager.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/19/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLNotificationConstants.h"
+#import <Foundation/Foundation.h>
+
+
+@class SDLConfiguration;
+@class SDLFileManager;
+@class SDLHMILevel;
+@class SDLLanguage;
+@class SDLLifecycleConfiguration;
+@class SDLLockScreenConfiguration;
+@class SDLLockScreenManager;
+@class SDLNotificationDispatcher;
+@class SDLOnHashChange;
+@class SDLPermissionManager;
+@class SDLProxy;
+@class SDLPutFile;
+@class SDLRegisterAppInterfaceResponse;
+@class SDLResponseDispatcher;
+@class SDLRPCNotification;
+@class SDLRPCRequest;
+@class SDLRPCResponse;
+@class SDLStateMachine;
+@class SDLStreamingMediaManager;
+
+@protocol SDLManagerDelegate;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NSString SDLLifecycleState;
+extern SDLLifecycleState *const SDLLifecycleStateDisconnected;
+extern SDLLifecycleState *const SDLLifecycleStateTransportConnected;
+extern SDLLifecycleState *const SDLLifecycleStateRegistered;
+extern SDLLifecycleState *const SDLLifecycleStateSettingUpManagers;
+extern SDLLifecycleState *const SDLLifecycleStatePostManagerProcessing;
+extern SDLLifecycleState *const SDLLifecycleStateUnregistering;
+extern SDLLifecycleState *const SDLLifecycleStateReady;
+
+
+typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error);
+
+
+@interface SDLLifecycleManager : NSObject
+
+@property (copy, nonatomic, readonly) SDLConfiguration *configuration;
+@property (weak, nonatomic, nullable) id<SDLManagerDelegate> delegate;
+
+@property (strong, nonatomic) SDLFileManager *fileManager;
+@property (strong, nonatomic) SDLPermissionManager *permissionManager;
+@property (strong, nonatomic, readonly, nullable) SDLStreamingMediaManager *streamManager;
+@property (strong, nonatomic) SDLLockScreenManager *lockScreenManager;
+
+@property (strong, nonatomic, readonly) SDLNotificationDispatcher *notificationDispatcher;
+@property (strong, nonatomic, readonly) SDLResponseDispatcher *responseDispatcher;
+@property (strong, nonatomic, readonly) SDLStateMachine *lifecycleStateMachine;
+
+// Deprecated internal proxy object
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+@property (strong, nonatomic, readonly, nullable) SDLProxy *proxy;
+#pragma clang diagnostic pop
+
+@property (assign, nonatomic, readonly) UInt16 lastCorrelationId;
+@property (copy, nonatomic, readonly) SDLLifecycleState *lifecycleState;
+@property (copy, nonatomic, readonly, nullable) SDLHMILevel *hmiLevel;
+@property (strong, nonatomic, readonly, nullable) SDLRegisterAppInterfaceResponse *registerResponse;
+
+
+#pragma mark Lifecycle
+/**
+ * Initialize the manager with a configuration. Call `startWithHandler` to begin waiting for a connection.
+ *
+ * @param configuration Your app's unique configuration for setup.
+ * @param delegate An optional delegate to be notified of hmi level changes and startup and shutdown. It is recommended that you implement this.
+ *
+ * @return An instance of SDLManager
+ */
+- (instancetype)initWithConfiguration:(SDLConfiguration *)configuration delegate:(nullable id<SDLManagerDelegate>)delegate NS_DESIGNATED_INITIALIZER;
+
+/**
+ * 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.
+ *
+ * @param readyHandler The block called when the manager is ready to be used or an error occurs while attempting to become ready.
+ */
+- (void)startWithReadyHandler:(SDLManagerReadyBlock)readyHandler;
+
+/**
+ * Stop the manager, it will disconnect if needed and no longer look for a connection. You probably don't need to call this method ever.
+ */
+- (void)stop;
+
+
+#pragma mark Send RPC Requests
+
+/**
+ * Send an RPC request and don't bother with the response or error. If you need the response or error, call sendRequest:withCompletionHandler: instead.
+ *
+ * @param request The RPC request to send
+ */
+- (void)sendRequest:(SDLRPCRequest *)request;
+
+/**
+ * Send an RPC request and set a completion handler that will be called with the response when the response returns.
+ *
+ * @param request The RPC request to send
+ * @param handler The handler that will be called when the response returns
+ */
+- (void)sendRequest:(SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m
new file mode 100644
index 000000000..22a40b93e
--- /dev/null
+++ b/SmartDeviceLink/SDLLifecycleManager.m
@@ -0,0 +1,466 @@
+//
+// SDLLifecycleManager.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/19/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLLifecycleManager.h"
+
+#import "NSMapTable+Subscripting.h"
+#import "SDLConfiguration.h"
+#import "SDLConnectionManagerType.h"
+#import "SDLDebugTool.h"
+#import "SDLError.h"
+#import "SDLFile.h"
+#import "SDLFileManager.h"
+#import "SDLHMILevel.h"
+#import "SDLLifecycleConfiguration.h"
+#import "SDLLockScreenConfiguration.h"
+#import "SDLLockScreenManager.h"
+#import "SDLLockScreenPresenter.h"
+#import "SDLManagerDelegate.h"
+#import "SDLNotificationDispatcher.h"
+#import "SDLOnAppInterfaceUnregistered.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLOnHashChange.h"
+#import "SDLPermissionManager.h"
+#import "SDLProxy.h"
+#import "SDLProxyFactory.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLRegisterAppInterface.h"
+#import "SDLRegisterAppInterfaceResponse.h"
+#import "SDLResponseDispatcher.h"
+#import "SDLResult.h"
+#import "SDLSetAppIcon.h"
+#import "SDLStateMachine.h"
+#import "SDLUnregisterAppInterface.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+SDLLifecycleState *const SDLLifecycleStateDisconnected = @"TransportDisconnected";
+SDLLifecycleState *const SDLLifecycleStateTransportConnected = @"TransportConnected";
+SDLLifecycleState *const SDLLifecycleStateRegistered = @"Registered";
+SDLLifecycleState *const SDLLifecycleStateSettingUpManagers = @"SettingUpManagers";
+SDLLifecycleState *const SDLLifecycleStatePostManagerProcessing = @"PostManagerProcessing";
+SDLLifecycleState *const SDLLifecycleStateUnregistering = @"Unregistering";
+SDLLifecycleState *const SDLLifecycleStateReady = @"Ready";
+
+#pragma mark - SDLManager Private Interface
+
+@interface SDLLifecycleManager () <SDLConnectionManagerType>
+
+// Readonly public properties
+@property (copy, nonatomic, readwrite, nullable) SDLHMILevel *hmiLevel;
+@property (copy, nonatomic, readwrite) SDLConfiguration *configuration;
+@property (assign, nonatomic, readwrite) UInt16 lastCorrelationId;
+@property (strong, nonatomic, readwrite, nullable) SDLRegisterAppInterfaceResponse *registerResponse;
+@property (strong, nonatomic, readwrite) SDLNotificationDispatcher *notificationDispatcher;
+@property (strong, nonatomic, readwrite) SDLResponseDispatcher *responseDispatcher;
+@property (strong, nonatomic, readwrite) SDLStateMachine *lifecycleStateMachine;
+
+// Deprecated internal proxy object
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+@property (strong, nonatomic, readwrite, nullable) SDLProxy *proxy;
+#pragma clang diagnostic pop
+
+// Private properties
+@property (copy, nonatomic) SDLManagerReadyBlock readyHandler;
+
+@end
+
+
+@implementation SDLLifecycleManager
+
+#pragma mark Lifecycle
+
+- (instancetype)init {
+ return [self initWithConfiguration:[SDLConfiguration configurationWithLifecycle:[SDLLifecycleConfiguration defaultConfigurationWithAppName:@"SDL APP" appId:@"001"] lockScreen:[SDLLockScreenConfiguration disabledConfiguration]] delegate:nil];
+}
+
+- (instancetype)initWithConfiguration:(SDLConfiguration *)configuration delegate:(nullable id<SDLManagerDelegate>)delegate {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ // Dependencies
+ _configuration = configuration;
+ _delegate = delegate;
+
+ // Private properties
+ _lifecycleStateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLLifecycleStateDisconnected states:[self.class sdl_stateTransitionDictionary]];
+ _lastCorrelationId = 0;
+ _notificationDispatcher = [[SDLNotificationDispatcher alloc] init];
+ _responseDispatcher = [[SDLResponseDispatcher alloc] initWithNotificationDispatcher:_notificationDispatcher];
+ _registerResponse = nil;
+
+ // Managers
+ _fileManager = [[SDLFileManager alloc] initWithConnectionManager:self];
+ _permissionManager = [[SDLPermissionManager alloc] init];
+ _lockScreenManager = [[SDLLockScreenManager alloc] initWithConfiguration:_configuration.lockScreenConfig notificationDispatcher:_notificationDispatcher presenter:[[SDLLockScreenPresenter alloc] init]];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(transportDidConnect) name:SDLTransportDidConnect object:_notificationDispatcher];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(transportDidDisconnect) name:SDLTransportDidDisconnect object:_notificationDispatcher];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hmiStatusDidChange:) name:SDLDidChangeHMIStatusNotification object:_notificationDispatcher];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(remoteHardwareDidUnregister:) name:SDLDidReceiveAppUnregisteredNotification object:_notificationDispatcher];
+
+ return self;
+}
+
+- (void)startWithReadyHandler:(SDLManagerReadyBlock)readyHandler {
+ self.readyHandler = [readyHandler copy];
+
+ // Set up our logging capabilities based on the config
+ [self.class sdl_updateLoggingWithFlags:self.configuration.lifecycleConfig.logFlags];
+
+// Start up the internal proxy object
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ if (self.configuration.lifecycleConfig.tcpDebugMode) {
+ self.proxy = [SDLProxyFactory buildSDLProxyWithListener:self.notificationDispatcher tcpIPAddress:self.configuration.lifecycleConfig.tcpDebugIPAddress tcpPort:[@(self.configuration.lifecycleConfig.tcpDebugPort) stringValue]];
+ } else {
+ self.proxy = [SDLProxyFactory buildSDLProxyWithListener:self.notificationDispatcher];
+ }
+#pragma clang diagnostic pop
+}
+
+- (void)stop {
+ if ([self.lifecycleStateMachine isCurrentState:SDLLifecycleStateReady]) {
+ [self.lifecycleStateMachine transitionToState:SDLLifecycleStateUnregistering];
+ } else {
+ [self.lifecycleStateMachine transitionToState:SDLLifecycleStateDisconnected];
+ }
+}
+
+
+#pragma mark Getters
+
+- (nullable SDLStreamingMediaManager *)streamManager {
+ return self.proxy.streamingMediaManager;
+}
+
+- (SDLState *)lifecycleState {
+ return self.lifecycleStateMachine.currentState;
+}
+
+
+#pragma mark State Machine
+
++ (NSDictionary<SDLState *, SDLAllowableStateTransitions *> *)sdl_stateTransitionDictionary {
+ return @{
+ SDLLifecycleStateDisconnected: @[SDLLifecycleStateTransportConnected],
+ SDLLifecycleStateTransportConnected: @[SDLLifecycleStateDisconnected, SDLLifecycleStateRegistered],
+ SDLLifecycleStateRegistered: @[SDLLifecycleStateDisconnected, SDLLifecycleStateSettingUpManagers],
+ SDLLifecycleStateSettingUpManagers: @[SDLLifecycleStateDisconnected, SDLLifecycleStatePostManagerProcessing],
+ SDLLifecycleStatePostManagerProcessing: @[SDLLifecycleStateDisconnected, SDLLifecycleStateReady],
+ SDLLifecycleStateUnregistering: @[SDLLifecycleStateDisconnected],
+ SDLLifecycleStateReady: @[SDLLifecycleStateUnregistering, SDLLifecycleStateDisconnected]
+ };
+}
+
+- (void)didEnterStateTransportDisconnected {
+ [self.fileManager stop];
+ [self.permissionManager stop];
+ [self.lockScreenManager stop];
+ [self.responseDispatcher clear];
+
+ self.registerResponse = nil;
+ self.lastCorrelationId = 0;
+ self.hmiLevel = nil;
+
+ [self sdl_disposeProxy]; // call this method instead of stopProxy to avoid double-dispatching
+ [self.delegate managerDidDisconnect];
+
+ [self startWithReadyHandler:self.readyHandler]; // Start up again to start watching for new connections
+}
+
+- (void)didEnterStateTransportConnected {
+ // If we have security managers, add them to the proxy
+ if (self.configuration.lifecycleConfig.securityManagers != nil) {
+ [self.proxy addSecurityManagers:self.configuration.lifecycleConfig.securityManagers forAppId:self.configuration.lifecycleConfig.appId];
+ }
+
+ // Build a register app interface request with the configuration data
+ SDLRegisterAppInterface *regRequest = [[SDLRegisterAppInterface alloc] initWithLifecycleConfiguration:self.configuration.lifecycleConfig];
+
+ // Send the request and depending on the response, post the notification
+ __weak typeof(self) weakSelf = self;
+ [self sdl_sendRequest:regRequest
+ withResponseHandler:^(__kindof SDLRPCRequest *_Nullable request, __kindof SDLRPCResponse *_Nullable response, NSError *_Nullable error) {
+ if (error != nil || ![response.success boolValue]) {
+ [SDLDebugTool logFormat:@"Failed to register the app. Error: %@, Response: %@", error, response];
+ [weakSelf.lifecycleStateMachine transitionToState:SDLLifecycleStateDisconnected];
+ return;
+ }
+
+ weakSelf.registerResponse = (SDLRegisterAppInterfaceResponse *)response;
+ [weakSelf.lifecycleStateMachine transitionToState:SDLLifecycleStateRegistered];
+ }];
+}
+
+- (void)didEnterStateRegistered {
+ [self.lifecycleStateMachine transitionToState:SDLLifecycleStateSettingUpManagers];
+}
+
+- (void)didEnterStateSettingUpManagers {
+ dispatch_group_t managerGroup = dispatch_group_create();
+
+ // Make sure there's at least one group_enter until we have synchronously run through all the startup calls
+ dispatch_group_enter(managerGroup);
+
+ [self.lockScreenManager start];
+
+ dispatch_group_enter(managerGroup);
+ [self.fileManager startWithCompletionHandler:^(BOOL success, NSError *_Nullable error) {
+ if (!success) {
+ [SDLDebugTool logFormat:@"File manager was unable to start; error: %@", error];
+ }
+
+ dispatch_group_leave(managerGroup);
+ }];
+
+ dispatch_group_enter(managerGroup);
+ [self.permissionManager startWithCompletionHandler:^(BOOL success, NSError *_Nullable error) {
+ if (!success) {
+ [SDLDebugTool logFormat:@"Permission manager was unable to start; error: %@", error];
+ }
+
+ dispatch_group_leave(managerGroup);
+ }];
+
+ // We're done synchronously calling all startup methods, so we can now wait.
+ dispatch_group_leave(managerGroup);
+
+ // When done, we want to transition, even if there were errors. They may be expected, e.g. on head units that do not support files.
+ dispatch_group_notify(managerGroup, dispatch_get_main_queue(), ^{
+ [self.lifecycleStateMachine transitionToState:SDLLifecycleStatePostManagerProcessing];
+ });
+}
+
+- (void)didEnterStatePostManagerProcessing {
+ // We only want to send the app icon when the file manager is complete, and when that's done, set the state to ready
+ [self sdl_sendAppIcon:self.configuration.lifecycleConfig.appIcon
+ withCompletion:^{
+ [self.lifecycleStateMachine transitionToState:SDLLifecycleStateReady];
+ }];
+}
+
+- (void)didEnterStateReady {
+ SDLResult *registerResult = self.registerResponse.resultCode;
+ NSString *registerInfo = self.registerResponse.info;
+
+ BOOL success = NO;
+ NSError *startError = nil;
+
+
+ if ([registerResult isEqualToEnum:[SDLResult WARNINGS]] || [registerResult isEqualToEnum:[SDLResult RESUME_FAILED]]) {
+ // We succeeded, but with warnings
+ startError = [NSError sdl_lifecycle_startedWithBadResult:registerResult info:registerInfo];
+ success = YES;
+ } else if (![registerResult isEqualToEnum:[SDLResult SUCCESS]]) {
+ // We did not succeed in registering
+ startError = [NSError sdl_lifecycle_failedWithBadResult:registerResult info:registerInfo];
+ success = NO;
+ } else {
+ // We succeeded
+ success = YES;
+ }
+
+ // Notify the block, send the notification if we succeeded.
+ self.readyHandler(success, startError);
+
+ if (!success) {
+ [self.lifecycleStateMachine transitionToState:SDLLifecycleStateReady];
+ return;
+ }
+
+ [self.notificationDispatcher postNotificationName:SDLDidBecomeReady infoObject:nil];
+
+ // Send the hmi level going from NONE to whatever we're at now (could still be NONE)
+ [self.delegate hmiLevel:[SDLHMILevel NONE] didChangeToLevel:self.hmiLevel];
+}
+
+- (void)didEnterStateUnregistering {
+ SDLUnregisterAppInterface *unregisterRequest = [[SDLUnregisterAppInterface alloc] init];
+
+ __weak typeof(self) weakSelf = self;
+ [self sdl_sendRequest:unregisterRequest
+ withResponseHandler:^(__kindof SDLRPCRequest *_Nullable request, __kindof SDLRPCResponse *_Nullable response, NSError *_Nullable error) {
+ if (error != nil || ![response.success boolValue]) {
+ [SDLDebugTool logFormat:@"SDL Error unregistering, we are going to hard disconnect: %@, response: %@", error, response];
+ }
+
+ [weakSelf.lifecycleStateMachine transitionToState:SDLLifecycleStateDisconnected];
+ }];
+}
+
+
+#pragma mark Post Manager Setup Processing
+
+- (void)sdl_sendAppIcon:(nullable SDLFile *)appIcon withCompletion:(void (^)(void))completion {
+ // If no app icon was set, just move on to ready
+ if (appIcon == nil) {
+ completion();
+ return;
+ }
+
+ [self.fileManager uploadFile:appIcon
+ completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError *_Nullable error) {
+ // These errors could be recoverable (particularly "cannot overwrite"), so we'll still attempt to set the app icon
+ if (error != nil) {
+ if (error.code == SDLFileManagerErrorCannotOverwrite) {
+ [SDLDebugTool logInfo:@"Failed to upload app icon: A file with this name already exists on the system"];
+ } else {
+ [SDLDebugTool logFormat:@"Unexpected error uploading app icon: %@", error];
+ return;
+ }
+ }
+
+ // Once we've tried to put the file on the remote system, try to set the app icon
+ SDLSetAppIcon *setAppIcon = [[SDLSetAppIcon alloc] init];
+ setAppIcon.syncFileName = appIcon.name;
+
+ [self sdl_sendRequest:setAppIcon
+ withResponseHandler:^(__kindof SDLRPCRequest *_Nullable request, __kindof SDLRPCResponse *_Nullable response, NSError *_Nullable error) {
+ if (error != nil) {
+ [SDLDebugTool logFormat:@"Error setting app icon: ", error];
+ }
+
+ // We've succeeded or failed
+ completion();
+ }];
+ }];
+}
+
+
+#pragma mark Sending Requests
+
+- (void)sendRequest:(SDLRPCRequest *)request {
+ [self sendRequest:request withResponseHandler:nil];
+}
+
+- (void)sendRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
+ if (![self.lifecycleStateMachine isCurrentState:SDLLifecycleStateReady]) {
+ [SDLDebugTool logInfo:@"Manager not ready, message not sent"];
+ if (handler) {
+ handler(request, nil, [NSError sdl_lifecycle_notReadyError]);
+ }
+
+ return;
+ }
+
+ [self sdl_sendRequest:request withResponseHandler:handler];
+}
+
+// Managers need to avoid state checking. Part of <SDLConnectionManagerType>.
+- (void)sendManagerRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)block {
+ [self sdl_sendRequest:request withResponseHandler:block];
+}
+
+- (void)sdl_sendRequest:(SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
+ // We will allow things to be sent in a "SDLLifeCycleStateTransportConnected" state in the private method, but block it in the public method sendRequest:withCompletionHandler: so that the lifecycle manager can complete its setup without being bothered by developer error
+
+ // Add a correlation ID to the request
+ NSNumber *corrID = [self sdl_getNextCorrelationId];
+ request.correlationID = corrID;
+
+ [self.responseDispatcher storeRequest:request handler:handler];
+ [self.proxy sendRPC:request];
+}
+
+
+#pragma mark Helper Methods
+
+- (void)sdl_disposeProxy {
+ [SDLDebugTool logInfo:@"Stop Proxy"];
+ [self.proxy dispose];
+ self.proxy = nil;
+}
+
+- (NSNumber *)sdl_getNextCorrelationId {
+ if (self.lastCorrelationId == UINT16_MAX) {
+ self.lastCorrelationId = 0;
+ }
+
+ return @(++self.lastCorrelationId);
+}
+
++ (BOOL)sdl_checkNotification:(NSNotification *)notification containsKindOfClass:(Class) class {
+ NSAssert([notification.userInfo[SDLNotificationUserInfoObject] isKindOfClass:class], @"A notification was sent with an unanticipated object");
+ if (![notification.userInfo[SDLNotificationUserInfoObject] isKindOfClass:class]) {
+ return NO;
+ }
+
+ return YES;
+}
+
+ + (void)sdl_updateLoggingWithFlags : (SDLLogOutput)logFlags {
+ [SDLDebugTool disable];
+
+ if ((logFlags & SDLLogOutputConsole) == SDLLogOutputConsole) {
+ [SDLDebugTool enable];
+ }
+
+ if ((logFlags & SDLLogOutputFile) == SDLLogOutputFile) {
+ [SDLDebugTool enableDebugToLogFile];
+ } else {
+ [SDLDebugTool disableDebugToLogFile];
+ }
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ if ((logFlags & SDLLogOutputSiphon) == SDLLogOutputSiphon) {
+ [SDLProxy enableSiphonDebug];
+ } else {
+ [SDLProxy disableSiphonDebug];
+ }
+#pragma clang diagnostic pop
+}
+
+
+#pragma mark SDL notification observers
+
+- (void)transportDidConnect {
+ [self.lifecycleStateMachine transitionToState:SDLLifecycleStateTransportConnected];
+}
+
+- (void)transportDidDisconnect {
+ [self.lifecycleStateMachine transitionToState:SDLLifecycleStateDisconnected];
+}
+
+- (void)hmiStatusDidChange:(SDLRPCNotificationNotification *)notification {
+ if (![self.class sdl_checkNotification:notification containsKindOfClass:[SDLOnHMIStatus class]]) {
+ return;
+ }
+
+ SDLOnHMIStatus *hmiStatusNotification = notification.notification;
+ SDLHMILevel *oldHMILevel = self.hmiLevel;
+ self.hmiLevel = hmiStatusNotification.hmiLevel;
+
+ if (![self.lifecycleStateMachine isCurrentState:SDLLifecycleStateReady]) {
+ return;
+ }
+
+ [self.delegate hmiLevel:oldHMILevel didChangeToLevel:self.hmiLevel];
+}
+
+- (void)remoteHardwareDidUnregister:(SDLRPCNotificationNotification *)notification {
+ if (![self.class sdl_checkNotification:notification containsKindOfClass:[SDLOnAppInterfaceUnregistered class]]) {
+ return;
+ }
+
+ SDLOnAppInterfaceUnregistered *appUnregisteredNotification = notification.notification;
+ [SDLDebugTool logFormat:@"Remote Device forced unregistration for reason: %@", appUnregisteredNotification.reason];
+
+ [self.lifecycleStateMachine transitionToState:SDLLifecycleStateDisconnected];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLListFilesOperation.h b/SmartDeviceLink/SDLListFilesOperation.h
new file mode 100644
index 000000000..9107ef758
--- /dev/null
+++ b/SmartDeviceLink/SDLListFilesOperation.h
@@ -0,0 +1,33 @@
+//
+// SDLListFilesOperation.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 5/25/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLAsynchronousOperation.h"
+#import "SDLFileManagerConstants.h"
+
+@protocol SDLConnectionManagerType;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLListFilesOperation : SDLAsynchronousOperation
+
+/**
+ * Create an instance of a list files operation which will ask the remote system which files it has on its system already.
+ *
+ * @param connectionManager The connection manager which will handle transporting the request to the remote system.
+ * @param completionHandler A completion handler for when the response returns.
+ *
+ * @return An instance of SDLListFilesOperation
+ */
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager completionHandler:(nullable SDLFileManagerListFilesCompletionHandler)completionHandler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLListFilesOperation.m b/SmartDeviceLink/SDLListFilesOperation.m
new file mode 100644
index 000000000..4fbc067fa
--- /dev/null
+++ b/SmartDeviceLink/SDLListFilesOperation.m
@@ -0,0 +1,78 @@
+//
+// SDLListFilesOperation.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 5/25/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLListFilesOperation.h"
+
+#import "SDLConnectionManagerType.h"
+#import "SDLListFiles.h"
+#import "SDLListFilesResponse.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLListFilesOperation ()
+
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (copy, nonatomic, nullable) SDLFileManagerListFilesCompletionHandler completionHandler;
+
+@end
+
+
+@implementation SDLListFilesOperation
+
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager completionHandler:(nullable SDLFileManagerListFilesCompletionHandler)completionHandler {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _connectionManager = connectionManager;
+ _completionHandler = completionHandler;
+
+ return self;
+}
+
+- (void)start {
+ [super start];
+
+ [self sdl_listFiles];
+}
+
+- (void)sdl_listFiles {
+ SDLListFiles *listFiles = [[SDLListFiles alloc] init];
+
+ __weak typeof(self) weakSelf = self;
+ [self.connectionManager sendManagerRequest:listFiles
+ withResponseHandler:^(__kindof SDLRPCRequest *request, __kindof SDLRPCResponse *response, NSError *error) {
+ SDLListFilesResponse *listFilesResponse = (SDLListFilesResponse *)response;
+ BOOL success = [listFilesResponse.success boolValue];
+ NSUInteger bytesAvailable = [listFilesResponse.spaceAvailable unsignedIntegerValue];
+ NSArray<NSString *> *fileNames = [NSArray arrayWithArray:listFilesResponse.filenames];
+
+ if (weakSelf.completionHandler != nil) {
+ weakSelf.completionHandler(success, bytesAvailable, fileNames, error);
+ }
+
+ [weakSelf finishOperation];
+ }];
+}
+
+
+#pragma mark Property Overrides
+
+- (nullable NSString *)name {
+ return @"List Files";
+}
+
+- (NSOperationQueuePriority)queuePriority {
+ return NSOperationQueuePriorityVeryHigh;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLLockScreenConfiguration.h b/SmartDeviceLink/SDLLockScreenConfiguration.h
new file mode 100644
index 000000000..4bf55e9a0
--- /dev/null
+++ b/SmartDeviceLink/SDLLockScreenConfiguration.h
@@ -0,0 +1,80 @@
+//
+// SDLLockScreenConfiguration.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/13/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+@import UIKit;
+
+#import <Foundation/Foundation.h>
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLockScreenConfiguration : NSObject <NSCopying>
+
+/**
+ * Whether or not the lock screen should be shown in the "lock screen optional" state. Defaults to 'NO'.
+ */
+@property (assign, nonatomic) BOOL showInOptionalState;
+
+/**
+ * If YES, the lock screen should be managed by SDL and automatically engage when necessary. If NO, then the lock screen will never be engaged.
+ */
+@property (assign, nonatomic, readonly) BOOL enableAutomaticLockScreen;
+
+/**
+ * The background color of the lock screen. This could be a branding color, or leave at the default for a dark blue-gray.
+ */
+@property (copy, nonatomic, readonly) UIColor *backgroundColor;
+
+/**
+ * Your app icon as it will appear on the lock screen.
+ */
+@property (copy, nonatomic, readonly, nullable) UIImage *appIcon;
+
+/**
+ * A custom view controller that the lock screen will manage the presentation of.
+ */
+@property (strong, nonatomic, readonly, nullable) UIViewController *customViewController;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/**
+ * 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.
+ *
+ * @return The configuration
+ */
++ (instancetype)disabledConfiguration;
+
+/**
+ * Use this configuration for the basic default lock screen. A custom app icon will not be used.
+ *
+ * @return The configuration
+ */
++ (instancetype)enabledConfiguration;
+
+/**
+ * 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.
+ *
+ * @param lockScreenAppIcon The app icon to be shown on the lock screen
+ * @param lockScreenBackgroundColor The color of the lock screen background
+ *
+ * @return The configuration
+ */
++ (instancetype)enabledConfigurationWithAppIcon:(UIImage *)lockScreenAppIcon backgroundColor:(nullable UIColor *)lockScreenBackgroundColor;
+
+/**
+ * Use this configuration if you wish to provide your own view controller for the lock screen. This view controller'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.
+ *
+ * @param viewController The view controller to be managed
+ *
+ * @return The configuration
+ */
++ (instancetype)enabledConfigurationWithViewController:(UIViewController *)viewController;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLockScreenConfiguration.m b/SmartDeviceLink/SDLLockScreenConfiguration.m
new file mode 100644
index 000000000..4f82c287a
--- /dev/null
+++ b/SmartDeviceLink/SDLLockScreenConfiguration.m
@@ -0,0 +1,80 @@
+//
+// SDLLockScreenConfiguration.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/13/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLLockScreenConfiguration.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLockScreenConfiguration ()
+
+@end
+
+
+@implementation SDLLockScreenConfiguration
+
+#pragma mark - Lifecycle
+
+- (instancetype)initWithAutoLockScreen:(BOOL)enableAutomatic enableInOptional:(BOOL)enableOptional backgroundColor:(UIColor *)backgroundColor appIcon:(nullable UIImage *)appIcon viewController:(nullable UIViewController *)customViewController {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _enableAutomaticLockScreen = enableAutomatic;
+ _showInOptionalState = enableOptional;
+ _backgroundColor = backgroundColor;
+ _appIcon = appIcon;
+ _customViewController = customViewController;
+
+ return self;
+}
+
++ (instancetype)disabledConfiguration {
+ return [[self alloc] initWithAutoLockScreen:NO enableInOptional:NO backgroundColor:[self sdl_defaultBackgroundColor] appIcon:nil viewController:nil];
+}
+
++ (instancetype)enabledConfiguration {
+ return [[self alloc] initWithAutoLockScreen:YES enableInOptional:NO backgroundColor:[self sdl_defaultBackgroundColor] appIcon:nil viewController:nil];
+}
+
++ (instancetype)enabledConfigurationWithAppIcon:(UIImage *)lockScreenAppIcon backgroundColor:(nullable UIColor *)lockScreenBackgroundColor {
+ if (lockScreenBackgroundColor == nil) {
+ lockScreenBackgroundColor = [self.class sdl_defaultBackgroundColor];
+ }
+
+ return [[self alloc] initWithAutoLockScreen:YES enableInOptional:NO backgroundColor:lockScreenBackgroundColor appIcon:lockScreenAppIcon viewController:nil];
+}
+
++ (instancetype)enabledConfigurationWithViewController:(UIViewController *)viewController {
+ return [[self alloc] initWithAutoLockScreen:YES enableInOptional:NO backgroundColor:[self.class sdl_defaultBackgroundColor] appIcon:nil viewController:viewController];
+}
+
+
+#pragma mark - Defaults
+
++ (UIColor *)sdl_defaultBackgroundColor {
+ return [UIColor colorWithRed:(57.0 / 255.0) green:(78.0 / 255.0) blue:(96.0 / 255.0) alpha:1.0];
+}
+
+
+#pragma mark - NSCopying
+
+- (id)copyWithZone:(nullable NSZone *)zone {
+ SDLLockScreenConfiguration *new = [[SDLLockScreenConfiguration allocWithZone:zone] initWithAutoLockScreen : _enableAutomaticLockScreen
+ enableInOptional : _showInOptionalState
+ backgroundColor : _backgroundColor
+ appIcon : _appIcon
+ viewController : _customViewController];
+
+ return new;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLockScreenManager.h b/SmartDeviceLink/SDLLockScreenManager.h
index ee8750e83..f709c53ee 100644
--- a/SmartDeviceLink/SDLLockScreenManager.h
+++ b/SmartDeviceLink/SDLLockScreenManager.h
@@ -1,21 +1,60 @@
//
// SDLLockScreenManager.h
-// SmartDeviceLink
+// SmartDeviceLink-iOS
//
+// Created by Joel Fischer on 7/8/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
-#import <Foundation/Foundation.h>
+@class SDLLockScreenConfiguration;
+@class SDLLockScreenViewController;
+@protocol SDLViewControllerPresentable;
-@class SDLHMILevel;
-@class SDLLockScreenStatus;
-@class SDLOnLockScreenStatus;
+NS_ASSUME_NONNULL_BEGIN
@interface SDLLockScreenManager : NSObject
-@property (assign, nonatomic) BOOL userSelected;
-@property (assign, nonatomic) BOOL driverDistracted;
-@property (strong, nonatomic) SDLHMILevel *hmiLevel;
-@property (strong, nonatomic, readonly) SDLLockScreenStatus *lockScreenStatus;
-@property (strong, nonatomic, readonly) SDLOnLockScreenStatus *lockScreenStatusNotification;
+/**
+ * Whether or not the lock screen is currently presented
+ */
+@property (assign, nonatomic, readonly) BOOL lockScreenPresented;
+
+/**
+ * The lock screen configuration used to set up the manager
+ */
+@property (strong, nonatomic, readonly) SDLLockScreenConfiguration *config;
+
+/**
+ * The view controller to be shown as a lock screen.
+ */
+@property (strong, nonatomic, readonly, nullable) UIViewController *lockScreenViewController;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+/**
+ * Create a new instance of `SDLLockScreenManager`.
+ *
+ * @param config The config to set up the manager.
+ * @param dispatcher The notification dispatcher used to watch only for SDL notifications from it.
+ * @param presenter The presenter which will handle actually presenting the lock screen view controller.
+ *
+ * @return An instance of `SDLLockScreenManager`.
+ */
+- (instancetype)initWithConfiguration:(SDLLockScreenConfiguration *)config notificationDispatcher:(nullable id)dispatcher presenter:(id<SDLViewControllerPresentable>)presenter;
+
+/**
+ * Start the manager. This is used internally.
+ */
+- (void)start;
+
+/**
+ * Stop the manager. This is used internally.
+ */
+- (void)stop;
@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLockScreenManager.m b/SmartDeviceLink/SDLLockScreenManager.m
index 71bb82369..da3f506c4 100644
--- a/SmartDeviceLink/SDLLockScreenManager.m
+++ b/SmartDeviceLink/SDLLockScreenManager.m
@@ -1,95 +1,139 @@
//
// SDLLockScreenManager.m
-// SmartDeviceLink
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/8/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
//
#import "SDLLockScreenManager.h"
-#import "SDLHMILevel.h"
+#import "NSBundle+SDLBundle.h"
+#import "SDLDebugTool.h"
+#import "SDLLockScreenConfiguration.h"
#import "SDLLockScreenStatus.h"
+#import "SDLLockScreenViewController.h"
+#import "SDLNotificationConstants.h"
#import "SDLOnLockScreenStatus.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLViewControllerPresentable.h"
+
+NS_ASSUME_NONNULL_BEGIN
@interface SDLLockScreenManager ()
-@property (assign, nonatomic) BOOL haveDriverDistractionStatus;
+@property (assign, nonatomic) BOOL canPresent;
+@property (strong, nonatomic, readwrite) SDLLockScreenConfiguration *config;
+@property (strong, nonatomic) id<SDLViewControllerPresentable> presenter;
@end
@implementation SDLLockScreenManager
-#pragma mark - Lifecycle
-
-- (instancetype)init {
+- (instancetype)initWithConfiguration:(SDLLockScreenConfiguration *)config notificationDispatcher:(nullable id)dispatcher presenter:(id<SDLViewControllerPresentable>)presenter {
self = [super init];
- if (self) {
- _userSelected = NO;
- _driverDistracted = NO;
- _haveDriverDistractionStatus = NO;
+ if (!self) {
+ return nil;
}
+
+ _canPresent = NO;
+ _config = config;
+ _presenter = presenter;
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_lockScreenStatusDidChange:) name:SDLDidChangeLockScreenStatusNotification object:dispatcher];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_lockScreenIconReceived:) name:SDLDidReceiveLockScreenIcon object:dispatcher];
+
return self;
}
+- (void)start {
+ self.canPresent = NO;
-#pragma mark - Getters / Setters
-#pragma mark Custom setters
+ // Create and initialize the lock screen controller depending on the configuration
+ if (!self.config.enableAutomaticLockScreen) {
+ self.presenter.viewController = nil;
-- (void)setDriverDistracted:(BOOL)driverDistracted {
- _driverDistracted = driverDistracted;
- _haveDriverDistractionStatus = YES;
-}
+ return;
+ } else if (self.config.customViewController != nil) {
+ self.presenter.viewController = self.config.customViewController;
+ } else {
+ SDLLockScreenViewController *viewController = nil;
-- (void)setHmiLevel:(SDLHMILevel *)hmiLevel {
- if (_hmiLevel != hmiLevel) {
- _hmiLevel = hmiLevel;
- }
+ @try {
+ viewController = [[UIStoryboard storyboardWithName:@"SDLLockScreen" bundle:[NSBundle sdlBundle]] instantiateInitialViewController];
+ } @catch (NSException *exception) {
+ [SDLDebugTool logInfo:@"SDL Error: Attempted to instantiate the default SDL Lock Screen and could not find the storyboard. Be sure the 'SmartDeviceLink' bundle is within your main bundle. We're just going to return without instantiating the lock screen."];
+ return;
+ }
- if ([hmiLevel isEqualToEnum:[SDLHMILevel FULL]] || [hmiLevel isEqualToEnum:[SDLHMILevel LIMITED]]) {
- self.userSelected = YES;
- } else if ([hmiLevel isEqualToEnum:[SDLHMILevel NONE]]) {
- self.userSelected = NO;
+ viewController.appIcon = self.config.appIcon;
+ viewController.backgroundColor = self.config.backgroundColor;
+ self.presenter.viewController = viewController;
}
-}
+ self.canPresent = YES;
+}
-#pragma mark Custom Getters
+- (void)stop {
+ self.canPresent = NO;
-- (SDLOnLockScreenStatus *)lockScreenStatusNotification {
- SDLOnLockScreenStatus *notification = [[SDLOnLockScreenStatus alloc] init];
- notification.driverDistractionStatus = @(self.driverDistracted);
- notification.hmiLevel = self.hmiLevel;
- notification.userSelected = @(self.userSelected);
- notification.lockScreenStatus = self.lockScreenStatus;
+ // Remove the lock screen if presented, don't allow it to present again until we start
+ [self.presenter dismiss];
+}
- return notification;
+- (nullable UIViewController *)lockScreenViewController {
+ return self.presenter.viewController;
}
-- (SDLLockScreenStatus *)lockScreenStatus {
- if (self.hmiLevel == nil || [self.hmiLevel isEqualToEnum:[SDLHMILevel NONE]]) {
- // App is not active on the car
- return [SDLLockScreenStatus OFF];
- } else if ([self.hmiLevel isEqualToEnum:[SDLHMILevel BACKGROUND]]) {
- // App is in the background on the car
- // The lockscreen depends entirely on if the user selected the app
- if (self.userSelected) {
- return [SDLLockScreenStatus REQUIRED];
- } else {
- return [SDLLockScreenStatus OFF];
+
+#pragma mark - Notification Selectors
+
+- (void)sdl_lockScreenStatusDidChange:(SDLRPCNotificationNotification *)notification {
+ NSAssert([notification.notification isKindOfClass:[SDLOnLockScreenStatus class]], @"A notification was sent with an unanticipated object");
+ if (![notification.notification isKindOfClass:[SDLOnLockScreenStatus class]]) {
+ return;
+ }
+
+ if (self.lockScreenViewController == nil) {
+ return;
+ }
+
+ SDLOnLockScreenStatus *onLockScreenNotification = notification.notification;
+
+ // Present the VC depending on the lock screen status
+ if ([onLockScreenNotification.lockScreenStatus isEqualToEnum:[SDLLockScreenStatus REQUIRED]]) {
+ if (!self.presenter.presented && self.canPresent) {
+ [self.presenter present];
}
- } else if ([self.hmiLevel isEqualToEnum:[SDLHMILevel FULL]] || [self.hmiLevel isEqualToEnum:[SDLHMILevel LIMITED]]) {
- // App is in the foreground on the car in some manner
- if (self.haveDriverDistractionStatus && !self.driverDistracted) {
- // We have the distraction status, and the driver is not distracted
- return [SDLLockScreenStatus OPTIONAL];
- } else {
- // We don't have the distraction status, and/or the driver is distracted
- return [SDLLockScreenStatus REQUIRED];
+ } else if ([onLockScreenNotification.lockScreenStatus isEqualToEnum:[SDLLockScreenStatus OPTIONAL]]) {
+ if (self.config.showInOptionalState && !self.presenter.presented && self.canPresent) {
+ [self.presenter present];
+ } else if (self.presenter.presented) {
+ [self.presenter dismiss];
+ }
+ } else if ([onLockScreenNotification.lockScreenStatus isEqualToEnum:[SDLLockScreenStatus OFF]]) {
+ if (self.presenter.presented) {
+ [self.presenter dismiss];
}
- } else {
- // This shouldn't be possible.
- return [SDLLockScreenStatus OFF];
+ }
+}
+
+- (void)sdl_lockScreenIconReceived:(NSNotification *)notification {
+ NSAssert([notification.userInfo[SDLNotificationUserInfoObject] isKindOfClass:[UIImage class]], @"A notification was sent with an unanticipated object");
+ if (![notification.userInfo[SDLNotificationUserInfoObject] isKindOfClass:[UIImage class]]) {
+ return;
+ }
+
+ UIImage *icon = notification.userInfo[SDLNotificationUserInfoObject];
+
+ // If the VC is our special type, then add the vehicle icon. If they passed in a custom VC, there's no current way to show the vehicle icon. If they're managing it themselves, they can grab the notification themselves.
+ if ([self.lockScreenViewController isKindOfClass:[SDLLockScreenViewController class]]) {
+ ((SDLLockScreenViewController *)self.lockScreenViewController).vehicleIcon = icon;
}
}
@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLLockScreenPresenter.h b/SmartDeviceLink/SDLLockScreenPresenter.h
new file mode 100644
index 000000000..d8af89ddd
--- /dev/null
+++ b/SmartDeviceLink/SDLLockScreenPresenter.h
@@ -0,0 +1,32 @@
+//
+// SDLLockScreenPresenter.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/15/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLViewControllerPresentable.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * An instance of `SDLViewControllerPresentable` used in production (not testing) for presenting the SDL lock screen.
+ */
+@interface SDLLockScreenPresenter : NSObject <SDLViewControllerPresentable>
+
+/**
+ * The view controller to be presented.
+ */
+@property (strong, nonatomic) UIViewController *viewController;
+
+/**
+ * Whether or not `viewController` is currently presented.
+ */
+@property (assign, nonatomic, readonly) BOOL presented;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLLockScreenPresenter.m b/SmartDeviceLink/SDLLockScreenPresenter.m
new file mode 100644
index 000000000..024dd36c7
--- /dev/null
+++ b/SmartDeviceLink/SDLLockScreenPresenter.m
@@ -0,0 +1,57 @@
+//
+// SDLLockScreenPresenter.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/15/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLLockScreenPresenter.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLockScreenPresenter ()
+
+@end
+
+
+@implementation SDLLockScreenPresenter
+
+- (void)present {
+ if (!self.viewController) {
+ return;
+ }
+
+ [[self.class sdl_getCurrentViewController] presentViewController:self.viewController animated:YES completion:nil];
+}
+
+- (void)dismiss {
+ if (!self.viewController) {
+ return;
+ }
+
+ [self.viewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
+}
+
+- (BOOL)presented {
+ if (!self.viewController) {
+ return NO;
+ }
+
+ return (self.viewController.isViewLoaded && self.viewController.view.window);
+}
+
++ (UIViewController *)sdl_getCurrentViewController {
+ // http://stackoverflow.com/questions/6131205/iphone-how-to-find-topmost-view-controller
+ UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
+ while (topController.presentedViewController != nil) {
+ topController = topController.presentedViewController;
+ }
+
+ return topController;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLLockScreenStatusManager.h b/SmartDeviceLink/SDLLockScreenStatusManager.h
new file mode 100644
index 000000000..0467b2171
--- /dev/null
+++ b/SmartDeviceLink/SDLLockScreenStatusManager.h
@@ -0,0 +1,21 @@
+//
+// SDLLockScreenManager.h
+// SmartDeviceLink
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLHMILevel;
+@class SDLLockScreenStatus;
+@class SDLOnLockScreenStatus;
+
+
+@interface SDLLockScreenStatusManager : NSObject
+
+@property (assign, nonatomic) BOOL userSelected;
+@property (assign, nonatomic) BOOL driverDistracted;
+@property (strong, nonatomic) SDLHMILevel *hmiLevel;
+@property (strong, nonatomic, readonly) SDLLockScreenStatus *lockScreenStatus;
+@property (strong, nonatomic, readonly) SDLOnLockScreenStatus *lockScreenStatusNotification;
+
+@end
diff --git a/SmartDeviceLink/SDLLockScreenStatusManager.m b/SmartDeviceLink/SDLLockScreenStatusManager.m
new file mode 100644
index 000000000..86350b0d0
--- /dev/null
+++ b/SmartDeviceLink/SDLLockScreenStatusManager.m
@@ -0,0 +1,95 @@
+//
+// SDLLockScreenManager.m
+// SmartDeviceLink
+//
+
+#import "SDLLockScreenStatusManager.h"
+
+#import "SDLHMILevel.h"
+#import "SDLLockScreenStatus.h"
+#import "SDLOnLockScreenStatus.h"
+
+
+@interface SDLLockScreenStatusManager ()
+
+@property (assign, nonatomic) BOOL haveDriverDistractionStatus;
+
+@end
+
+
+@implementation SDLLockScreenStatusManager
+
+#pragma mark - Lifecycle
+
+- (instancetype)init {
+ self = [super init];
+ if (self) {
+ _userSelected = NO;
+ _driverDistracted = NO;
+ _haveDriverDistractionStatus = NO;
+ }
+ return self;
+}
+
+
+#pragma mark - Getters / Setters
+#pragma mark Custom setters
+
+- (void)setDriverDistracted:(BOOL)driverDistracted {
+ _driverDistracted = driverDistracted;
+ _haveDriverDistractionStatus = YES;
+}
+
+- (void)setHmiLevel:(SDLHMILevel *)hmiLevel {
+ if (_hmiLevel != hmiLevel) {
+ _hmiLevel = hmiLevel;
+ }
+
+ if ([hmiLevel isEqualToEnum:[SDLHMILevel FULL]] || [hmiLevel isEqualToEnum:[SDLHMILevel LIMITED]]) {
+ self.userSelected = YES;
+ } else if ([hmiLevel isEqualToEnum:[SDLHMILevel NONE]]) {
+ self.userSelected = NO;
+ }
+}
+
+
+#pragma mark Custom Getters
+
+- (SDLOnLockScreenStatus *)lockScreenStatusNotification {
+ SDLOnLockScreenStatus *notification = [[SDLOnLockScreenStatus alloc] init];
+ notification.driverDistractionStatus = @(self.driverDistracted);
+ notification.hmiLevel = self.hmiLevel;
+ notification.userSelected = @(self.userSelected);
+ notification.lockScreenStatus = self.lockScreenStatus;
+
+ return notification;
+}
+
+- (SDLLockScreenStatus *)lockScreenStatus {
+ if (self.hmiLevel == nil || [self.hmiLevel isEqualToEnum:[SDLHMILevel NONE]]) {
+ // App is not active on the car
+ return [SDLLockScreenStatus OFF];
+ } else if ([self.hmiLevel isEqualToEnum:[SDLHMILevel BACKGROUND]]) {
+ // App is in the background on the car
+ // The lockscreen depends entirely on if the user selected the app
+ if (self.userSelected) {
+ return [SDLLockScreenStatus REQUIRED];
+ } else {
+ return [SDLLockScreenStatus OFF];
+ }
+ } else if ([self.hmiLevel isEqualToEnum:[SDLHMILevel FULL]] || [self.hmiLevel isEqualToEnum:[SDLHMILevel LIMITED]]) {
+ // App is in the foreground on the car in some manner
+ if (self.haveDriverDistractionStatus && !self.driverDistracted) {
+ // We have the distraction status, and the driver is not distracted
+ return [SDLLockScreenStatus OPTIONAL];
+ } else {
+ // We don't have the distraction status, and/or the driver is distracted
+ return [SDLLockScreenStatus REQUIRED];
+ }
+ } else {
+ // This shouldn't be possible.
+ return [SDLLockScreenStatus OFF];
+ }
+}
+
+@end
diff --git a/SmartDeviceLink/SDLLockScreenViewController.h b/SmartDeviceLink/SDLLockScreenViewController.h
new file mode 100644
index 000000000..d340db61a
--- /dev/null
+++ b/SmartDeviceLink/SDLLockScreenViewController.h
@@ -0,0 +1,32 @@
+//
+// SDLLockScreenViewController.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/7/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLockScreenViewController : UIViewController
+
+/**
+ * The app's icon. This will be set by the lock screen configuration.
+ */
+@property (copy, nonatomic, nullable) UIImage *appIcon;
+
+/**
+ * The vehicle's designated icon. This will be set by the lock screen manager when it is notified that a lock screen icon has been downloaded.
+ */
+@property (copy, nonatomic, nullable) UIImage *vehicleIcon;
+
+/**
+ * The designated background color set in the lock screen configuration, or the default SDL gray-blue.
+ */
+@property (copy, nonatomic, nullable) UIColor *backgroundColor;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLLockScreenViewController.m b/SmartDeviceLink/SDLLockScreenViewController.m
new file mode 100644
index 000000000..88bd4ff74
--- /dev/null
+++ b/SmartDeviceLink/SDLLockScreenViewController.m
@@ -0,0 +1,198 @@
+//
+// SDLLockScreenViewController.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/7/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLLockScreenViewController.h"
+
+#import "NSBundle+SDLBundle.h"
+#import "SDLGlobals.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLLockScreenViewController ()
+
+@property (weak, nonatomic) IBOutlet UIImageView *primaryAppIconImageView;
+@property (weak, nonatomic) IBOutlet UIImageView *primaryVehicleIconImageView;
+@property (weak, nonatomic) IBOutlet UIImageView *sdlIconImageView;
+@property (weak, nonatomic) IBOutlet UIImageView *backupImageView;
+
+@property (weak, nonatomic) IBOutlet UILabel *lockedLabel;
+@property (weak, nonatomic) IBOutlet UIImageView *arrowUpImageView;
+@property (weak, nonatomic) IBOutlet UIImageView *arrowDownImageView;
+
+@end
+
+
+@implementation SDLLockScreenViewController
+
+- (void)viewWillAppear:(BOOL)animated {
+ [super viewWillAppear:animated];
+
+ [self sdl_layoutViews];
+}
+
+- (BOOL)shouldAutorotate {
+ return NO;
+}
+
+- (UIStatusBarStyle)preferredStatusBarStyle {
+ BOOL useWhiteIcon = [self.class shouldUseWhiteForegroundForBackgroundColor:self.backgroundColor];
+
+ return useWhiteIcon ? UIStatusBarStyleLightContent : UIStatusBarStyleDefault;
+}
+
+
+#pragma mark - Setters
+
+- (void)setAppIcon:(UIImage *_Nullable)appIcon {
+ _appIcon = appIcon;
+
+ [self sdl_layoutViews];
+}
+
+- (void)setVehicleIcon:(UIImage *_Nullable)vehicleIcon {
+ _vehicleIcon = vehicleIcon;
+
+ [self sdl_layoutViews];
+}
+
+- (void)setBackgroundColor:(UIColor *_Nullable)backgroundColor {
+ _backgroundColor = backgroundColor;
+
+ self.view.backgroundColor = _backgroundColor;
+ [self sdl_layoutViews];
+}
+
+
+#pragma mark - Layout
+
+- (void)sdl_layoutViews {
+ BOOL useWhiteIcon = [self.class shouldUseWhiteForegroundForBackgroundColor:self.backgroundColor];
+
+ UIImage *sdlLogo = [self.class sdl_logoImageWithColor:useWhiteIcon];
+ self.sdlIconImageView.image = sdlLogo;
+
+ self.arrowUpImageView.image = [self.class sdl_arrowUpImageWithColor:useWhiteIcon];
+ self.arrowDownImageView.image = [self.class sdl_arrowDownImageWithColor:useWhiteIcon];
+
+ self.lockedLabel.textColor = useWhiteIcon ? [UIColor whiteColor] : [UIColor blackColor];
+
+ if (self.vehicleIcon != nil && self.appIcon != nil) {
+ [self sdl_setVehicleAndAppIconsLayout];
+ } else if (self.vehicleIcon != nil) {
+ [self sdl_setVehicleIconOnlyLayout];
+ } else if (self.appIcon != nil) {
+ [self sdl_setAppIconOnlyLayout];
+ } else {
+ [self sdl_setNoIconsLayout];
+ }
+
+ // HAX: The autolayout doesn't scale for 4s, so hide a view so it doesn't look like garbage.
+ if (CGRectGetHeight([UIScreen mainScreen].bounds) == 480) {
+ self.sdlIconImageView.hidden = YES;
+ } else {
+ self.sdlIconImageView.hidden = NO;
+ }
+
+ [self.view layoutIfNeeded];
+}
+
+- (void)sdl_setVehicleAndAppIconsLayout {
+ self.primaryAppIconImageView.image = self.appIcon;
+ self.primaryVehicleIconImageView.image = self.vehicleIcon;
+
+ self.backupImageView.image = nil;
+
+ self.arrowUpImageView.alpha = 1.0;
+ self.arrowDownImageView.alpha = 1.0;
+
+ self.sdlIconImageView.alpha = 1.0;
+}
+
+- (void)sdl_setAppIconOnlyLayout {
+ self.primaryAppIconImageView.image = nil;
+ self.primaryVehicleIconImageView.image = nil;
+
+ self.backupImageView.image = self.appIcon;
+
+ self.arrowUpImageView.alpha = 0.0;
+ self.arrowDownImageView.alpha = 0.0;
+
+ self.sdlIconImageView.alpha = 1.0;
+}
+
+- (void)sdl_setVehicleIconOnlyLayout {
+ self.primaryAppIconImageView.image = nil;
+ self.primaryVehicleIconImageView.image = nil;
+
+ self.backupImageView.image = self.vehicleIcon;
+
+ self.arrowUpImageView.alpha = 0.0;
+ self.arrowDownImageView.alpha = 0.0;
+
+ self.sdlIconImageView.alpha = 1.0;
+}
+
+- (void)sdl_setNoIconsLayout {
+ self.primaryAppIconImageView.image = nil;
+ self.primaryVehicleIconImageView.image = nil;
+
+ self.backupImageView.image = self.sdlIconImageView.image;
+
+ self.arrowUpImageView.alpha = 0.0;
+ self.arrowDownImageView.alpha = 0.0;
+
+ self.sdlIconImageView.alpha = 0.0;
+}
+
+
+#pragma mark - Private Image
+
+// TODO: (Joel F.)[2016-08-22] When moved to iOS 7+, use `imageWithRenderingMode:`
++ (UIImage *)sdl_logoImageWithColor:(BOOL)white {
+ return [self sdl_imageWithName:[NSString stringWithFormat:@"sdl_logo_%@", white ? @"white" : @"black"]];
+}
+
++ (UIImage *)sdl_arrowUpImageWithColor:(BOOL)white {
+ return [self sdl_imageWithName:[NSString stringWithFormat:@"lock_arrow_up_%@", white ? @"white" : @"black"]];
+}
+
++ (UIImage *)sdl_arrowDownImageWithColor:(BOOL)white {
+ return [self sdl_imageWithName:[NSString stringWithFormat:@"lock_arrow_down_%@", white ? @"white" : @"black"]];
+}
+
++ (UIImage *)sdl_imageWithName:(NSString *)name {
+ if (SDL_SYSTEM_VERSION_LESS_THAN(@"8.0")) {
+ NSString *bundlePath = [[NSBundle sdlBundle] bundlePath];
+ NSInteger deviceScale = [[UIScreen mainScreen] scale];
+ // We assume we are only dealing with PNGs.
+ NSString *fileName = [NSString stringWithFormat:@"%@%li.png", name, (long)deviceScale];
+ NSString *fullPath = [NSString stringWithFormat:@"%@/%@", bundlePath, fileName];
+ NSData *imageData = [NSData dataWithContentsOfFile:fullPath];
+ return [UIImage imageWithData:imageData];
+ } else {
+ return [UIImage imageNamed:name inBundle:[NSBundle sdlBundle] compatibleWithTraitCollection:nil];
+ }
+}
+
++ (BOOL)shouldUseWhiteForegroundForBackgroundColor:(UIColor *)backgroundColor {
+ CGFloat red, green, blue;
+
+ [backgroundColor getRed:&red green:&green blue:&blue alpha:nil];
+
+ // http://stackoverflow.com/a/3943023
+ red = (red <= 0.3928) ? (red / 12.92) : pow(((red + 0.055) / 1.055), 2.4);
+ green = (green <= 0.3928) ? (green / 12.92) : pow(((green + 0.055) / 1.055), 2.4);
+ blue = (blue <= 0.3928) ? (blue / 12.92) : pow(((blue + 0.055) / 1.055), 2.4);
+ CGFloat luminescence = 0.2126 * red + 0.7152 * green + 0.0722 * blue;
+
+ return (luminescence <= 0.179);
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLManager.h b/SmartDeviceLink/SDLManager.h
new file mode 100644
index 000000000..eb10f88d3
--- /dev/null
+++ b/SmartDeviceLink/SDLManager.h
@@ -0,0 +1,119 @@
+
+
+#import "SDLNotificationConstants.h"
+
+@class SDLConfiguration;
+@class SDLFileManager;
+@class SDLHMILevel;
+@class SDLLanguage;
+@class SDLLifecycleConfiguration;
+@class SDLLockScreenConfiguration;
+@class SDLPermissionManager;
+@class SDLProxy;
+@class SDLPutFile;
+@class SDLRegisterAppInterfaceResponse;
+@class SDLRPCNotification;
+@class SDLRPCRequest;
+@class SDLRPCResponse;
+@class SDLStreamingMediaManager;
+
+@protocol SDLManagerDelegate;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error);
+
+
+@interface SDLManager : NSObject
+
+/**
+ * The configuration the manager was set up with.
+ */
+@property (copy, nonatomic, readonly) SDLConfiguration *configuration;
+
+/**
+ * The current HMI level of the running app.
+ */
+@property (copy, nonatomic, readonly) SDLHMILevel *hmiLevel;
+
+/**
+ * The file manager to be used by the running app.
+ */
+@property (strong, nonatomic, readonly) SDLFileManager *fileManager;
+
+/**
+ * The permission manager monitoring RPC permissions.
+ */
+@property (strong, nonatomic, readonly) SDLPermissionManager *permissionManager;
+
+/**
+ * The streaming media manager to be used for starting video sessions.
+ */
+@property (strong, nonatomic, readonly, nullable) SDLStreamingMediaManager *streamManager;
+
+/**
+ * The response of a register call after it has been received.
+ */
+@property (strong, nonatomic, readonly, nullable) SDLRegisterAppInterfaceResponse *registerResponse;
+
+/**
+ * The manager's delegate.
+ */
+@property (weak, nonatomic, nullable) id<SDLManagerDelegate> delegate;
+
+/**
+ * Deprecated internal proxy object. This should only be accessed when the Manager is READY. This property may go to nil at any time.
+ * The only reason to use this is to access the `putFileStream:withRequest:` method. All other functionality exists on managers in 4.3. This will be removed in 5.0 and the functionality replicated on `SDLFileManager`.
+ */
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+@property (strong, nonatomic, readonly, nullable) SDLProxy *proxy;
+#pragma clang diagnostic pop
+
+
+#pragma mark Lifecycle
+
+/**
+ * Initialize the manager with a configuration. Call `startWithHandler` to begin waiting for a connection.
+ *
+ * @param configuration Your app's unique configuration for setup.
+ * @param delegate An optional delegate to be notified of hmi level changes and startup and shutdown. It is recommended that you implement this.
+ *
+ * @return An instance of SDLManager
+ */
+- (instancetype)initWithConfiguration:(SDLConfiguration *)configuration delegate:(nullable id<SDLManagerDelegate>)delegate NS_DESIGNATED_INITIALIZER;
+
+/**
+ * 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.
+ *
+ * @param readyHandler The block called when the manager is ready to be used or an error occurs while attempting to become ready.
+ */
+- (void)startWithReadyHandler:(SDLManagerReadyBlock)readyHandler;
+
+/**
+ * Stop the manager, it will disconnect if needed and no longer look for a connection. You probably don't need to call this method ever.
+ */
+- (void)stop;
+
+
+#pragma mark Manually Send RPC Requests
+
+/**
+ * Send an RPC request and don't bother with the response or error. If you need the response or error, call sendRequest:withCompletionHandler: instead.
+ *
+ * @param request The RPC request to send
+ */
+- (void)sendRequest:(SDLRPCRequest *)request;
+
+/**
+ * Send an RPC request and set a completion handler that will be called with the response when the response returns.
+ *
+ * @param request The RPC request to send
+ * @param handler The handler that will be called when the response returns
+ */
+- (void)sendRequest:(SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLManager.m b/SmartDeviceLink/SDLManager.m
new file mode 100644
index 000000000..c83511db6
--- /dev/null
+++ b/SmartDeviceLink/SDLManager.m
@@ -0,0 +1,115 @@
+
+
+#import <Foundation/Foundation.h>
+
+#import "SmartDeviceLink.h"
+
+#import "SDLManager.h"
+
+#import "NSMapTable+Subscripting.h"
+#import "SDLConnectionManagerType.h"
+#import "SDLLifecycleManager.h"
+#import "SDLLockScreenManager.h"
+#import "SDLLockScreenPresenter.h"
+#import "SDLManagerDelegate.h"
+#import "SDLNotificationDispatcher.h"
+#import "SDLResponseDispatcher.h"
+#import "SDLStateMachine.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+#pragma mark - SDLManager Private Interface
+
+@interface SDLManager ()
+
+@property (strong, nonatomic) SDLLifecycleManager *lifecycleManager;
+
+@end
+
+
+#pragma mark - SDLManager Implementation
+
+@implementation SDLManager
+
+#pragma mark Lifecycle
+
+- (instancetype)init {
+ return [self initWithConfiguration:[SDLConfiguration configurationWithLifecycle:[SDLLifecycleConfiguration defaultConfigurationWithAppName:@"SDL APP" appId:@"001"] lockScreen:[SDLLockScreenConfiguration enabledConfiguration]] delegate:nil];
+}
+
+- (instancetype)initWithConfiguration:(SDLConfiguration *)configuration delegate:(nullable id<SDLManagerDelegate>)delegate {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _lifecycleManager = [[SDLLifecycleManager alloc] initWithConfiguration:configuration delegate:delegate];
+
+ return self;
+}
+
+- (void)startWithReadyHandler:(SDLManagerReadyBlock)readyHandler {
+ [self.lifecycleManager startWithReadyHandler:readyHandler];
+}
+
+- (void)stop {
+ [self.lifecycleManager stop];
+}
+
+
+#pragma mark - Passthrough getters / setters
+
+- (SDLConfiguration *)configuration {
+ return self.lifecycleManager.configuration;
+}
+
+- (SDLHMILevel *)hmiLevel {
+ return self.lifecycleManager.hmiLevel;
+}
+
+- (SDLFileManager *)fileManager {
+ return self.lifecycleManager.fileManager;
+}
+
+- (SDLPermissionManager *)permissionManager {
+ return self.lifecycleManager.permissionManager;
+}
+
+- (nullable SDLStreamingMediaManager *)streamManager {
+ return self.lifecycleManager.streamManager;
+}
+
+- (nullable SDLRegisterAppInterfaceResponse *)registerResponse {
+ return self.lifecycleManager.registerResponse;
+}
+
+- (nullable id<SDLManagerDelegate>)delegate {
+ return self.lifecycleManager.delegate;
+}
+
+- (void)setDelegate:(nullable id<SDLManagerDelegate>)delegate {
+ self.lifecycleManager.delegate = delegate;
+}
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+- (nullable SDLProxy *)proxy {
+ return self.lifecycleManager.proxy;
+}
+#pragma clang diagnostic pop
+
+
+#pragma mark SDLConnectionManager Protocol
+
+- (void)sendRequest:(SDLRPCRequest *)request {
+ [self sendRequest:request withResponseHandler:nil];
+}
+
+- (void)sendRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
+ [self.lifecycleManager sendRequest:request withResponseHandler:handler];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLManagerDelegate.h b/SmartDeviceLink/SDLManagerDelegate.h
new file mode 100644
index 000000000..349f22508
--- /dev/null
+++ b/SmartDeviceLink/SDLManagerDelegate.h
@@ -0,0 +1,34 @@
+//
+// SDLManagerDelegate.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 6/7/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLHMILevel;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol SDLManagerDelegate <NSObject>
+
+/**
+ * Called upon a disconnection from the remote system.
+ */
+- (void)managerDidDisconnect;
+
+/**
+ * Called when the HMI level state of this application changes on the remote system. This is equivalent to the application's state changes in iOS such as foreground, background, or closed.
+ *
+ * @param oldLevel The previous level which has now been left.
+ * @param newLevel The current level.
+ */
+- (void)hmiLevel:(SDLHMILevel *)oldLevel didChangeToLevel:(SDLHMILevel *)newLevel;
+
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLMenuParams.h b/SmartDeviceLink/SDLMenuParams.h
index 14f51e390..6d2bd4d70 100644
--- a/SmartDeviceLink/SDLMenuParams.h
+++ b/SmartDeviceLink/SDLMenuParams.h
@@ -23,6 +23,9 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithMenuName:(NSString *)menuName;
+
+- (instancetype)initWithMenuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position;
/**
* @abstract the unique ID of an existing submenu to which a command will be added
diff --git a/SmartDeviceLink/SDLMenuParams.m b/SmartDeviceLink/SDLMenuParams.m
index 84fb595a8..aa41f4b4a 100644
--- a/SmartDeviceLink/SDLMenuParams.m
+++ b/SmartDeviceLink/SDLMenuParams.m
@@ -20,6 +20,29 @@
return self;
}
+- (instancetype)initWithMenuName:(NSString *)menuName parentId:(UInt32)parentId position:(UInt16)position {
+ self = [self initWithMenuName:menuName];
+ if (!self) {
+ return nil;
+ }
+
+ self.parentID = @(parentId);
+ self.position = @(parentId);
+
+ return self;
+}
+
+- (instancetype)initWithMenuName:(NSString *)menuName {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.menuName = menuName;
+
+ return self;
+}
+
- (void)setParentID:(NSNumber *)parentID {
if (parentID != nil) {
[store setObject:parentID forKey:NAMES_parentID];
diff --git a/SmartDeviceLink/SDLNotificationConstants.h b/SmartDeviceLink/SDLNotificationConstants.h
new file mode 100644
index 000000000..ee1e163cd
--- /dev/null
+++ b/SmartDeviceLink/SDLNotificationConstants.h
@@ -0,0 +1,137 @@
+//
+// SDLNotificationConstants.h
+// SmartDeviceLink-iOS
+//
+// Created by Justin Dickow on 9/30/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+@class SDLRPCNotification;
+@class SDLRPCResponse;
+@class SDLRPCRequest;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+// Resolves issue of using Swift 3 and pre-iOS 10 versions due to NSNotificationName unavailability.
+#if __IPHONE_OS_VERSION_MAX_ALLOWED <= __IPHONE_9_3
+#define NOTIFICATION_TYPEDEF NSString *
+#else
+#define NOTIFICATION_TYPEDEF NSNotificationName
+#endif
+
+typedef NOTIFICATION_TYPEDEF SDLNotificationName;
+
+typedef NSString *SDLNotificationUserInfoKey;
+
+#pragma mark - Blocks
+/**
+ * A handler used on certain RPCs, primarily buttons or commands, when an event occurs.
+ *
+ * @param notification The RPC Notification that was fired.
+ */
+typedef void (^SDLRPCNotificationHandler)(__kindof SDLRPCNotification *notification);
+
+/**
+ * A handler used on all RPC requests which fires when the response is received.
+ *
+ * @param request The request which was sent.
+ * @param response The response which was received.
+ * @param error If sending the request encountered an error, this parameter will not be nil.
+ */
+typedef void (^SDLResponseHandler)(__kindof SDLRPCRequest *__nullable request, __kindof SDLRPCResponse *__nullable response, NSError *__nullable error);
+
+/**
+ * The key used in all SDL NSNotifications to extract the response or notification from the userinfo dictionary.
+ */
+#pragma mark - Notification info dictionary keys
+extern SDLNotificationUserInfoKey const SDLNotificationUserInfoObject;
+
+/**
+ * Some general NSNotification names not associated with any specific RPC response or request.
+ */
+#pragma mark - General notifications
+extern SDLNotificationName const SDLTransportDidDisconnect;
+extern SDLNotificationName const SDLTransportDidConnect;
+extern SDLNotificationName const SDLDidReceiveError;
+extern SDLNotificationName const SDLDidReceiveLockScreenIcon;
+extern SDLNotificationName const SDLDidBecomeReady;
+
+/**
+ * NSNotification names associated with specific RPC responses.
+ */
+#pragma mark - RPC responses
+extern SDLNotificationName const SDLDidReceiveAddCommandResponse;
+extern SDLNotificationName const SDLDidReceiveAddSubMenuResponse;
+extern SDLNotificationName const SDLDidReceiveAlertResponse;
+extern SDLNotificationName const SDLDidReceiveAlertManeuverResponse;
+extern SDLNotificationName const SDLDidReceiveChangeRegistrationResponse;
+extern SDLNotificationName const SDLDidReceiveCreateInteractionChoiceSetResponse;
+extern SDLNotificationName const SDLDidReceiveDeleteCommandResponse;
+extern SDLNotificationName const SDLDidReceiveDeleteFileResponse;
+extern SDLNotificationName const SDLDidReceiveDeleteInteractionChoiceSetResponse;
+extern SDLNotificationName const SDLDidReceiveDeleteSubmenuResponse;
+extern SDLNotificationName const SDLDidReceiveDiagnosticMessageResponse;
+extern SDLNotificationName const SDLDidReceiveDialNumberResponse;
+extern SDLNotificationName const SDLDidReceiveEncodedSyncPDataResponse;
+extern SDLNotificationName const SDLDidReceiveEndAudioPassThruResponse;
+extern SDLNotificationName const SDLDidReceiveGenericResponse;
+extern SDLNotificationName const SDLDidReceiveGetDTCsResponse;
+extern SDLNotificationName const SDLDidReceiveGetVehicleDataResponse;
+extern SDLNotificationName const SDLDidReceiveListFilesResponse;
+extern SDLNotificationName const SDLDidReceivePerformAudioPassThruResponse;
+extern SDLNotificationName const SDLDidReceivePerformInteractionResponse;
+extern SDLNotificationName const SDLDidReceivePutFileResponse;
+extern SDLNotificationName const SDLDidReceiveReadDIDResponse;
+extern SDLNotificationName const SDLDidReceiveRegisterAppInterfaceResponse;
+extern SDLNotificationName const SDLDidReceiveResetGlobalPropertiesResponse;
+extern SDLNotificationName const SDLDidReceiveScrollableMessageResponse;
+extern SDLNotificationName const SDLDidReceiveSendLocationResponse;
+extern SDLNotificationName const SDLDidReceiveSetAppIconResponse;
+extern SDLNotificationName const SDLDidReceiveSetDisplayLayoutResponse;
+extern SDLNotificationName const SDLDidReceiveSetGlobalPropertiesResponse;
+extern SDLNotificationName const SDLDidReceiveSetMediaClockTimerResponse;
+extern SDLNotificationName const SDLDidReceiveShowConstantTBTResponse;
+extern SDLNotificationName const SDLDidReceiveShowResponse;
+extern SDLNotificationName const SDLDidReceiveSliderResponse;
+extern SDLNotificationName const SDLDidReceiveSpeakResponse;
+extern SDLNotificationName const SDLDidReceiveSubscribeButtonResponse;
+extern SDLNotificationName const SDLDidReceiveSubscribeVehicleDataResponse;
+extern SDLNotificationName const SDLDidReceiveSyncPDataResponse;
+extern SDLNotificationName const SDLDidReceiveUpdateTurnListResponse;
+extern SDLNotificationName const SDLDidReceiveUnregisterAppInterfaceResponse;
+extern SDLNotificationName const SDLDidReceiveUnsubscribeButtonResponse;
+extern SDLNotificationName const SDLDidReceiveUnsubscribeVehicleDataResponse;
+
+/**
+ * NSNotification names associated with specific RPC notifications.
+ */
+#pragma mark - RPC Notifications
+extern SDLNotificationName const SDLDidChangeDriverDistractionStateNotification;
+extern SDLNotificationName const SDLDidChangeHMIStatusNotification;
+extern SDLNotificationName const SDLDidReceiveAudioPassThruNotification;
+extern SDLNotificationName const SDLDidReceiveAppUnregisteredNotification;
+extern SDLNotificationName const SDLDidReceiveButtonEventNotification;
+extern SDLNotificationName const SDLDidReceiveButtonPressNotification;
+extern SDLNotificationName const SDLDidReceiveCommandNotification;
+extern SDLNotificationName const SDLDidReceiveEncodedDataNotification;
+extern SDLNotificationName const SDLDidReceiveKeyboardInputNotification;
+extern SDLNotificationName const SDLDidChangeLanguageNotification;
+extern SDLNotificationName const SDLDidChangeLockScreenStatusNotification;
+extern SDLNotificationName const SDLDidReceiveNewHashNotification;
+extern SDLNotificationName const SDLDidReceiveVehicleIconNotification;
+extern SDLNotificationName const SDLDidChangePermissionsNotification;
+extern SDLNotificationName const SDLDidReceiveSystemRequestNotification;
+extern SDLNotificationName const SDLDidChangeTurnByTurnStateNotification;
+extern SDLNotificationName const SDLDidReceiveTouchEventNotification;
+extern SDLNotificationName const SDLDidReceiveVehicleDataNotification;
+
+@interface SDLNotificationConstants : NSObject
+
++ (NSArray<SDLNotificationName> *)allResponseNames;
++ (NSArray<SDLNotificationName> *)allButtonEventNotifications;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLNotificationConstants.m b/SmartDeviceLink/SDLNotificationConstants.m
new file mode 100644
index 000000000..145dcb41b
--- /dev/null
+++ b/SmartDeviceLink/SDLNotificationConstants.m
@@ -0,0 +1,136 @@
+//
+// SDLNotificationConstants.m
+// SmartDeviceLink-iOS
+//
+// Created by Justin Dickow on 9/30/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLNotificationConstants.h"
+
+SDLNotificationUserInfoKey const SDLNotificationUserInfoObject = @"SDLNotificationUserInfoObject";
+
+
+#pragma mark - General notifications
+SDLNotificationName const SDLTransportDidDisconnect = @"com.sdl.transport.disconnect";
+SDLNotificationName const SDLTransportDidConnect = @"com.sdl.transport.connect";
+SDLNotificationName const SDLDidReceiveError = @"com.sdl.general.error";
+SDLNotificationName const SDLDidReceiveLockScreenIcon = @"com.sdl.general.lockscreenIconReceived";
+SDLNotificationName const SDLDidBecomeReady = @"com.sdl.notification.managerReady";
+SDLNotificationName const SDLDidReceiveVehicleIconNotification = @"com.sdl.notification.vehicleIcon";
+
+#pragma mark - RPC Responses
+SDLNotificationName const SDLDidReceiveAddCommandResponse = @"com.sdl.response.addCommand";
+SDLNotificationName const SDLDidReceiveAddSubMenuResponse = @"com.sdl.response.addSubMenu";
+SDLNotificationName const SDLDidReceiveAlertResponse = @"com.sdl.response.alert";
+SDLNotificationName const SDLDidReceiveAlertManeuverResponse = @"com.sdl.response.alertManeuver";
+SDLNotificationName const SDLDidReceiveChangeRegistrationResponse = @"com.sdl.response.changeRegistration";
+SDLNotificationName const SDLDidReceiveCreateInteractionChoiceSetResponse = @"com.sdl.response.createInteractionChoiceSet";
+SDLNotificationName const SDLDidReceiveDeleteCommandResponse = @"com.sdl.response.deleteCommand";
+SDLNotificationName const SDLDidReceiveDeleteFileResponse = @"com.sdl.response.deleteFile";
+SDLNotificationName const SDLDidReceiveDeleteInteractionChoiceSetResponse = @"com.sdl.response.deleteInteractionChoiceSet";
+SDLNotificationName const SDLDidReceiveDeleteSubmenuResponse = @"com.sdl.response.deleteSubmenu";
+SDLNotificationName const SDLDidReceiveDiagnosticMessageResponse = @"com.sdl.response.diagnosticMessage";
+SDLNotificationName const SDLDidReceiveDialNumberResponse = @"com.sdl.response.dialNumber";
+SDLNotificationName const SDLDidReceiveEncodedSyncPDataResponse = @"com.sdl.response.encodedSyncPData";
+SDLNotificationName const SDLDidReceiveEndAudioPassThruResponse = @"com.sdl.response.endAudioPassThru";
+SDLNotificationName const SDLDidReceiveGenericResponse = @"com.sdl.response.generic";
+SDLNotificationName const SDLDidReceiveGetDTCsResponse = @"com.sdl.response.getDTCs";
+SDLNotificationName const SDLDidReceiveGetVehicleDataResponse = @"com.sdl.response.getVehicleData";
+SDLNotificationName const SDLDidReceiveListFilesResponse = @"com.sdl.response.listFiles";
+SDLNotificationName const SDLDidReceivePerformAudioPassThruResponse = @"com.sdl.response.performAudioPassThru";
+SDLNotificationName const SDLDidReceivePerformInteractionResponse = @"com.sdl.response.performInteraction";
+SDLNotificationName const SDLDidReceivePutFileResponse = @"com.sdl.response.putFile";
+SDLNotificationName const SDLDidReceiveReadDIDResponse = @"com.sdl.response.readDID";
+SDLNotificationName const SDLDidReceiveRegisterAppInterfaceResponse = @"com.sdl.response.registerAppInterface";
+SDLNotificationName const SDLDidReceiveResetGlobalPropertiesResponse = @"com.sdl.response.resetGlobalProperties";
+SDLNotificationName const SDLDidReceiveScrollableMessageResponse = @"com.sdl.response.scrollableMessage";
+SDLNotificationName const SDLDidReceiveSendLocationResponse = @"com.sdl.response.sendLocation";
+SDLNotificationName const SDLDidReceiveSetAppIconResponse = @"com.sdl.response.setAppIcon";
+SDLNotificationName const SDLDidReceiveSetDisplayLayoutResponse = @"com.sdl.response.setDisplayLayout";
+SDLNotificationName const SDLDidReceiveSetGlobalPropertiesResponse = @"com.sdl.response.setGlobalProperties";
+SDLNotificationName const SDLDidReceiveSetMediaClockTimerResponse = @"com.sdl.response.setMediaClockTimer";
+SDLNotificationName const SDLDidReceiveShowConstantTBTResponse = @"com.sdl.response.showConstantTBT";
+SDLNotificationName const SDLDidReceiveShowResponse = @"com.sdl.response.show";
+SDLNotificationName const SDLDidReceiveSliderResponse = @"com.sdl.response.slider";
+SDLNotificationName const SDLDidReceiveSpeakResponse = @"com.sdl.response.speak";
+SDLNotificationName const SDLDidReceiveSubscribeButtonResponse = @"com.sdl.response.subscribeButton";
+SDLNotificationName const SDLDidReceiveSubscribeVehicleDataResponse = @"com.sdl.response.subscribeVehicleData";
+SDLNotificationName const SDLDidReceiveSyncPDataResponse = @"com.sdl.response.syncPData";
+SDLNotificationName const SDLDidReceiveUpdateTurnListResponse = @"com.sdl.response.updateTurnList";
+SDLNotificationName const SDLDidReceiveUnregisterAppInterfaceResponse = @"com.sdl.response.unregisterAppInterface";
+SDLNotificationName const SDLDidReceiveUnsubscribeButtonResponse = @"com.sdl.response.unsubscribeButton";
+SDLNotificationName const SDLDidReceiveUnsubscribeVehicleDataResponse = @"com.sdl.response.unsubscribeVehicleData";
+
+#pragma mark - RPC Notifications
+SDLNotificationName const SDLDidChangeDriverDistractionStateNotification = @"com.sdl.notification.changeDriverDistractionStateNotification";
+SDLNotificationName const SDLDidChangeHMIStatusNotification = @"com.sdl.notification.changeHMIStatus";
+SDLNotificationName const SDLDidReceiveAudioPassThruNotification = @"com.sdl.notification.audioPassThru";
+SDLNotificationName const SDLDidReceiveAppUnregisteredNotification = @"com.sdl.notification.appUnregistered";
+SDLNotificationName const SDLDidReceiveButtonEventNotification = @"com.sdl.notification.buttonEvent";
+SDLNotificationName const SDLDidReceiveButtonPressNotification = @"com.sdl.notification.buttonPress";
+SDLNotificationName const SDLDidReceiveCommandNotification = @"com.sdl.notification.command";
+SDLNotificationName const SDLDidReceiveEncodedDataNotification = @"com.sdl.notification.encodedData";
+SDLNotificationName const SDLDidReceiveKeyboardInputNotification = @"com.sdl.notification.keyboardInput";
+SDLNotificationName const SDLDidChangeLanguageNotification = @"com.sdl.notification.changeLanguage";
+SDLNotificationName const SDLDidChangeLockScreenStatusNotification = @"com.sdl.notification.lockScreenStatus";
+SDLNotificationName const SDLDidReceiveNewHashNotification = @"com.sdl.notification.newHash";
+SDLNotificationName const SDLDidChangePermissionsNotification = @"com.sdl.notification.changePermission";
+SDLNotificationName const SDLDidReceiveSystemRequestNotification = @"com.sdl.notification.receiveSystemRequest";
+SDLNotificationName const SDLDidChangeTurnByTurnStateNotification = @"com.sdl.notification.changeTurnByTurnState";
+SDLNotificationName const SDLDidReceiveTouchEventNotification = @"com.sdl.notification.touchEvent";
+SDLNotificationName const SDLDidReceiveVehicleDataNotification = @"com.sdl.notification.vehicleData";
+
+
+@implementation SDLNotificationConstants
+
++ (NSArray<SDLNotificationName> *)allResponseNames {
+ return @[SDLDidReceiveAddCommandResponse,
+ SDLDidReceiveAddSubMenuResponse,
+ SDLDidReceiveAlertResponse,
+ SDLDidReceiveAlertManeuverResponse,
+ SDLDidReceiveChangeRegistrationResponse,
+ SDLDidReceiveCreateInteractionChoiceSetResponse,
+ SDLDidReceiveDeleteCommandResponse,
+ SDLDidReceiveDeleteFileResponse,
+ SDLDidReceiveDeleteInteractionChoiceSetResponse,
+ SDLDidReceiveDeleteSubmenuResponse,
+ SDLDidReceiveDiagnosticMessageResponse,
+ SDLDidReceiveDialNumberResponse,
+ SDLDidReceiveEncodedSyncPDataResponse,
+ SDLDidReceiveEndAudioPassThruResponse,
+ SDLDidReceiveGenericResponse,
+ SDLDidReceiveGetDTCsResponse,
+ SDLDidReceiveGetVehicleDataResponse,
+ SDLDidReceiveListFilesResponse,
+ SDLDidReceivePerformAudioPassThruResponse,
+ SDLDidReceivePerformInteractionResponse,
+ SDLDidReceivePutFileResponse,
+ SDLDidReceiveReadDIDResponse,
+ SDLDidReceiveRegisterAppInterfaceResponse,
+ SDLDidReceiveResetGlobalPropertiesResponse,
+ SDLDidReceiveScrollableMessageResponse,
+ SDLDidReceiveSendLocationResponse,
+ SDLDidReceiveSetAppIconResponse,
+ SDLDidReceiveSetDisplayLayoutResponse,
+ SDLDidReceiveSetGlobalPropertiesResponse,
+ SDLDidReceiveSetMediaClockTimerResponse,
+ SDLDidReceiveShowConstantTBTResponse,
+ SDLDidReceiveShowResponse,
+ SDLDidReceiveSliderResponse,
+ SDLDidReceiveSpeakResponse,
+ SDLDidReceiveSubscribeButtonResponse,
+ SDLDidReceiveSubscribeVehicleDataResponse,
+ SDLDidReceiveSyncPDataResponse,
+ SDLDidReceiveUpdateTurnListResponse,
+ SDLDidReceiveUnregisterAppInterfaceResponse,
+ SDLDidReceiveUnsubscribeButtonResponse,
+ SDLDidReceiveUnsubscribeVehicleDataResponse];
+}
+
++ (NSArray<SDLNotificationName> *)allButtonEventNotifications {
+ return @[SDLDidReceiveButtonEventNotification,
+ SDLDidReceiveButtonPressNotification];
+}
+
+@end
diff --git a/SmartDeviceLink/SDLNotificationDispatcher.h b/SmartDeviceLink/SDLNotificationDispatcher.h
new file mode 100644
index 000000000..d189ef990
--- /dev/null
+++ b/SmartDeviceLink/SDLNotificationDispatcher.h
@@ -0,0 +1,37 @@
+//
+// SDLnotificationDispatcher.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/7/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLProxyListener.h"
+
+@class SDLRPCResponse;
+@class SDLRPCNotification;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * The SDLNotificationDispatcher subscribes to SDLProxy notifications through SDLProxyListener and sends out actual NSNotifications with those contents. It can also be told to send out other types of notifications.
+ */
+@interface SDLNotificationDispatcher : NSObject <SDLProxyListener>
+
+/**
+ * Post a notification with a specified name and object.
+ *
+ * @param name The name of the notification to be dispatched.
+ * @param info The object to be send along in the `userInfo` dictionary.
+ */
+- (void)postNotificationName:(NSString *)name infoObject:(nullable id)info;
+
+- (void)postRPCResponseNotification:(NSString *)name response:(__kindof SDLRPCResponse *)response;
+- (void)postRPCNotificationNotification:(NSString *)name notification:(__kindof SDLRPCNotification *)rpcNotification;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLNotificationDispatcher.m b/SmartDeviceLink/SDLNotificationDispatcher.m
new file mode 100644
index 000000000..48b9f525f
--- /dev/null
+++ b/SmartDeviceLink/SDLNotificationDispatcher.m
@@ -0,0 +1,313 @@
+//
+// SDLnotificationDispatcher.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/7/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLNotificationDispatcher.h"
+
+#import "SDLError.h"
+#import "SDLNotificationConstants.h"
+#import "SDLRPCNotification.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLRPCResponseNotification.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLNotificationDispatcher
+
+- (void)postNotificationName:(NSString *)name infoObject:(nullable id)infoObject {
+ NSDictionary<NSString *, id> *userInfo = nil;
+ if (infoObject != nil) {
+ userInfo = @{SDLNotificationUserInfoObject: infoObject};
+ }
+
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [[NSNotificationCenter defaultCenter] postNotificationName:name object:self userInfo:userInfo];
+ });
+}
+
+- (void)postRPCResponseNotification:(NSString *)name response:(__kindof SDLRPCResponse *)response {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:name object:self rpcResponse:response];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+}
+
+- (void)postRPCNotificationNotification:(NSString *)name notification:(__kindof SDLRPCNotification *)rpcNotification {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:name object:self rpcNotification:rpcNotification];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+ });
+}
+
+
+#pragma mark - SDLProxyListener Delegate Methods
+
+- (void)onProxyOpened {
+ [self postNotificationName:SDLTransportDidConnect infoObject:nil];
+}
+
+- (void)onProxyClosed {
+ [self postNotificationName:SDLTransportDidDisconnect infoObject:nil];
+}
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
+
+- (void)onOnHMIStatus:(SDLOnHMIStatus *)notification {
+ [self postRPCNotificationNotification:SDLDidChangeHMIStatusNotification notification:notification];
+}
+
+- (void)onOnDriverDistraction:(SDLOnDriverDistraction *)notification {
+ [self postRPCNotificationNotification:SDLDidChangeDriverDistractionStateNotification notification:notification];
+}
+
+
+#pragma mark Optional Methods
+
+- (void)onError:(NSException *)e {
+ NSError *error = [NSError sdl_lifecycle_unknownRemoteErrorWithDescription:e.name andReason:e.reason];
+ [self postNotificationName:SDLDidReceiveError infoObject:error];
+}
+
+- (void)onReceivedLockScreenIcon:(UIImage *)icon {
+ [self postNotificationName:SDLDidReceiveLockScreenIcon infoObject:icon];
+}
+
+- (void)onAddCommandResponse:(SDLAddCommandResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveAddCommandResponse response:response];
+}
+
+- (void)onAddSubMenuResponse:(SDLAddSubMenuResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveAddSubMenuResponse response:response];
+}
+
+- (void)onAlertManeuverResponse:(SDLAlertManeuverResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveAlertManeuverResponse response:response];
+}
+
+- (void)onAlertResponse:(SDLAlertResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveAlertResponse response:response];
+}
+
+- (void)onChangeRegistrationResponse:(SDLChangeRegistrationResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveChangeRegistrationResponse response:response];
+}
+
+- (void)onCreateInteractionChoiceSetResponse:(SDLCreateInteractionChoiceSetResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveCreateInteractionChoiceSetResponse response:response];
+}
+
+- (void)onDeleteCommandResponse:(SDLDeleteCommandResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveDeleteCommandResponse response:response];
+}
+
+- (void)onDeleteFileResponse:(SDLDeleteFileResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveDeleteFileResponse response:response];
+}
+
+- (void)onDeleteInteractionChoiceSetResponse:(SDLDeleteInteractionChoiceSetResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveDeleteInteractionChoiceSetResponse response:response];
+}
+
+- (void)onDeleteSubMenuResponse:(SDLDeleteSubMenuResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveDeleteSubmenuResponse response:response];
+}
+
+- (void)onDiagnosticMessageResponse:(SDLDiagnosticMessageResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveDiagnosticMessageResponse response:response];
+}
+
+- (void)onDialNumberResponse:(SDLDialNumberResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveDialNumberResponse response:response];
+}
+
+- (void)onEncodedSyncPDataResponse:(SDLEncodedSyncPDataResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveEncodedSyncPDataResponse response:response];
+}
+
+- (void)onEndAudioPassThruResponse:(SDLEndAudioPassThruResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveEndAudioPassThruResponse response:response];
+}
+
+- (void)onGenericResponse:(SDLGenericResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveGenericResponse response:response];
+}
+
+- (void)onGetDTCsResponse:(SDLGetDTCsResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveGetDTCsResponse response:response];
+}
+
+- (void)onGetVehicleDataResponse:(SDLGetVehicleDataResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveGetVehicleDataResponse response:response];
+}
+
+- (void)onListFilesResponse:(SDLListFilesResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveListFilesResponse response:response];
+}
+
+- (void)onPerformAudioPassThruResponse:(SDLPerformAudioPassThruResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceivePerformAudioPassThruResponse response:response];
+}
+
+- (void)onPerformInteractionResponse:(SDLPerformInteractionResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceivePerformInteractionResponse response:response];
+}
+
+- (void)onPutFileResponse:(SDLPutFileResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceivePutFileResponse response:response];
+}
+
+- (void)onReadDIDResponse:(SDLReadDIDResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveReadDIDResponse response:response];
+}
+
+- (void)onRegisterAppInterfaceResponse:(SDLRegisterAppInterfaceResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveRegisterAppInterfaceResponse response:response];
+}
+
+- (void)onResetGlobalPropertiesResponse:(SDLResetGlobalPropertiesResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveResetGlobalPropertiesResponse response:response];
+}
+
+- (void)onScrollableMessageResponse:(SDLScrollableMessageResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveScrollableMessageResponse response:response];
+}
+
+- (void)onSendLocationResponse:(SDLSendLocationResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveSendLocationResponse response:response];
+}
+
+- (void)onSetAppIconResponse:(SDLSetAppIconResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveSetAppIconResponse response:response];
+}
+
+- (void)onSetDisplayLayoutResponse:(SDLSetDisplayLayoutResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveSetDisplayLayoutResponse response:response];
+}
+
+- (void)onSetGlobalPropertiesResponse:(SDLSetGlobalPropertiesResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveSetGlobalPropertiesResponse response:response];
+}
+
+- (void)onSetMediaClockTimerResponse:(SDLSetMediaClockTimerResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveSetMediaClockTimerResponse response:response];
+}
+
+- (void)onShowConstantTBTResponse:(SDLShowConstantTBTResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveShowConstantTBTResponse response:response];
+}
+
+- (void)onShowResponse:(SDLShowResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveShowResponse response:response];
+}
+
+- (void)onSliderResponse:(SDLSliderResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveSliderResponse response:response];
+}
+
+- (void)onSpeakResponse:(SDLSpeakResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveSpeakResponse response:response];
+}
+
+- (void)onSubscribeButtonResponse:(SDLSubscribeButtonResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveSubscribeButtonResponse response:response];
+}
+
+- (void)onSubscribeVehicleDataResponse:(SDLSubscribeVehicleDataResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveSubscribeVehicleDataResponse response:response];
+}
+
+- (void)onSyncPDataResponse:(SDLSyncPDataResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveSyncPDataResponse response:response];
+}
+
+- (void)onUpdateTurnListResponse:(SDLUpdateTurnListResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveUpdateTurnListResponse response:response];
+}
+
+- (void)onUnregisterAppInterfaceResponse:(SDLUnregisterAppInterfaceResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveUnregisterAppInterfaceResponse response:response];
+}
+
+- (void)onUnsubscribeButtonResponse:(SDLUnsubscribeButtonResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveUnsubscribeButtonResponse response:response];
+}
+
+- (void)onUnsubscribeVehicleDataResponse:(SDLUnsubscribeVehicleDataResponse *)response {
+ [self postRPCResponseNotification:SDLDidReceiveUnsubscribeVehicleDataResponse response:response];
+}
+
+- (void)onOnAppInterfaceUnregistered:(SDLOnAppInterfaceUnregistered *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveAppUnregisteredNotification notification:notification];
+}
+
+- (void)onOnAudioPassThru:(SDLOnAudioPassThru *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveAudioPassThruNotification notification:notification];
+}
+
+- (void)onOnButtonEvent:(SDLOnButtonEvent *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveButtonEventNotification notification:notification];
+}
+
+- (void)onOnButtonPress:(SDLOnButtonPress *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveButtonPressNotification notification:notification];
+}
+
+- (void)onOnCommand:(SDLOnCommand *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveCommandNotification notification:notification];
+}
+
+- (void)onOnEncodedSyncPData:(SDLOnEncodedSyncPData *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveEncodedDataNotification notification:notification];
+}
+
+- (void)onOnHashChange:(SDLOnHashChange *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveNewHashNotification notification:notification];
+}
+
+- (void)onOnKeyboardInput:(SDLOnKeyboardInput *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveKeyboardInputNotification notification:notification];
+}
+
+- (void)onOnLanguageChange:(SDLOnLanguageChange *)notification {
+ [self postRPCNotificationNotification:SDLDidChangeLanguageNotification notification:notification];
+}
+
+- (void)onOnLockScreenNotification:(SDLOnLockScreenStatus *)notification {
+ [self postRPCNotificationNotification:SDLDidChangeLockScreenStatusNotification notification:notification];
+}
+
+- (void)onOnPermissionsChange:(SDLOnPermissionsChange *)notification {
+ [self postRPCNotificationNotification:SDLDidChangePermissionsNotification notification:notification];
+}
+
+- (void)onOnSyncPData:(SDLOnSyncPData *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveSystemRequestNotification notification:notification];
+}
+
+- (void)onOnSystemRequest:(SDLOnSystemRequest *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveSystemRequestNotification notification:notification];
+}
+
+- (void)onOnTBTClientState:(SDLOnTBTClientState *)notification {
+ [self postRPCNotificationNotification:SDLDidChangeTurnByTurnStateNotification notification:notification];
+}
+
+- (void)onOnTouchEvent:(SDLOnTouchEvent *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveTouchEventNotification notification:notification];
+}
+
+- (void)onOnVehicleData:(SDLOnVehicleData *)notification {
+ [self postRPCNotificationNotification:SDLDidReceiveVehicleDataNotification notification:notification];
+}
+
+#pragma clang diagnostic pop
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLPerformAudioPassThru.h b/SmartDeviceLink/SDLPerformAudioPassThru.h
index 66dfacf19..3c2371fca 100644
--- a/SmartDeviceLink/SDLPerformAudioPassThru.h
+++ b/SmartDeviceLink/SDLPerformAudioPassThru.h
@@ -33,6 +33,10 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithSamplingRate:(SDLSamplingRate *)samplingRate bitsPerSample:(SDLBitsPerSample *)bitsPerSample audioType:(SDLAudioType *)audioType maxDuration:(UInt32)maxDuration;
+
+- (instancetype)initWithInitialPrompt:(NSString *)initialPrompt audioPassThruDisplayText1:(NSString *)audioPassThruDisplayText1 audioPassThruDisplayText2:(NSString *)audioPassThruDisplayText2 samplingRate:(SDLSamplingRate *)samplingRate bitsPerSample:(SDLBitsPerSample *)bitsPerSample audioType:(SDLAudioType *)audioType maxDuration:(UInt32)maxDuration muteAudio:(BOOL)muteAudio;
+
/**
* @abstract initial prompt which will be spoken before opening the audio pass
* thru session by SDL
diff --git a/SmartDeviceLink/SDLPerformAudioPassThru.m b/SmartDeviceLink/SDLPerformAudioPassThru.m
index 67b0f05c3..da14cf9d8 100644
--- a/SmartDeviceLink/SDLPerformAudioPassThru.m
+++ b/SmartDeviceLink/SDLPerformAudioPassThru.m
@@ -9,6 +9,7 @@
#import "SDLNames.h"
#import "SDLSamplingRate.h"
#import "SDLTTSChunk.h"
+#import "SDLTTSChunkFactory.h"
@implementation SDLPerformAudioPassThru
@@ -25,6 +26,34 @@
return self;
}
+- (instancetype)initWithInitialPrompt:(NSString *)initialPrompt audioPassThruDisplayText1:(NSString *)audioPassThruDisplayText1 audioPassThruDisplayText2:(NSString *)audioPassThruDisplayText2 samplingRate:(SDLSamplingRate *)samplingRate bitsPerSample:(SDLBitsPerSample *)bitsPerSample audioType:(SDLAudioType *)audioType maxDuration:(UInt32)maxDuration muteAudio:(BOOL)muteAudio {
+ self = [self initWithSamplingRate:samplingRate bitsPerSample:bitsPerSample audioType:audioType maxDuration:maxDuration];
+ if (!self) {
+ return nil;
+ }
+
+ self.initialPrompt = [SDLTTSChunk textChunksFromString:initialPrompt];
+ self.audioPassThruDisplayText1 = audioPassThruDisplayText1;
+ self.audioPassThruDisplayText2 = audioPassThruDisplayText2;
+ self.muteAudio = @(muteAudio);
+
+ return self;
+}
+
+- (instancetype)initWithSamplingRate:(SDLSamplingRate *)samplingRate bitsPerSample:(SDLBitsPerSample *)bitsPerSample audioType:(SDLAudioType *)audioType maxDuration:(UInt32)maxDuration {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.samplingRate = samplingRate;
+ self.bitsPerSample = bitsPerSample;
+ self.audioType = audioType;
+ self.maxDuration = @(maxDuration);
+
+ return self;
+}
+
- (void)setInitialPrompt:(NSMutableArray *)initialPrompt {
if (initialPrompt != nil) {
[parameters setObject:initialPrompt forKey:NAMES_initialPrompt];
diff --git a/SmartDeviceLink/SDLPerformInteraction.h b/SmartDeviceLink/SDLPerformInteraction.h
index 29f166c96..d023c3a73 100644
--- a/SmartDeviceLink/SDLPerformInteraction.h
+++ b/SmartDeviceLink/SDLPerformInteraction.h
@@ -6,6 +6,8 @@
@class SDLInteractionMode;
@class SDLLayoutMode;
+@class SDLTTSChunk;
+@class SDLVRHelpItem;
/**
@@ -36,6 +38,20 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithInteractionChoiceSetId:(UInt16)interactionChoiceSetId;
+
+- (instancetype)initWithInteractionChoiceSetIdList:(NSArray<NSNumber<SDLInt> *> *)interactionChoiceSetIdList;
+
+- (instancetype)initWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetID:(UInt16)interactionChoiceSetID;
+
+- (instancetype)initWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetID:(UInt16)interactionChoiceSetID vrHelp:(NSArray<SDLVRHelpItem *> *)vrHelp;
+
+- (instancetype)initWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray<NSNumber<SDLInt> *> *)interactionChoiceSetIDList helpPrompt:(NSString *)helpPrompt timeoutPrompt:(NSString *)timeoutPrompt interactionMode:(SDLInteractionMode *)interactionMode timeout:(UInt16)timeout;
+
+- (instancetype)initWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray<NSNumber<SDLInt> *> *)interactionChoiceSetIDList helpPrompt:(NSString *)helpPrompt timeoutPrompt:(NSString *)timeoutPrompt interactionMode:(SDLInteractionMode *)interactionMode timeout:(UInt16)timeout vrHelp:(NSArray<SDLVRHelpItem *> *)vrHelp;
+
+- (instancetype)initWithInitialChunks:(NSArray<SDLTTSChunk *> *)initialChunks initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray<NSNumber<SDLInt> *> *)interactionChoiceSetIDList helpChunks:(NSArray<SDLTTSChunk *> *)helpChunks timeoutChunks:(NSArray *)timeoutChunks interactionMode:(SDLInteractionMode *)interactionMode timeout:(UInt16)timeout vrHelp:(NSArray<SDLVRHelpItem *> *)vrHelp;
+
/**
* @abstract The Text that Displayed when the interaction begins. This text may
* be overlaid by the "Listening" prompt during the interaction. Text is
diff --git a/SmartDeviceLink/SDLPerformInteraction.m b/SmartDeviceLink/SDLPerformInteraction.m
index de6c3622f..4c8772f52 100644
--- a/SmartDeviceLink/SDLPerformInteraction.m
+++ b/SmartDeviceLink/SDLPerformInteraction.m
@@ -8,8 +8,11 @@
#import "SDLLayoutMode.h"
#import "SDLNames.h"
#import "SDLTTSChunk.h"
+#import "SDLTTSChunkFactory.h"
#import "SDLVRHelpItem.h"
+static UInt16 const SDLDefaultTimeout = 10000;
+
@implementation SDLPerformInteraction
- (instancetype)init {
@@ -24,6 +27,57 @@
return self;
}
+- (instancetype)initWithInteractionChoiceSetId:(UInt16)interactionChoiceSetId {
+ return [self initWithInteractionChoiceSetIdList:@[@(interactionChoiceSetId)]];
+}
+
+- (instancetype)initWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetID:(UInt16)interactionChoiceSetID {
+ return [self initWithInitialPrompt:initialPrompt initialText:initialText interactionChoiceSetID:interactionChoiceSetID vrHelp:nil];
+}
+
+- (instancetype)initWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetID:(UInt16)interactionChoiceSetID vrHelp:(NSArray *)vrHelp {
+ return [self initWithInitialPrompt:initialPrompt initialText:initialText interactionChoiceSetIDList:@[@(interactionChoiceSetID)] helpPrompt:nil timeoutPrompt:nil interactionMode:nil timeout:SDLDefaultTimeout vrHelp:vrHelp];
+}
+
+- (instancetype)initWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray *)interactionChoiceSetIDList helpPrompt:(NSString *)helpPrompt timeoutPrompt:(NSString *)timeoutPrompt interactionMode:(SDLInteractionMode *)interactionMode timeout:(UInt16)timeout {
+ return [self initWithInitialPrompt:initialPrompt initialText:initialText interactionChoiceSetIDList:interactionChoiceSetIDList helpPrompt:helpPrompt timeoutPrompt:timeoutPrompt interactionMode:interactionMode timeout:timeout vrHelp:nil];
+}
+
+- (instancetype)initWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray *)interactionChoiceSetIDList helpPrompt:(NSString *)helpPrompt timeoutPrompt:(NSString *)timeoutPrompt interactionMode:(SDLInteractionMode *)interactionMode timeout:(UInt16)timeout vrHelp:(NSArray *)vrHelp {
+ NSMutableArray *initialChunks = [SDLTTSChunk textChunksFromString:initialPrompt];
+ NSMutableArray *helpChunks = [SDLTTSChunk textChunksFromString:helpPrompt];
+ NSMutableArray *timeoutChunks = [SDLTTSChunk textChunksFromString:timeoutPrompt];
+ return [self initWithInitialChunks:initialChunks initialText:initialText interactionChoiceSetIDList:interactionChoiceSetIDList helpChunks:helpChunks timeoutChunks:timeoutChunks interactionMode:interactionMode timeout:timeout vrHelp:vrHelp];
+}
+
+- (instancetype)initWithInitialChunks:(NSArray *)initialChunks initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray *)interactionChoiceSetIDList helpChunks:(NSArray *)helpChunks timeoutChunks:(NSArray *)timeoutChunks interactionMode:(SDLInteractionMode *)interactionMode timeout:(UInt16)timeout vrHelp:(NSArray *)vrHelp {
+ self = [self initWithInteractionChoiceSetIdList:interactionChoiceSetIDList];
+ if (!self) {
+ return nil;
+ }
+
+ self.initialPrompt = [initialChunks mutableCopy];
+ self.initialText = initialText;
+ self.helpPrompt = [helpChunks mutableCopy];
+ self.timeoutPrompt = [timeoutChunks mutableCopy];
+ self.interactionMode = interactionMode;
+ self.timeout = @(timeout);
+ self.vrHelp = [vrHelp mutableCopy];
+
+ return self;
+}
+
+- (instancetype)initWithInteractionChoiceSetIdList:(NSArray *)interactionChoiceSetIdList {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.interactionChoiceSetIDList = [interactionChoiceSetIdList mutableCopy];
+
+ return self;
+}
+
- (void)setInitialText:(NSString *)initialText {
if (initialText != nil) {
[parameters setObject:initialText forKey:NAMES_initialText];
diff --git a/SmartDeviceLink/SDLPermissionConstants.h b/SmartDeviceLink/SDLPermissionConstants.h
new file mode 100644
index 000000000..03b89867a
--- /dev/null
+++ b/SmartDeviceLink/SDLPermissionConstants.h
@@ -0,0 +1,62 @@
+//
+// SDLPermissionsConstants.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 11/18/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "NSNumber+NumberType.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NSString *SDLPermissionRPCName;
+typedef NSUUID *SDLPermissionObserverIdentifier;
+
+/**
+ * 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.
+ */
+typedef NS_ENUM(NSUInteger, SDLPermissionGroupType) {
+ /**
+ * 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.
+ */
+ SDLPermissionGroupTypeAllAllowed,
+ /**
+ * Be notified when any change in availability occurs among the group.
+ */
+ SDLPermissionGroupTypeAny
+};
+
+/**
+ * The status of the group of RPCs permissions.
+ */
+typedef NS_ENUM(NSUInteger, SDLPermissionGroupStatus) {
+ /**
+ * Every RPC in the group is currently allowed.
+ */
+ SDLPermissionGroupStatusAllowed,
+ /**
+ * Every RPC in the group is currently disallowed.
+ */
+ SDLPermissionGroupStatusDisallowed,
+ /**
+ * Some RPCs in the group are allowed and some disallowed.
+ */
+ SDLPermissionGroupStatusMixed,
+ /**
+ * The current status of the group is unknown.
+ */
+ SDLPermissionGroupStatusUnknown
+};
+
+/**
+ * The PermissionObserver is a block that is passed in to some methods that will be stored and called when specified permissions change.
+ *
+ * @param change A dictionary of permission changes containing <key(String): RPC Name, object(BOOL): YES if the RPC is allowed, NO if it is not allowed>
+ * @param status The change made to all of the RPCs in the changedDict. Allowed, if all RPCs are now allowed, Disallowed if all RPCs are now disallowed, or Mixed if some are allowed, and some are disallowed
+ */
+typedef void (^SDLPermissionsChangedHandler)(NSDictionary<SDLPermissionRPCName, NSNumber<SDLBool> *> *_Nonnull change, SDLPermissionGroupStatus status);
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPermissionFilter.h b/SmartDeviceLink/SDLPermissionFilter.h
new file mode 100644
index 000000000..1a89cb876
--- /dev/null
+++ b/SmartDeviceLink/SDLPermissionFilter.h
@@ -0,0 +1,71 @@
+//
+// SDLPermissionFilter.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 11/18/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLPermissionConstants.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLPermissionFilter : NSObject <NSCopying>
+
+/**
+ * An identifier for the permission filter to allow it to be removed at a later time.
+ */
+@property (copy, nonatomic, readonly) SDLPermissionObserverIdentifier identifier;
+
+/**
+ * All of the RPC names in this filter group.
+ */
+@property (copy, nonatomic, readonly) NSArray<SDLPermissionRPCName> *rpcNames;
+
+/**
+ * The type of this filter group.
+ */
+@property (assign, nonatomic, readonly) SDLPermissionGroupType groupType;
+
+/**
+ * The block that will be called on status changes to this filter group.
+ */
+@property (copy, nonatomic, readonly) SDLPermissionsChangedHandler handler;
+
+/**
+ * Create a new permission filter group.
+ *
+ * @param rpcNames The names of the RPCs to watch permissions of.
+ * @param groupType The type of notifications to be sent for this filter group.
+ * @param handler The block observer to be called when changes occur.
+ *
+ * @return An instance of `SDLPermissionFilter`.
+ */
+- (instancetype)initWithRPCNames:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType observer:(SDLPermissionsChangedHandler)handler NS_DESIGNATED_INITIALIZER;
+
+/**
+ * Create a new permission filter group.
+ *
+ * @param rpcNames The names of the RPCs to watch permissions of.
+ * @param groupType The type of notifications to be sent for this filter group.
+ * @param handler The block observer to be called when changes occur.
+ *
+ * @return An instance of `SDLPermissionFilter`.
+ */
++ (instancetype)filterWithRPCNames:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType observer:(SDLPermissionsChangedHandler)handler;
+
+/**
+ * Whether the current filter is equivalent with another filter or not.
+ *
+ * @param otherFilter The other filter to test equivalence with.
+ *
+ * @return YES if this filter is equivalent with `otherFilter`, NO otherwise.
+ */
+- (BOOL)isEqualToFilter:(SDLPermissionFilter *)otherFilter;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPermissionFilter.m b/SmartDeviceLink/SDLPermissionFilter.m
new file mode 100644
index 000000000..0d142b3a3
--- /dev/null
+++ b/SmartDeviceLink/SDLPermissionFilter.m
@@ -0,0 +1,81 @@
+//
+// SDLPermissionFilter.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 11/18/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLPermissionFilter.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+
+@implementation SDLPermissionFilter
+
+#pragma mark - Lifecycle
+
+- (instancetype)init {
+ return [self initWithRPCNames:@[]
+ groupType:SDLPermissionGroupTypeAny
+ observer:^(NSDictionary<SDLPermissionRPCName, NSNumber<SDLBool> *> *_Nonnull change, SDLPermissionGroupStatus status){
+ }];
+}
+
+- (instancetype)initWithRPCNames:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType observer:(SDLPermissionsChangedHandler)observer {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _identifier = [NSUUID UUID];
+ _rpcNames = rpcNames;
+ _groupType = groupType;
+ _handler = observer;
+
+ return self;
+}
+
++ (instancetype)filterWithRPCNames:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType observer:(SDLPermissionsChangedHandler)observer {
+ return [[self alloc] initWithRPCNames:rpcNames groupType:groupType observer:observer];
+}
+
+
+#pragma mark - NSCopying
+
+- (id)copyWithZone:(nullable NSZone *)zone {
+ SDLPermissionFilter *newFilter = [[self.class allocWithZone:zone] initWithRPCNames:[_rpcNames copyWithZone:zone] groupType:_groupType observer:[_handler copyWithZone:zone]];
+ newFilter->_identifier = _identifier;
+
+ return newFilter;
+}
+
+#pragma mark - Equality
+
+- (BOOL)isEqual:(id)object {
+ if (object == self) {
+ return YES;
+ }
+
+ if (![object isMemberOfClass:[self class]]) {
+ return NO;
+ }
+
+ return [self isEqualToFilter:object];
+}
+
+- (BOOL)isEqualToFilter:(SDLPermissionFilter *)otherFilter {
+ return [self.identifier isEqual:otherFilter.identifier];
+}
+
+
+#pragma mark - Description
+
+- (NSString *)description {
+ return [NSString stringWithFormat:@"identifier: %@, group type: %@, rpcs: %@", self.identifier, @(self.groupType), self.rpcNames];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPermissionManager.h b/SmartDeviceLink/SDLPermissionManager.h
new file mode 100644
index 000000000..5aea0c81d
--- /dev/null
+++ b/SmartDeviceLink/SDLPermissionManager.h
@@ -0,0 +1,89 @@
+//
+// SDLPermissionManager.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/14/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLPermissionConstants.h"
+
+@class SDLHMILevel;
+@class SDLPermissionItem;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLPermissionManager : NSObject
+
+/**
+ * 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 `SDLManager`.
+ *
+ * @param completionHandler The block to be called when the manager's setup is complete.
+ */
+- (void)startWithCompletionHandler:(void (^)(BOOL success, NSError *__nullable error))completionHandler;
+
+/**
+ * Stop the manager. This method is used internally.
+ */
+- (void)stop;
+
+/**
+ * Determine if an individual RPC is allowed for the current HMI level
+ *
+ * @param rpcName The name of the RPC to be tested, for example, SDLShow
+ *
+ * @return YES if the RPC is allowed at the current HMI level, NO if not
+ */
+- (BOOL)isRPCAllowed:(SDLPermissionRPCName)rpcName;
+
+/**
+ * Determine if all RPCs are allowed for the current HMI level
+ *
+ * @param rpcNames The RPCs to check
+ *
+ * @return AllAllowed if all of the permissions are allowed, AllDisallowed if all the permissions are disallowed, Any if some are allowed, and some are disallowed
+ */
+- (SDLPermissionGroupStatus)groupStatusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames;
+
+/**
+ * Retrieve a dictionary with keys that are the passed in RPC names, and objects of an NSNumber<BOOL> specifying if that RPC is currently allowed
+ *
+ * @param rpcNames An array of RPC names to check
+ *
+ * @return A dictionary specifying if the passed in RPC names are currently allowed or not
+ */
+- (NSDictionary<SDLPermissionRPCName, NSNumber<SDLBool> *> *)statusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames;
+
+/**
+ * Add an observer for specified RPC names, with a callback that will be called whenever the value changes, as well as immediately with the current status.
+ *
+ * @warning This block will be captured by the SDLPermissionsManager, be sure to use [weakself/strongself](http://www.logicsector.com/ios/avoiding-objc-retain-cycles-with-weakself-and-strongself-the-easy-way/) if you are referencing self within your observer block.
+ *
+ * @warning The observer may be called before this method returns, do not attempt to remove the observer from within the observer. That could send `nil` to removeObserverForIdentifier:. If you want functionality like that, call groupStatusOfRPCs: instead.
+ *
+ * @param rpcNames The RPCs to be observed
+ * @param groupType Affects the times that the observer block will be called. If Any, any change to any RPC in rpcNames will cause the observer block to be called. If AllAllowed, the block will be called when: 1. Every RPC in rpcNames becomes allowed 2. The group of rpcNames goes from all being allowed to some or all being disallowed.
+ * @param handler The block that will be called whenever permissions change.
+ *
+ * @return An identifier that can be passed to removeObserverForIdentifer: to remove the observer
+ */
+- (SDLPermissionObserverIdentifier)addObserverForRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType withHandler:(SDLPermissionsChangedHandler)handler;
+
+/**
+ * Remove every current observer
+ */
+- (void)removeAllObservers;
+
+/**
+ * Remove block observers for the specified RPC
+ *
+ * @param identifier The identifier specifying which observer to remove
+ */
+- (void)removeObserverForIdentifier:(SDLPermissionObserverIdentifier)identifier;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPermissionManager.m b/SmartDeviceLink/SDLPermissionManager.m
new file mode 100644
index 000000000..a6898ee55
--- /dev/null
+++ b/SmartDeviceLink/SDLPermissionManager.m
@@ -0,0 +1,342 @@
+//
+// SDLPermissionManager.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/14/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLPermissionManager.h"
+
+#import "SDLHMILevel.h"
+#import "SDLHMIPermissions.h"
+#import "SDLNotificationConstants.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLOnPermissionsChange.h"
+#import "SDLPermissionFilter.h"
+#import "SDLPermissionItem.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLStateMachine.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLPermissionManager ()
+
+@property (copy, nonatomic) NSMutableDictionary<SDLPermissionRPCName, SDLPermissionItem *> *permissions;
+@property (copy, nonatomic) NSMutableArray<SDLPermissionFilter *> *filters;
+@property (copy, nonatomic, nullable) SDLHMILevel *currentHMILevel;
+
+@end
+
+
+@implementation SDLPermissionManager
+
+#pragma mark - Lifecycle
+
+- (instancetype)init {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _currentHMILevel = nil;
+ _permissions = [NSMutableDictionary<SDLPermissionRPCName, SDLPermissionItem *> dictionary];
+ _filters = [NSMutableArray<SDLPermissionFilter *> array];
+
+ // Set up SDL status notifications
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_permissionsDidChange:) name:SDLDidChangePermissionsNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiLevelDidChange:) name:SDLDidChangeHMIStatusNotification object:nil];
+
+ return self;
+}
+
+- (void)startWithCompletionHandler:(void (^)(BOOL, NSError *_Nullable))completionHandler {
+ completionHandler(YES, nil);
+}
+
+- (void)stop {
+ // Nothing to do here right now
+}
+
+
+#pragma mark - Permissions available
+
+- (BOOL)isRPCAllowed:(NSString *)rpcName {
+ if (self.permissions[rpcName] == nil || self.currentHMILevel == nil) {
+ return NO;
+ }
+
+ SDLPermissionItem *item = self.permissions[rpcName];
+ return [item.hmiPermissions.allowed containsObject:self.currentHMILevel];
+}
+
+- (SDLPermissionGroupStatus)groupStatusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames {
+ if (self.currentHMILevel == nil) {
+ return SDLPermissionGroupStatusUnknown;
+ }
+
+ return [self.class sdl_groupStatusOfRPCs:rpcNames withPermissions:[self.permissions copy] hmiLevel:self.currentHMILevel];
+}
+
++ (SDLPermissionGroupStatus)sdl_groupStatusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames withPermissions:(NSDictionary<SDLPermissionRPCName, SDLPermissionItem *> *)permissions hmiLevel:(SDLHMILevel *)hmiLevel {
+ // If we don't have an HMI level, then just say everything is disallowed
+ if (hmiLevel == nil) {
+ return SDLPermissionGroupStatusUnknown;
+ }
+
+ BOOL hasAllowed = NO;
+ BOOL hasDisallowed = NO;
+
+ // Loop through all the RPCs we need to check
+ for (NSString *rpcName in rpcNames) {
+ // If at this point in the loop, we have both allowed and disallowed RPCs, return the mixed result
+ if (hasAllowed && hasDisallowed) {
+ return SDLPermissionGroupStatusMixed;
+ }
+
+ // If we don't have a status for this permission, set it as disallowed
+ if (permissions[rpcName] == nil) {
+ hasDisallowed = YES;
+ continue;
+ }
+
+ // Check the permission's "allowed" array for the current HMI level
+ if ([permissions[rpcName].hmiPermissions.allowed containsObject:hmiLevel]) {
+ hasAllowed = YES;
+ } else {
+ hasDisallowed = YES;
+ }
+ }
+
+ if (hasAllowed && hasDisallowed) {
+ return SDLPermissionGroupStatusMixed;
+ } else if (hasAllowed) {
+ return SDLPermissionGroupStatusAllowed;
+ } else {
+ return SDLPermissionGroupStatusDisallowed;
+ }
+}
+
+- (NSDictionary<SDLPermissionRPCName, NSNumber<SDLBool> *> *)statusOfRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames {
+ NSMutableDictionary<SDLPermissionRPCName, NSNumber<SDLBool> *> *permissionAllowedDict = [NSMutableDictionary dictionary];
+
+ for (NSString *rpcName in rpcNames) {
+ BOOL allowed = [self isRPCAllowed:rpcName];
+ permissionAllowedDict[rpcName] = @(allowed);
+ }
+
+ return [permissionAllowedDict copy];
+}
+
+
+#pragma mark - Permissions observers
+
+#pragma mark Add Observers
+
+- (SDLPermissionObserverIdentifier)addObserverForRPCs:(NSArray<SDLPermissionRPCName> *)rpcNames groupType:(SDLPermissionGroupType)groupType withHandler:(nonnull SDLPermissionsChangedHandler)handler {
+ SDLPermissionFilter *filter = [SDLPermissionFilter filterWithRPCNames:rpcNames groupType:groupType observer:handler];
+
+ // Store the filter for later use
+ [self.filters addObject:filter];
+
+ // If there are permissions that fit the specifications, send immediately. Then return the identifier.
+ [self sdl_callFilterObserver:filter];
+
+ return filter.identifier;
+}
+
+- (void)sdl_callFilterObserver:(SDLPermissionFilter *)filter {
+ SDLPermissionGroupStatus permissionStatus = [self groupStatusOfRPCs:filter.rpcNames];
+ NSDictionary<SDLPermissionRPCName, NSNumber<SDLBool> *> *allowedDict = [self statusOfRPCs:filter.rpcNames];
+
+ filter.handler(allowedDict, permissionStatus);
+}
+
+#pragma mark Remove Observers
+
+- (void)removeAllObservers {
+ [self.filters removeAllObjects];
+}
+
+- (void)removeObserverForIdentifier:(SDLPermissionObserverIdentifier)identifier {
+ NSArray<SDLPermissionFilter *> *filters = [self.filters copy];
+
+ for (int i = 0; i < filters.count; i++) {
+ SDLPermissionFilter *filter = filters[i];
+
+ if ([filter.identifier isEqual:identifier]) {
+ [self.filters removeObjectAtIndex:i];
+ break;
+ }
+ }
+}
+
+
+#pragma mark - SDL Notification Observers
+
+- (void)sdl_permissionsDidChange:(NSNotification *)notification {
+ NSAssert([notification.userInfo[SDLNotificationUserInfoObject] isKindOfClass:[SDLOnPermissionsChange class]], @"A notification was sent with an unanticipated object");
+ if (![notification.userInfo[SDLNotificationUserInfoObject] isKindOfClass:[SDLOnPermissionsChange class]]) {
+ return;
+ }
+
+ SDLOnPermissionsChange *onPermissionChange = notification.userInfo[SDLNotificationUserInfoObject];
+ NSArray<SDLPermissionItem *> *newPermissionItems = [onPermissionChange.permissionItem copy];
+ NSArray<SDLPermissionFilter *> *currentFilters = [self.filters copy];
+
+ // We can eliminate calling those filters who had no permission changes, so we'll filter down and see which had permissions that changed
+ NSArray<SDLPermissionFilter *> *modifiedFilters = [self.class sdl_filterPermissionChangesForFilters:currentFilters updatedPermissions:newPermissionItems];
+
+ // We need the old group status and new group status for all allowed filters so we know if they should be called
+ NSDictionary<SDLPermissionObserverIdentifier, NSNumber<SDLInt> *> *allAllowedFiltersWithOldStatus = [self sdl_currentStatusForFilters:modifiedFilters];
+
+ // Set the updated permissions on our stored permissions object
+ for (SDLPermissionItem *item in newPermissionItems) {
+ self.permissions[item.rpcName] = item;
+ }
+
+ // Check if the observer should be called based on the group type
+ NSMutableArray<SDLPermissionFilter *> *filtersToCall = [NSMutableArray array];
+ for (SDLPermissionFilter *filter in modifiedFilters) {
+ if (filter.groupType == SDLPermissionGroupTypeAllAllowed) {
+ SDLPermissionGroupStatus oldStatus = [allAllowedFiltersWithOldStatus[filter.identifier] unsignedIntegerValue];
+ SDLPermissionGroupStatus newStatus = [self groupStatusOfRPCs:filter.rpcNames];
+
+ // We've already eliminated the case where the permissions could stay the same, so if the permissions changed *to* allowed or *away* from allowed, we need to call the observer.
+ if (newStatus == SDLPermissionGroupStatusAllowed || oldStatus == SDLPermissionGroupStatusAllowed) {
+ [filtersToCall addObject:filter];
+ }
+ } else {
+ // The filter is an `any` type and we know it changed, so we'll call it
+ [filtersToCall addObject:filter];
+ }
+ }
+
+ // For all the modified filters we care about, call them
+ for (SDLPermissionFilter *filter in filtersToCall) {
+ [self sdl_callFilterObserver:filter];
+ }
+}
+
+- (void)sdl_hmiLevelDidChange:(SDLRPCNotificationNotification *)notification {
+ NSAssert([notification.notification isKindOfClass:[SDLOnHMIStatus class]], @"A notification was sent with an unanticipated object");
+ if (![notification.notification isKindOfClass:[SDLOnHMIStatus class]]) {
+ return;
+ }
+
+ SDLOnHMIStatus *hmiStatus = notification.userInfo[SDLNotificationUserInfoObject];
+
+ SDLHMILevel *oldHMILevel = [self.currentHMILevel copy];
+ self.currentHMILevel = hmiStatus.hmiLevel;
+ NSArray<SDLPermissionFilter *> *filters = [self.filters copy];
+
+
+ NSMutableArray<SDLPermissionFilter *> *mutableFiltersToCall = [NSMutableArray arrayWithCapacity:filters.count];
+ for (SDLPermissionFilter *filter in filters) {
+ // Check if the filter changed, according to its group type settings.
+ BOOL filterChanged = [self sdl_didFilterChange:filter fromHMILevel:oldHMILevel toHMILevel:self.currentHMILevel];
+
+ if (filterChanged) {
+ [mutableFiltersToCall addObject:filter];
+ }
+ }
+
+ NSArray *filtersToCall = [mutableFiltersToCall copy];
+
+ // For all the modified filters, call if necessary
+ for (SDLPermissionFilter *filter in filtersToCall) {
+ [self sdl_callFilterObserver:filter];
+ }
+}
+
+
+#pragma mark Helper Methods
+
+/**
+ * Determine if a filter changes based on an HMI level change and the filter's group type settings. This will run through the filter's RPCs, check the permission for each and see if any permission within the filter changes based on some permission now being allowed when it wasn't, or not allowed when it was. This also takes into account the group type setting, so an All Allowed filter will return YES if and only if some permission changed *and* that causes a status change *to* or *from* Allowed.
+ *
+ * @param filter The filter to check
+ * @param oldHMILevel The old HMI level
+ * @param newHMILevel The new HMI level
+ *
+ * @return Whether or not the filter changed based on the difference in HMI levels.
+ */
+- (BOOL)sdl_didFilterChange:(SDLPermissionFilter *)filter fromHMILevel:(SDLHMILevel *)oldHMILevel toHMILevel:(SDLHMILevel *)newHMILevel {
+ BOOL changed = NO;
+ for (NSString *rpcName in filter.rpcNames) {
+ SDLPermissionItem *item = self.permissions[rpcName];
+ BOOL newAllowed = [item.hmiPermissions.allowed containsObject:self.currentHMILevel];
+ BOOL oldAllowed = [item.hmiPermissions.allowed containsObject:oldHMILevel];
+
+ if ((newAllowed && !oldAllowed) || (!newAllowed && oldAllowed)) {
+ // Now permitted when it was not before, or not permitted when it was before
+ if (filter.groupType == SDLPermissionGroupTypeAny) {
+ return YES;
+ } else {
+ changed = YES;
+ break;
+ }
+ }
+ }
+
+ // This is only for the All Allowed group type. Unlike with the Any group type, we need to know if the group status has changed
+ if (changed) {
+ SDLPermissionGroupStatus oldStatus = [self.class sdl_groupStatusOfRPCs:filter.rpcNames withPermissions:self.permissions hmiLevel:oldHMILevel];
+ SDLPermissionGroupStatus newStatus = [self.class sdl_groupStatusOfRPCs:filter.rpcNames withPermissions:self.permissions hmiLevel:newHMILevel];
+
+ // We've already eliminated the case where the permissions could stay the same, so if the permissions changed *to* allowed or *away* from allowed, we need to call the observer.
+ if (newStatus == SDLPermissionGroupStatusAllowed || oldStatus == SDLPermissionGroupStatusAllowed) {
+ return YES;
+ }
+ }
+
+ return NO;
+}
+
+/**
+ * Get a dictionary of the current group status for filters passed in.
+ *
+ * @param filters The filters to check
+ *
+ * @return A dictionary of filters as the keys and an NSNumber wrapper for the SDLPermissionGroupStatus
+ */
+- (NSDictionary<NSUUID *, NSNumber<SDLInt> *> *)sdl_currentStatusForFilters:(NSArray<SDLPermissionFilter *> *)filters {
+ // Create a dictionary that has the all allowed filters and stores their group status for future reference
+ NSMutableDictionary<SDLPermissionFilter *, NSNumber<SDLInt> *> *filtersWithStatus = [NSMutableDictionary dictionary];
+ for (SDLPermissionFilter *filter in filters) {
+ if (filter.groupType == SDLPermissionGroupTypeAllAllowed) {
+ filtersWithStatus[filter.identifier] = @([self groupStatusOfRPCs:filter.rpcNames]);
+ }
+ }
+
+ return [filtersWithStatus copy];
+}
+
+/**
+ * Takes a set of filters and a set of updated permission items. Loops through each permission for each filter and determines if the filter contains a permission that was updated. Returns the set of filters that contain an updated permission.
+ *
+ * @param filters The set of filters to check
+ * @param permissionItems The set of updated permissions to test each filter against
+ *
+ * @return An array of filters that contained one of the passed permissions
+ */
++ (NSArray<SDLPermissionFilter *> *)sdl_filterPermissionChangesForFilters:(NSArray<SDLPermissionFilter *> *)filters updatedPermissions:(NSArray<SDLPermissionItem *> *)permissionItems {
+ NSMutableArray<SDLPermissionFilter *> *modifiedFilters = [NSMutableArray arrayWithCapacity:filters.count];
+
+ // Loop through each updated permission item for each filter, if the filter had something modified, store it and go to the next filter
+ for (SDLPermissionFilter *filter in filters) {
+ for (SDLPermissionItem *item in permissionItems) {
+ if ([filter.rpcNames containsObject:item.rpcName]) {
+ [modifiedFilters addObject:filter];
+ break;
+ }
+ }
+ }
+
+ return [modifiedFilters copy];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLPolicyDataParser.m b/SmartDeviceLink/SDLPolicyDataParser.m
index e528e4bd4..92b1e1580 100644
--- a/SmartDeviceLink/SDLPolicyDataParser.m
+++ b/SmartDeviceLink/SDLPolicyDataParser.m
@@ -3,7 +3,7 @@
//
#import "SDLPolicyDataParser.h"
-
+#import "SDLDebugTool.h"
@implementation SDLPolicyDataParser
@@ -27,7 +27,7 @@
}
@catch (NSException *exception) {
decodedData = nil;
- NSLog(@"Error in PolicyDataParser::unwrap()");
+ [SDLDebugTool logInfo:@"Error in PolicyDataParser::unwrap()"];
}
return decodedData;
@@ -110,7 +110,7 @@
}
@catch (NSException *exception) {
- NSLog(@"Error in PolicyDataParser::parsePolicyData()");
+ [SDLDebugTool logInfo:@"Error in PolicyDataParser::parsePolicyData()"];
}
}
diff --git a/SmartDeviceLink/SDLProtocolHeader.m b/SmartDeviceLink/SDLProtocolHeader.m
index 11a3d0401..f0293f420 100644
--- a/SmartDeviceLink/SDLProtocolHeader.m
+++ b/SmartDeviceLink/SDLProtocolHeader.m
@@ -60,7 +60,7 @@
} break;
default: {
NSString *reason = [NSString stringWithFormat:@"The version of header that is being created is unknown: %@", @(version)];
- @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:@{ @"requestedVersion" : @(version) }];
+ @throw [NSException exceptionWithName:NSInvalidArgumentException reason:reason userInfo:@{ @"requestedVersion": @(version) }];
} break;
}
}
diff --git a/SmartDeviceLink/SDLProtocolMessage.m b/SmartDeviceLink/SDLProtocolMessage.m
index f68810123..bfc33c4d7 100644
--- a/SmartDeviceLink/SDLProtocolMessage.m
+++ b/SmartDeviceLink/SDLProtocolMessage.m
@@ -63,7 +63,7 @@
NSString *functionName = [[[SDLFunctionID alloc] init] getFunctionName:rpcPayload.functionID];
UInt8 rpcType = rpcPayload.rpcType;
- NSArray *rpcTypeNames = @[ @"Request", @"Response", @"Notification" ];
+ NSArray *rpcTypeNames = @[@"Request", @"Response", @"Notification"];
NSString *rpcTypeString = nil;
if (rpcType >= 0 && rpcType < rpcTypeNames.count) {
rpcTypeString = rpcTypeNames[rpcType];
@@ -91,6 +91,8 @@
newMessage = [[SDLV1ProtocolMessage alloc] initWithHeader:(SDLProtocolHeader *)header andPayload:(NSData *)payload];
} else if (version >= 2) {
newMessage = [[SDLV2ProtocolMessage alloc] initWithHeader:(SDLProtocolHeader *)header andPayload:(NSData *)payload];
+ } else {
+ @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Attempted to create an SDLMessage, but the version of the header passed was 0" userInfo:nil];
}
return newMessage;
diff --git a/SmartDeviceLink/SDLProtocolMessageAssembler.m b/SmartDeviceLink/SDLProtocolMessageAssembler.m
index c41591c51..b43c94189 100644
--- a/SmartDeviceLink/SDLProtocolMessageAssembler.m
+++ b/SmartDeviceLink/SDLProtocolMessageAssembler.m
@@ -3,6 +3,7 @@
#import "SDLProtocolMessageAssembler.h"
+#import "SDLDebugTool.h"
#import "SDLProtocolHeader.h"
#import "SDLProtocolMessage.h"
@@ -18,7 +19,7 @@
- (void)handleMessage:(SDLProtocolMessage *)message withCompletionHandler:(SDLMessageAssemblyCompletionHandler)completionHandler {
// Validate input
if (message.header.sessionID != self.sessionID) {
- NSLog(@"Error: message part sent to wrong assembler.");
+ [SDLDebugTool logInfo:@"Error: message part sent to wrong assembler."];
return;
}
@@ -68,7 +69,7 @@
// Validation
header.bytesInPayload = (UInt32)payload.length;
if (payload.length != self.expectedBytes) {
- NSLog(@"Warning: collected bytes size of %lu not equal to expected size of %i.", (unsigned long)payload.length, (unsigned int)self.expectedBytes);
+ [SDLDebugTool logFormat:@"Warning: collected bytes size of %lu not equal to expected size of %i.", (unsigned long)payload.length, (unsigned int)self.expectedBytes];
}
// Create the message.
diff --git a/SmartDeviceLink/SDLProxy.h b/SmartDeviceLink/SDLProxy.h
index 43095e2c2..05da1c2b5 100644
--- a/SmartDeviceLink/SDLProxy.h
+++ b/SmartDeviceLink/SDLProxy.h
@@ -14,8 +14,8 @@
#import "SDLProxyListener.h"
#import "SDLSecurityType.h"
-
-@interface SDLProxy : NSObject <SDLProtocolListener, NSStreamDelegate> {
+__deprecated_msg("Use SDLManager instead")
+ @interface SDLProxy : NSObject<SDLProtocolListener, NSStreamDelegate> {
Byte _version;
Byte _bulkSessionID;
BOOL _isConnected;
diff --git a/SmartDeviceLink/SDLProxy.m b/SmartDeviceLink/SDLProxy.m
index 20e8520f2..833525184 100644
--- a/SmartDeviceLink/SDLProxy.m
+++ b/SmartDeviceLink/SDLProxy.m
@@ -18,9 +18,7 @@
#import "SDLJsonEncoder.h"
#import "SDLLanguage.h"
#import "SDLLayoutMode.h"
-#import "SDLLockScreenManager.h"
-#import "SDLLockScreenManager.h"
-#import "SDLLockScreenManager.h"
+#import "SDLLockScreenStatusManager.h"
#import "SDLNames.h"
#import "SDLOnHMIStatus.h"
#import "SDLOnSystemRequest.h"
@@ -35,7 +33,6 @@
#import "SDLRPCPayload.h"
#import "SDLRPCPayload.h"
#import "SDLRPCPayload.h"
-#import "SDLRPCRequestFactory.h"
#import "SDLRPCResponse.h"
#import "SDLRegisterAppInterfaceResponse.h"
#import "SDLRequestType.h"
@@ -52,14 +49,14 @@ typedef NSString SDLVehicleMake;
typedef void (^URLSessionTaskCompletionHandler)(NSData *data, NSURLResponse *response, NSError *error);
typedef void (^URLSessionDownloadTaskCompletionHandler)(NSURL *location, NSURLResponse *response, NSError *error);
-NSString *const SDLProxyVersion = @"4.2.4";
+NSString *const SDLProxyVersion = @"4.3.0";
const float startSessionTime = 10.0;
const float notifyProxyClosedDelay = 0.1;
const int POLICIES_CORRELATION_ID = 65535;
@interface SDLProxy () {
- SDLLockScreenManager *_lsm;
+ SDLLockScreenStatusManager *_lsm;
}
@property (copy, nonatomic) NSString *appId;
@@ -77,7 +74,7 @@ const int POLICIES_CORRELATION_ID = 65535;
- (instancetype)initWithTransport:(SDLAbstractTransport *)transport protocol:(SDLAbstractProtocol *)protocol delegate:(NSObject<SDLProxyListener> *)theDelegate {
if (self = [super init]) {
_debugConsoleGroupName = @"default";
- _lsm = [[SDLLockScreenManager alloc] init];
+ _lsm = [[SDLLockScreenStatusManager alloc] init];
_alreadyDestructed = NO;
_mutableProxyListeners = [NSMutableSet setWithObject:theDelegate];
@@ -184,6 +181,9 @@ const int POLICIES_CORRELATION_ID = 65535;
- (SDLStreamingMediaManager *)streamingMediaManager {
if (_streamingMediaManager == nil) {
+ if (self.displayCapabilities == nil) {
+ @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"SDLStreamingMediaManager must be accessed only after a successful RegisterAppInterfaceResponse" userInfo:nil];
+ }
_streamingMediaManager = [[SDLStreamingMediaManager alloc] initWithProtocol:self.protocol displayCapabilities:self.displayCapabilities];
[self.protocol.protocolDelegateTable addObject:_streamingMediaManager];
[self.mutableProxyListeners addObject:_streamingMediaManager.touchManager];
@@ -717,7 +717,7 @@ const int POLICIES_CORRELATION_ID = 65535;
// Prepare the data in the required format
NSString *encodedSyncPDataString = [[NSString stringWithFormat:@"%@", encodedSyncPData] componentsSeparatedByString:@"\""][1];
NSArray *array = [NSArray arrayWithObject:encodedSyncPDataString];
- NSDictionary *dictionary = @{ @"data" : array };
+ NSDictionary *dictionary = @{ @"data": array };
NSError *JSONSerializationError = nil;
NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:kNilOptions error:&JSONSerializationError];
if (JSONSerializationError) {
diff --git a/SmartDeviceLink/SDLProxyFactory.h b/SmartDeviceLink/SDLProxyFactory.h
index b3a7ac6a0..f4aee3089 100644
--- a/SmartDeviceLink/SDLProxyFactory.h
+++ b/SmartDeviceLink/SDLProxyFactory.h
@@ -7,8 +7,8 @@
@class SDLProxy;
-
-@interface SDLProxyFactory : NSObject {
+__deprecated_msg("Use SDLManager instead")
+ @interface SDLProxyFactory : NSObject {
}
+ (SDLProxy *)buildSDLProxyWithListener:(NSObject<SDLProxyListener> *)listener;
diff --git a/SmartDeviceLink/SDLProxyListener.h b/SmartDeviceLink/SDLProxyListener.h
index 60e4d6607..4a1a1ac09 100644
--- a/SmartDeviceLink/SDLProxyListener.h
+++ b/SmartDeviceLink/SDLProxyListener.h
@@ -30,6 +30,7 @@
@class SDLOnEncodedSyncPData;
@class SDLOnHashChange;
@class SDLOnHMIStatus;
+@class SDLOnKeyboardInput;
@class SDLOnLanguageChange;
@class SDLOnLockScreenStatus;
@class SDLOnPermissionsChange;
@@ -100,6 +101,7 @@
- (void)onOnCommand:(SDLOnCommand *)notification;
- (void)onOnEncodedSyncPData:(SDLOnEncodedSyncPData *)notification;
- (void)onOnHashChange:(SDLOnHashChange *)notification;
+- (void)onOnKeyboardInput:(SDLOnKeyboardInput *)notification;
- (void)onOnLanguageChange:(SDLOnLanguageChange *)notification;
- (void)onOnLockScreenNotification:(SDLOnLockScreenStatus *)notification;
- (void)onOnPermissionsChange:(SDLOnPermissionsChange *)notification;
diff --git a/SmartDeviceLink/SDLPutFile.h b/SmartDeviceLink/SDLPutFile.h
index eb7bae2bf..f0a74f95e 100644
--- a/SmartDeviceLink/SDLPutFile.h
+++ b/SmartDeviceLink/SDLPutFile.h
@@ -29,6 +29,12 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithFileName:(NSString *)fileName fileType:(SDLFileType *)fileType;
+
+- (instancetype)initWithFileName:(NSString *)fileName fileType:(SDLFileType *)fileType persistentFile:(BOOL)persistentFile;
+
+- (instancetype)initWithFileName:(NSString *)fileName fileType:(SDLFileType *)fileType persistentFile:(BOOL)persistentFile systemFile:(BOOL)systemFile offset:(UInt64)offset length:(UInt64)length;
+
/**
* A file reference name
*
diff --git a/SmartDeviceLink/SDLPutFile.m b/SmartDeviceLink/SDLPutFile.m
index 69d83edcd..0442d3655 100644
--- a/SmartDeviceLink/SDLPutFile.m
+++ b/SmartDeviceLink/SDLPutFile.m
@@ -21,6 +21,42 @@
return self;
}
+- (instancetype)initWithFileName:(NSString *)fileName fileType:(SDLFileType *)fileType persistentFile:(BOOL)persistentFile systemFile:(BOOL)systemFile offset:(UInt64)offset length:(UInt64)length {
+ self = [self initWithFileName:fileName fileType:fileType persistentFile:persistentFile];
+ if (!self) {
+ return nil;
+ }
+
+ self.systemFile = @(systemFile);
+ self.offset = @(offset);
+ self.length = @(length);
+
+ return self;
+}
+
+- (instancetype)initWithFileName:(NSString *)fileName fileType:(SDLFileType *)fileType persistentFile:(BOOL)persistentFile {
+ self = [self initWithFileName:fileName fileType:fileType];
+ if (!self) {
+ return nil;
+ }
+
+ self.persistentFile = @(persistentFile);
+
+ return self;
+}
+
+- (instancetype)initWithFileName:(NSString *)fileName fileType:(SDLFileType *)fileType {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.syncFileName = fileName;
+ self.fileType = fileType;
+
+ return self;
+}
+
- (void)setSyncFileName:(NSString *)syncFileName {
if (syncFileName != nil) {
[parameters setObject:syncFileName forKey:NAMES_syncFileName];
diff --git a/SmartDeviceLink/SDLRPCNotificationNotification.h b/SmartDeviceLink/SDLRPCNotificationNotification.h
new file mode 100644
index 000000000..6c548812a
--- /dev/null
+++ b/SmartDeviceLink/SDLRPCNotificationNotification.h
@@ -0,0 +1,24 @@
+//
+// SDLRPCNotificationNotification.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 8/25/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLRPCNotification;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLRPCNotificationNotification : NSNotification
+
+@property (copy, nonatomic, readonly) __kindof SDLRPCNotification *notification;
+
+- (instancetype)initWithName:(NSString *)name object:(nullable id)object rpcNotification:(__kindof SDLRPCNotification *)notification;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLRPCNotificationNotification.m b/SmartDeviceLink/SDLRPCNotificationNotification.m
new file mode 100644
index 000000000..898580654
--- /dev/null
+++ b/SmartDeviceLink/SDLRPCNotificationNotification.m
@@ -0,0 +1,36 @@
+//
+// SDLRPCNotificationNotification.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 8/25/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLRPCNotificationNotification.h"
+
+#import "SDLNotificationConstants.h"
+#import "SDLRPCNotification.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLRPCNotificationNotification
+
+@synthesize name = _name;
+@synthesize object = _object;
+@synthesize userInfo = _userInfo;
+
+- (instancetype)initWithName:(NSString *)name object:(nullable id)object rpcNotification:(SDLRPCNotification *)notification {
+ _name = name;
+ _object = object;
+ _userInfo = @{SDLNotificationUserInfoObject: notification};
+
+ return self;
+}
+
+- (__kindof SDLRPCNotification *)notification {
+ return _userInfo[SDLNotificationUserInfoObject];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLRPCPayload.m b/SmartDeviceLink/SDLRPCPayload.m
index 25a4c9dab..2d47b6d1f 100644
--- a/SmartDeviceLink/SDLRPCPayload.m
+++ b/SmartDeviceLink/SDLRPCPayload.m
@@ -4,6 +4,8 @@
#import "SDLRPCPayload.h"
+#import "SDLDebugTool.h"
+
const NSUInteger RPC_HEADER_SIZE = 12;
@implementation SDLRPCPayload
@@ -18,12 +20,12 @@ const NSUInteger RPC_HEADER_SIZE = 12;
unsigned long dataLength = data.length;
if (data == nil || dataLength == 0) {
- NSLog(@"Error: data is nil.");
+ [SDLDebugTool logInfo:@"Error: data is nil."];
return nil;
}
if (dataLength < RPC_HEADER_SIZE) {
- NSLog(@"Error: insfficient data to form RPC header.");
+ [SDLDebugTool logInfo:@"Error: insfficient data to form RPC header."];
return nil;
}
@@ -66,10 +68,7 @@ const NSUInteger RPC_HEADER_SIZE = 12;
} @catch (NSException *e) {
// Print exception information
- NSLog(@"NSException caught in SDLRPCPayload::initWithData");
- NSLog(@"Name: %@", e.name);
- NSLog(@"Reason: %@", e.reason);
- NSLog(@"Data: %@", data.debugDescription);
+ [SDLDebugTool logFormat:@"NSException caught in SDLRPCPayload::initWithData\nName: %@\nReason: %@\nData: %@", e.name, e.reason, data.debugDescription];
return nil;
}
}
diff --git a/SmartDeviceLink/SDLRPCRequestFactory.h b/SmartDeviceLink/SDLRPCRequestFactory.h
index 6df474850..a080d689d 100644
--- a/SmartDeviceLink/SDLRPCRequestFactory.h
+++ b/SmartDeviceLink/SDLRPCRequestFactory.h
@@ -3,6 +3,8 @@
#import <Foundation/Foundation.h>
+#import "SDLNotificationConstants.h"
+
@class SDLAddCommand;
@class SDLAddSubMenu;
@class SDLAlert;
@@ -43,10 +45,14 @@
@class SDLShow;
@class SDLShowConstantTBT;
@class SDLSlider;
+@class SDLSoftButton;
+@class SDLSoftButtonType;
@class SDLSpeak;
@class SDLSubscribeButton;
@class SDLSubscribeVehicleData;
+@class SDLSystemAction;
@class SDLTextAlignment;
+@class SDLTTSChunk;
@class SDLUnregisterAppInterface;
@class SDLUnsubscribeButton;
@class SDLUnsubscribeVehicleData;
@@ -54,157 +60,167 @@
@class SDLUpdateTurnList;
-@interface SDLRPCRequestFactory : NSObject {
+__deprecated_msg("use class's initializers instead") @interface SDLRPCRequestFactory : NSObject {
}
//***** AddCommand *****
-+ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID menuName:(NSString *)menuName parentID:(NSNumber *)parentID position:(NSNumber *)position vrCommands:(NSArray *)vrCommands iconValue:(NSString *)iconValue iconType:(SDLImageType *)iconType correlationID:(NSNumber *)correlationID;
++ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID menuName:(NSString *)menuName parentID:(NSNumber *)parentID position:(NSNumber *)position vrCommands:(NSArray *)vrCommands iconValue:(NSString *)iconValue iconType:(SDLImageType *)iconType correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAddCommand's buildAddCommandWithID:vrCommands:menuName:parentID:position:iconValue:iconType:handler: instead");
+;
+
++ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID menuName:(NSString *)menuName vrCommands:(NSArray *)vrCommands correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAddCommands's initWithId:vrCommands:menuName:handler: instead");
+
++ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID vrCommands:(NSArray *)vrCommands correlationID:(NSNumber *)correlationID __deprecated_msg("use buildAddCommandWithID:vrCommands:handler: with SDLManager instead");
-+ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID menuName:(NSString *)menuName vrCommands:(NSArray *)vrCommands correlationID:(NSNumber *)correlationID;
++ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID menuName:(NSString *)menuName parentID:(NSNumber *)parentID position:(NSNumber *)position vrCommands:(NSArray *)vrCommands iconValue:(NSString *)iconValue iconType:(SDLImageType *)iconType handler:(SDLRPCNotificationHandler)handler __deprecated_msg("use SDLAddCommand's initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:handler: instead");
-+ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID vrCommands:(NSArray *)vrCommands correlationID:(NSNumber *)correlationID;
++ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID menuName:(NSString *)menuName vrCommands:(NSArray *)vrCommands handler:(SDLRPCNotificationHandler)handler __deprecated_msg("use SDLAddCommand's initWithId:vrCommands:menuName:handler: instead");
+
++ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID vrCommands:(NSArray *)vrCommands handler:(SDLRPCNotificationHandler)handler __deprecated_msg("use SDLAddCommand's initWithId:vrCommands:handler: instead");
//*****
//***** AddSubMenu *****
-+ (SDLAddSubMenu *)buildAddSubMenuWithID:(NSNumber *)menuID menuName:(NSString *)menuName position:(NSNumber *)position correlationID:(NSNumber *)correlationID;
++ (SDLAddSubMenu *)buildAddSubMenuWithID:(NSNumber *)menuID menuName:(NSString *)menuName position:(NSNumber *)position correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAddSubMenu's initWithId:menuName:position: instead");
-+ (SDLAddSubMenu *)buildAddSubMenuWithID:(NSNumber *)menuID menuName:(NSString *)menuName correlationID:(NSNumber *)correlationID;
++ (SDLAddSubMenu *)buildAddSubMenuWithID:(NSNumber *)menuID menuName:(NSString *)menuName correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAddSubMenu's initWithId:menuName: instead");
//*****
//***** Alert *****
-+ (SDLAlert *)buildAlertWithTTS:(NSString *)ttsText alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(NSNumber *)playTone duration:(NSNumber *)duration correlationID:(NSNumber *)correlationID;
++ (SDLAlert *)buildAlertWithTTS:(NSString *)ttsText alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(NSNumber *)playTone duration:(NSNumber *)duration correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAlert's initWithTTS:alertText1:alertText2:alertText3:playTone:duration: instead");
-+ (SDLAlert *)buildAlertWithTTS:(NSString *)ttsText alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 playTone:(NSNumber *)playTone duration:(NSNumber *)duration correlationID:(NSNumber *)correlationID;
++ (SDLAlert *)buildAlertWithTTS:(NSString *)ttsText alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 playTone:(NSNumber *)playTone duration:(NSNumber *)duration correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAlert's initWithTTS:alertText1:alertText2:playTone:duration: instead");
-+ (SDLAlert *)buildAlertWithTTS:(NSString *)ttsText playTone:(NSNumber *)playTone correlationID:(NSNumber *)
- correlationID;
++ (SDLAlert *)buildAlertWithTTS:(NSString *)ttsText playTone:(NSNumber *)playTone correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAlert's initWithTTS:playTone:duration: instead");
//***
-+ (SDLAlert *)buildAlertWithTTSChunks:(NSArray *)ttsChunks alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(NSNumber *)playTone duration:(NSNumber *)duration softButtons:(NSArray *)softButtons correlationID:(NSNumber *)correlationID;
++ (SDLAlert *)buildAlertWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(NSNumber *)playTone duration:(NSNumber *)duration softButtons:(NSArray<SDLSoftButton *> *)softButtons correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAlert's initWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons: instead");
-+ (SDLAlert *)buildAlertWithTTSChunks:(NSArray *)ttsChunks playTone:(NSNumber *)playTone correlationID:(NSNumber *)correlationID;
++ (SDLAlert *)buildAlertWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks playTone:(NSNumber *)playTone correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAlert's initWithTTSChunks:playTone: instead");
//***
-+ (SDLAlert *)buildAlertWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 duration:(NSNumber *)duration softButtons:(NSArray *)softButtons correlationID:(NSNumber *)correlationID;
++ (SDLAlert *)buildAlertWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 duration:(NSNumber *)duration softButtons:(NSArray<SDLSoftButton *> *)softButtons correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAlert's initWithAlertText1:alertText2:alertText3:duration:softButtons: instead");
-+ (SDLAlert *)buildAlertWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 duration:(NSNumber *)duration correlationID:(NSNumber *)correlationID;
++ (SDLAlert *)buildAlertWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 duration:(NSNumber *)duration correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAlert's initWithAlertText1:alertText2:alertText3:duration: instead");
-+ (SDLAlert *)buildAlertWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 duration:(NSNumber *)duration correlationID:(NSNumber *)correlationID;
++ (SDLAlert *)buildAlertWithAlertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 duration:(NSNumber *)duration correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAlert's initWithAlertText1:alertText2:duration: instead");
//*****
-+ (SDLAlertManeuver *)buildAlertManeuverwithTTSchunks:(NSMutableArray *)ttsChunks softButtons:(NSMutableArray *)softButtons correlationID:(NSNumber *)correlationID;
++ (SDLAlertManeuver *)buildAlertManeuverwithTTSchunks:(NSMutableArray *)ttsChunks softButtons:(NSMutableArray *)softButtons correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLAlertManeuver's initWithTTSChunks:softButtons: instead");
-+ (SDLChangeRegistration *)buildChangeRegistrationWithLanguage:(SDLLanguage *)language hmiDisplayLanguage:(SDLLanguage *)hmiDisplayLanguage correlationID:(NSNumber *)correlationID;
++ (SDLChangeRegistration *)buildChangeRegistrationWithLanguage:(SDLLanguage *)language hmiDisplayLanguage:(SDLLanguage *)hmiDisplayLanguage correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLChangeRegistration's initWithLanguage:hmiDisplayLanguage: instead");
-+ (SDLCreateInteractionChoiceSet *)buildCreateInteractionChoiceSetWithID:(NSNumber *)interactionChoiceSetID choiceSet:(NSArray *)choices correlationID:(NSNumber *)correlationID;
++ (SDLCreateInteractionChoiceSet *)buildCreateInteractionChoiceSetWithID:(NSNumber *)interactionChoiceSetID choiceSet:(NSArray *)choices correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLCreateInteractionChoiceSet's initWithId:choiceSet: instead");
-+ (SDLDeleteCommand *)buildDeleteCommandWithID:(NSNumber *)cmdID correlationID:(NSNumber *)correlationID;
++ (SDLDeleteCommand *)buildDeleteCommandWithID:(NSNumber *)cmdID correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLDeleteCommand's initWithId: instead");
-+ (SDLDeleteFile *)buildDeleteFileWithName:(NSString *)syncFileName correlationID:(NSNumber *)correlationID;
++ (SDLDeleteFile *)buildDeleteFileWithName:(NSString *)syncFileName correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLDeleteFile's initWithFileName: instead");
-+ (SDLDialNumber *)buildDialNumberWithNumber:(NSString *)phoneNumber;
++ (SDLDialNumber *)buildDialNumberWithNumber:(NSString *)phoneNumber __deprecated_msg("use SDLDialNumber's initWithNumber: instead");
-+ (SDLListFiles *)buildListFilesWithCorrelationID:(NSNumber *)correlationID;
++ (SDLListFiles *)buildListFilesWithCorrelationID:(NSNumber *)correlationID __deprecated_msg("use SDLListFiles's default initializer instead");
-+ (SDLDeleteInteractionChoiceSet *)buildDeleteInteractionChoiceSetWithID:(NSNumber *)interactionChoiceSetID correlationID:(NSNumber *)correlationID;
++ (SDLDeleteInteractionChoiceSet *)buildDeleteInteractionChoiceSetWithID:(NSNumber *)interactionChoiceSetID correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLDeleteInteractionChoiceSet's initWithId: instead");
-+ (SDLDeleteSubMenu *)buildDeleteSubMenuWithID:(NSNumber *)menuID correlationID:(NSNumber *)correlationID;
++ (SDLDeleteSubMenu *)buildDeleteSubMenuWithID:(NSNumber *)menuID correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLDeleteSubMenu's initWithId: instead");
-+ (SDLEndAudioPassThru *)buildEndAudioPassThruWithCorrelationID:(NSNumber *)correlationID;
++ (SDLEndAudioPassThru *)buildEndAudioPassThruWithCorrelationID:(NSNumber *)correlationID __deprecated_msg("use SDLEndAudioPassThru's default initializer instead");
-+ (SDLGetDTCs *)buildGetDTCsWithECUName:(NSNumber *)ecuName correlationID:(NSNumber *)correlationID;
++ (SDLGetDTCs *)buildGetDTCsWithECUName:(NSNumber *)ecuName correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLGetDTCs's initWithECUName: instead");
-+ (SDLGetVehicleData *)buildGetVehicleDataWithGPS:(NSNumber *)gps speed:(NSNumber *)speed rpm:(NSNumber *)rpm fuelLevel:(NSNumber *)fuelLevel fuelLevelState:(NSNumber *)fuelLevelState instantFuelConsumption:(NSNumber *)instantFuelConsumption externalTemperature:(NSNumber *)externalTemperature vin:(NSNumber *)vin prndl:(NSNumber *)prndl tirePressure:(NSNumber *)tirePressure odometer:(NSNumber *)odometer beltStatus:(NSNumber *)beltStatus bodyInformation:(NSNumber *)bodyInformation deviceStatus:(NSNumber *)deviceStatus driverBraking:(NSNumber *)driverBraking wiperStatus:(NSNumber *)wiperStatus headLampStatus:(NSNumber *)headLampStatus engineTorque:(NSNumber *)engineTorque accPedalPosition:(NSNumber *)accPedalPosition steeringWheelAngle:(NSNumber *)steeringWheelAngle correlationID:(NSNumber *)correlationID;
++ (SDLGetVehicleData *)buildGetVehicleDataWithGPS:(NSNumber *)gps speed:(NSNumber *)speed rpm:(NSNumber *)rpm fuelLevel:(NSNumber *)fuelLevel fuelLevelState:(NSNumber *)fuelLevelState instantFuelConsumption:(NSNumber *)instantFuelConsumption externalTemperature:(NSNumber *)externalTemperature vin:(NSNumber *)vin prndl:(NSNumber *)prndl tirePressure:(NSNumber *)tirePressure odometer:(NSNumber *)odometer beltStatus:(NSNumber *)beltStatus bodyInformation:(NSNumber *)bodyInformation deviceStatus:(NSNumber *)deviceStatus driverBraking:(NSNumber *)driverBraking wiperStatus:(NSNumber *)wiperStatus headLampStatus:(NSNumber *)headLampStatus engineTorque:(NSNumber *)engineTorque accPedalPosition:(NSNumber *)accPedalPosition steeringWheelAngle:(NSNumber *)steeringWheelAngle correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLGetVehicleData's initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:vin:wiperStatus: instead");
-+ (SDLPerformAudioPassThru *)buildPerformAudioPassThruWithInitialPrompt:(NSString *)initialPrompt audioPassThruDisplayText1:(NSString *)audioPassThruDisplayText1 audioPassThruDisplayText2:(NSString *)audioPassThruDisplayText2 samplingRate:(SDLSamplingRate *)samplingRate maxDuration:(NSNumber *)maxDuration bitsPerSample:(SDLBitsPerSample *)bitsPerSample audioType:(SDLAudioType *)audioType muteAudio:(NSNumber *)muteAudio correlationID:(NSNumber *)correlationID;
++ (SDLPerformAudioPassThru *)buildPerformAudioPassThruWithInitialPrompt:(NSString *)initialPrompt audioPassThruDisplayText1:(NSString *)audioPassThruDisplayText1 audioPassThruDisplayText2:(NSString *)audioPassThruDisplayText2 samplingRate:(SDLSamplingRate *)samplingRate maxDuration:(NSNumber *)maxDuration bitsPerSample:(SDLBitsPerSample *)bitsPerSample audioType:(SDLAudioType *)audioType muteAudio:(NSNumber *)muteAudio correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLPerformAudioPassThru's initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio: instead");
//***** PerformInteraction *****
-+ (SDLPerformInteraction *)buildPerformInteractionWithInitialChunks:(NSArray *)initialChunks initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray *)interactionChoiceSetIDList helpChunks:(NSArray *)helpChunks timeoutChunks:(NSArray *)timeoutChunks interactionMode:(SDLInteractionMode *)interactionMode timeout:(NSNumber *)timeout vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID;
++ (SDLPerformInteraction *)buildPerformInteractionWithInitialChunks:(NSArray *)initialChunks initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray *)interactionChoiceSetIDList helpChunks:(NSArray *)helpChunks timeoutChunks:(NSArray *)timeoutChunks interactionMode:(SDLInteractionMode *)interactionMode timeout:(NSNumber *)timeout vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLPerformInteraction's initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp: instead");
//***
-+ (SDLPerformInteraction *)buildPerformInteractionWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray *)interactionChoiceSetIDList helpPrompt:(NSString *)helpPrompt timeoutPrompt:(NSString *)timeoutPrompt interactionMode:(SDLInteractionMode *)interactionMode timeout:(NSNumber *)timeout vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID;
++ (SDLPerformInteraction *)buildPerformInteractionWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray *)interactionChoiceSetIDList helpPrompt:(NSString *)helpPrompt timeoutPrompt:(NSString *)timeoutPrompt interactionMode:(SDLInteractionMode *)interactionMode timeout:(NSNumber *)timeout vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLPerformInteraction's initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp: instead");
-+ (SDLPerformInteraction *)buildPerformInteractionWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetID:(NSNumber *)interactionChoiceSetID vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID;
++ (SDLPerformInteraction *)buildPerformInteractionWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetID:(NSNumber *)interactionChoiceSetID vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLPerformInteraction's initWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp: instead");
-+ (SDLPerformInteraction *)buildPerformInteractionWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray *)interactionChoiceSetIDList helpPrompt:(NSString *)helpPrompt timeoutPrompt:(NSString *)timeoutPrompt interactionMode:(SDLInteractionMode *)interactionMode timeout:(NSNumber *)timeout correlationID:(NSNumber *)correlationID;
++ (SDLPerformInteraction *)buildPerformInteractionWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray *)interactionChoiceSetIDList helpPrompt:(NSString *)helpPrompt timeoutPrompt:(NSString *)timeoutPrompt interactionMode:(SDLInteractionMode *)interactionMode timeout:(NSNumber *)timeout correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLPerformInteraction's initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout: instead");
-+ (SDLPerformInteraction *)buildPerformInteractionWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetID:(NSNumber *)interactionChoiceSetID correlationID:(NSNumber *)correlationID;
++ (SDLPerformInteraction *)buildPerformInteractionWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetID:(NSNumber *)interactionChoiceSetID correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLPerformInteraction's initWithInitialPrompt:initialText:interactionChoiceSetID: instead");
//*****
-+ (SDLPutFile *)buildPutFileWithFileName:(NSString *)fileName fileType:(SDLFileType *)fileType persistentFile:(NSNumber *)persistentFile correlationId:(NSNumber *)correlationID;
++ (SDLPutFile *)buildPutFileWithFileName:(NSString *)fileName fileType:(SDLFileType *)fileType persistentFile:(NSNumber *)persistentFile correlationId:(NSNumber *)correlationID __deprecated_msg("use SDLPutFile's initWithFileName:fileType: instead");
+ (SDLPutFile *)buildPutFileWithFileName:(NSString *)syncFileName fileType:(SDLFileType *)fileType persisistentFile:(NSNumber *)persistentFile correlationID:(NSNumber *)correlationID __deprecated_msg("use buildPutFileWithFileName:fileType:persistentFile:correlationID: instead");
-+ (SDLReadDID *)buildReadDIDWithECUName:(NSNumber *)ecuName didLocation:(NSArray *)didLocation correlationID:(NSNumber *)correlationID;
++ (SDLReadDID *)buildReadDIDWithECUName:(NSNumber *)ecuName didLocation:(NSArray *)didLocation correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLReadDID's initWithECUName:didLocation: instead");
//***** RegisterAppInterface *****
-+ (SDLRegisterAppInterface *)buildRegisterAppInterfaceWithAppName:(NSString *)appName ttsName:(NSMutableArray *)ttsName vrSynonyms:(NSMutableArray *)vrSynonyms isMediaApp:(NSNumber *)isMediaApp languageDesired:(SDLLanguage *)languageDesired hmiDisplayLanguageDesired:(SDLLanguage *)hmiDisplayLanguageDesired appID:(NSString *)appID;
++ (SDLRegisterAppInterface *)buildRegisterAppInterfaceWithAppName:(NSString *)appName ttsName:(NSMutableArray *)ttsName vrSynonyms:(NSMutableArray *)vrSynonyms isMediaApp:(NSNumber *)isMediaApp languageDesired:(SDLLanguage *)languageDesired hmiDisplayLanguageDesired:(SDLLanguage *)hmiDisplayLanguageDesired appID:(NSString *)appID __deprecated_msg("use SDLRegisterAppInterface's initWithAppName:appId:languageDesired:isMediaApp:appType:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash: instead");
-+ (SDLRegisterAppInterface *)buildRegisterAppInterfaceWithAppName:(NSString *)appName isMediaApp:(NSNumber *)isMediaApp languageDesired:(SDLLanguage *)languageDesired appID:(NSString *)appID;
++ (SDLRegisterAppInterface *)buildRegisterAppInterfaceWithAppName:(NSString *)appName isMediaApp:(NSNumber *)isMediaApp languageDesired:(SDLLanguage *)languageDesired appID:(NSString *)appID __deprecated_msg("use SDLRegisterAppInterface's initWithAppName:appId:lanaugeDesired:isMediaApp:appType:shortAppName: instead");
-+ (SDLRegisterAppInterface *)buildRegisterAppInterfaceWithAppName:(NSString *)appName languageDesired:(SDLLanguage *)laguageDesired appID:(NSString *)appID;
++ (SDLRegisterAppInterface *)buildRegisterAppInterfaceWithAppName:(NSString *)appName languageDesired:(SDLLanguage *)laguageDesired appID:(NSString *)appID __deprecated_msg("use SDLRegisterAppInterface's initWithAppName:appId:lanaugeDesired: instead");
//*****
-+ (SDLResetGlobalProperties *)buildResetGlobalPropertiesWithProperties:(NSArray *)properties correlationID:(NSNumber *)correlationID;
++ (SDLResetGlobalProperties *)buildResetGlobalPropertiesWithProperties:(NSArray *)properties correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLResetGlobalProperties's initWithProperties: instead");
-+ (SDLSendLocation *)buildSendLocationWithLongitude:(NSNumber *)longitude latitude:(NSNumber *)latitude locationName:(NSString *)locationName locationDescription:(NSString *)locationDescription address:(NSArray *)address phoneNumber:(NSString *)phoneNumber image:(SDLImage *)image;
++ (SDLSendLocation *)buildSendLocationWithLongitude:(NSNumber *)longitude latitude:(NSNumber *)latitude locationName:(NSString *)locationName locationDescription:(NSString *)locationDescription address:(NSArray *)address phoneNumber:(NSString *)phoneNumber image:(SDLImage *)image __deprecated_msg("use SDLSendLocation's initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image: instead");
-+ (SDLScrollableMessage *)buildScrollableMessage:(NSString *)scrollableMessageBody timeout:(NSNumber *)timeout softButtons:(NSArray *)softButtons correlationID:(NSNumber *)correlationID;
++ (SDLScrollableMessage *)buildScrollableMessage:(NSString *)scrollableMessageBody timeout:(NSNumber *)timeout softButtons:(NSArray<SDLSoftButton *> *)softButtons correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLScrollableMessage's initWithMessage:timeout:softButtons: instead");
-+ (SDLSetAppIcon *)buildSetAppIconWithFileName:(NSString *)syncFileName correlationID:(NSNumber *)correlationID;
++ (SDLSetAppIcon *)buildSetAppIconWithFileName:(NSString *)syncFileName correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSetAppIcon's initWithFileName: instead");
-+ (SDLSetDisplayLayout *)buildSetDisplayLayout:(NSString *)displayLayout correlationID:(NSNumber *)correlationID;
++ (SDLSetDisplayLayout *)buildSetDisplayLayout:(NSString *)displayLayout correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSetAppIcon's initWithLayout: instead");
//***** SetGlobalProperties *****
-+ (SDLSetGlobalProperties *)buildSetGlobalPropertiesWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText vrHelpTitle:(NSString *)vrHelpTitle vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID;
++ (SDLSetGlobalProperties *)buildSetGlobalPropertiesWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText vrHelpTitle:(NSString *)vrHelpTitle vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSetGlobalProperties's initWithHelpText:timeoutText:vrHelpTitle:vrHelp: instead");
-+ (SDLSetGlobalProperties *)buildSetGlobalPropertiesWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText correlationID:(NSNumber *)correlationID;
++ (SDLSetGlobalProperties *)buildSetGlobalPropertiesWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSetGlobalProperties's initWithHelpText:timeoutText: instead");
//*****
//***** SetMediaClockTimer *****
-+ (SDLSetMediaClockTimer *)buildSetMediaClockTimerWithHours:(NSNumber *)hours minutes:(NSNumber *)minutes seconds:(NSNumber *)seconds updateMode:(SDLUpdateMode *)updateMode correlationID:(NSNumber *)correlationID;
++ (SDLSetMediaClockTimer *)buildSetMediaClockTimerWithHours:(NSNumber *)hours minutes:(NSNumber *)minutes seconds:(NSNumber *)seconds updateMode:(SDLUpdateMode *)updateMode correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSetMediaClockTimer's initWithHours:minutes:seconds:updateMode: instead");
-+ (SDLSetMediaClockTimer *)buildSetMediaClockTimerWithUpdateMode:(SDLUpdateMode *)updateMode correlationID:(NSNumber *)correlationID;
++ (SDLSetMediaClockTimer *)buildSetMediaClockTimerWithUpdateMode:(SDLUpdateMode *)updateMode correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSetMediaClockTimer's initWithUpdateMode: instead");
//*****
//***** Show *****
-+ (SDLShow *)buildShowWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 mainField3:(NSString *)mainField3 mainField4:(NSString *)mainField4 statusBar:(NSString *)statusBar mediaClock:(NSString *)mediaClock mediaTrack:(NSString *)mediaTrack alignment:(SDLTextAlignment *)textAlignment graphic:(SDLImage *)graphic softButtons:(NSArray *)softButtons customPresets:(NSArray *)customPresets correlationID:(NSNumber *)correlationID;
++ (SDLShow *)buildShowWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 mainField3:(NSString *)mainField3 mainField4:(NSString *)mainField4 statusBar:(NSString *)statusBar mediaClock:(NSString *)mediaClock mediaTrack:(NSString *)mediaTrack alignment:(SDLTextAlignment *)textAlignment graphic:(SDLImage *)graphic softButtons:(NSArray<SDLSoftButton *> *)softButtons customPresets:(NSArray *)customPresets correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLShow's initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets: instead");
-+ (SDLShow *)buildShowWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 statusBar:(NSString *)statusBar mediaClock:(NSString *)mediaClock mediaTrack:(NSString *)mediaTrack alignment:(SDLTextAlignment *)textAlignment correlationID:(NSNumber *)correlationID;
++ (SDLShow *)buildShowWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 statusBar:(NSString *)statusBar mediaClock:(NSString *)mediaClock mediaTrack:(NSString *)mediaTrack alignment:(SDLTextAlignment *)textAlignment correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLShow's initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack: instead");
-+ (SDLShow *)buildShowWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 alignment:(SDLTextAlignment *)alignment correlationID:(NSNumber *)correlationID;
++ (SDLShow *)buildShowWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 alignment:(SDLTextAlignment *)alignment correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLShow's initWithMainField1:mainField2:alignment: instead");
//*****
//***** Slider *****
-+ (SDLSlider *)buildSliderDynamicFooterWithNumTicks:(NSNumber *)numTicks position:(NSNumber *)position sliderHeader:(NSString *)sliderHeader sliderFooter:(NSArray *)sliderFooter timeout:(NSNumber *)timeout correlationID:(NSNumber *)correlationID;
++ (SDLSlider *)buildSliderDynamicFooterWithNumTicks:(NSNumber *)numTicks position:(NSNumber *)position sliderHeader:(NSString *)sliderHeader sliderFooter:(NSArray *)sliderFooter timeout:(NSNumber *)timeout correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSlider's initWithNumTicks:position:sliderHeader:sliderFooter:timeout: instead");
-+ (SDLSlider *)buildSliderStaticFooterWithNumTicks:(NSNumber *)numTicks position:(NSNumber *)position sliderHeader:(NSString *)sliderHeader sliderFooter:(NSString *)sliderFooter timeout:(NSNumber *)timeout correlationID:(NSNumber *)correlationID;
++ (SDLSlider *)buildSliderStaticFooterWithNumTicks:(NSNumber *)numTicks position:(NSNumber *)position sliderHeader:(NSString *)sliderHeader sliderFooter:(NSString *)sliderFooter timeout:(NSNumber *)timeout correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSlider's initWithNumTicks:position:sliderHeader:sliderFooters:timeout: instead");
//*****
++ (SDLSoftButton *)buildSoftButtonWithType:(SDLSoftButtonType *)type text:(NSString *)text image:(SDLImage *)image highlighted:(BOOL)highlighted buttonID:(UInt16)buttonID systemAction:(SDLSystemAction *)systemAction handler:(SDLRPCNotificationHandler)handler __deprecated_msg("use SDLSoftButton's initWithType:text:image:highlighted:buttonId:systemAction:handler: instead");
+
//***** Speak *****
-+ (SDLSpeak *)buildSpeakWithTTSChunks:(NSArray *)ttsChunks correlationID:(NSNumber *)correlationID;
++ (SDLSpeak *)buildSpeakWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSpeak's initWithTTSChunks: instead");
//***
-+ (SDLSpeak *)buildSpeakWithTTS:(NSString *)ttsText correlationID:(NSNumber *)correlationID;
++ (SDLSpeak *)buildSpeakWithTTS:(NSString *)ttsText correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSpeak's initWithTTS: instead");
//*****
-+ (SDLSubscribeButton *)buildSubscribeButtonWithName:(SDLButtonName *)buttonName correlationID:(NSNumber *)correlationID;
++ (SDLSubscribeButton *)buildSubscribeButtonWithName:(SDLButtonName *)buttonName correlationID:(NSNumber *)correlationID __deprecated_msg("use buildSubscribeButtonWithName:handler: with SDLManager instead");
+
++ (SDLSubscribeButton *)buildSubscribeButtonWithName:(SDLButtonName *)buttonName handler:(SDLRPCNotificationHandler)handler __deprecated_msg("use SDLSubscribeButton's initWithButtonName:handler: instead");
-+ (SDLSubscribeVehicleData *)buildSubscribeVehicleDataWithGPS:(NSNumber *)gps speed:(NSNumber *)speed rpm:(NSNumber *)rpm fuelLevel:(NSNumber *)fuelLevel fuelLevelState:(NSNumber *)fuelLevelState instantFuelConsumption:(NSNumber *)instantFuelConsumption externalTemperature:(NSNumber *)externalTemperature prndl:(NSNumber *)prndl tirePressure:(NSNumber *)tirePressure odometer:(NSNumber *)odometer beltStatus:(NSNumber *)beltStatus bodyInformation:(NSNumber *)bodyInformation deviceStatus:(NSNumber *)deviceStatus driverBraking:(NSNumber *)driverBraking wiperStatus:(NSNumber *)wiperStatus headLampStatus:(NSNumber *)headLampStatus engineTorque:(NSNumber *)engineTorque accPedalPosition:(NSNumber *)accPedalPosition steeringWheelAngle:(NSNumber *)steeringWheelAngle correlationID:(NSNumber *)correlationID;
++ (SDLSubscribeVehicleData *)buildSubscribeVehicleDataWithGPS:(NSNumber *)gps speed:(NSNumber *)speed rpm:(NSNumber *)rpm fuelLevel:(NSNumber *)fuelLevel fuelLevelState:(NSNumber *)fuelLevelState instantFuelConsumption:(NSNumber *)instantFuelConsumption externalTemperature:(NSNumber *)externalTemperature prndl:(NSNumber *)prndl tirePressure:(NSNumber *)tirePressure odometer:(NSNumber *)odometer beltStatus:(NSNumber *)beltStatus bodyInformation:(NSNumber *)bodyInformation deviceStatus:(NSNumber *)deviceStatus driverBraking:(NSNumber *)driverBraking wiperStatus:(NSNumber *)wiperStatus headLampStatus:(NSNumber *)headLampStatus engineTorque:(NSNumber *)engineTorque accPedalPosition:(NSNumber *)accPedalPosition steeringWheelAngle:(NSNumber *)steeringWheelAngle correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSubscribeVehicleData's initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus: instead");
-+ (SDLShowConstantTBT *)buildShowConstantTBTWithString:(NSString *)navigationText1 navigationText2:(NSString *)navigationText2 eta:(NSString *)eta timeToDestination:(NSString *)timeToDestination totalDistance:(NSString *)totalDistance turnIcon:(SDLImage *)turnIcon nextTurnIcon:(SDLImage *)nextTurnIcon distanceToManeuver:(NSNumber *)distanceToManeuver distanceToManeuverScale:(NSNumber *)distanceToManeuverScale maneuverComplete:(NSNumber *)maneuverComplete softButtons:(NSMutableArray *)softButtons correlationID:(NSNumber *)correlationID;
++ (SDLShowConstantTBT *)buildShowConstantTBTWithString:(NSString *)navigationText1 navigationText2:(NSString *)navigationText2 eta:(NSString *)eta timeToDestination:(NSString *)timeToDestination totalDistance:(NSString *)totalDistance turnIcon:(SDLImage *)turnIcon nextTurnIcon:(SDLImage *)nextTurnIcon distanceToManeuver:(NSNumber *)distanceToManeuver distanceToManeuverScale:(NSNumber *)distanceToManeuverScale maneuverComplete:(NSNumber *)maneuverComplete softButtons:(NSMutableArray *)softButtons correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLShowConstantTBT's initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons: instead");
-+ (SDLUnregisterAppInterface *)buildUnregisterAppInterfaceWithCorrelationID:(NSNumber *)correlationID;
++ (SDLUnregisterAppInterface *)buildUnregisterAppInterfaceWithCorrelationID:(NSNumber *)correlationID __deprecated_msg("use SDLUnregisterAppInterface's default initializer instead");
-+ (SDLUnsubscribeButton *)buildUnsubscribeButtonWithName:(SDLButtonName *)buttonName correlationID:(NSNumber *)correlationID;
++ (SDLUnsubscribeButton *)buildUnsubscribeButtonWithName:(SDLButtonName *)buttonName correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLUnsubscribeButton's initWithButtonName: instead");
-+ (SDLUnsubscribeVehicleData *)buildUnsubscribeVehicleDataWithGPS:(NSNumber *)gps speed:(NSNumber *)speed rpm:(NSNumber *)rpm fuelLevel:(NSNumber *)fuelLevel fuelLevelState:(NSNumber *)fuelLevelState instantFuelConsumption:(NSNumber *)instantFuelConsumption externalTemperature:(NSNumber *)externalTemperature prndl:(NSNumber *)prndl tirePressure:(NSNumber *)tirePressure odometer:(NSNumber *)odometer beltStatus:(NSNumber *)beltStatus bodyInformation:(NSNumber *)bodyInformation deviceStatus:(NSNumber *)deviceStatus driverBraking:(NSNumber *)driverBraking wiperStatus:(NSNumber *)wiperStatus headLampStatus:(NSNumber *)headLampStatus engineTorque:(NSNumber *)engineTorque accPedalPosition:(NSNumber *)accPedalPosition steeringWheelAngle:(NSNumber *)steeringWheelAngle correlationID:(NSNumber *)correlationID;
++ (SDLUnsubscribeVehicleData *)buildUnsubscribeVehicleDataWithGPS:(NSNumber *)gps speed:(NSNumber *)speed rpm:(NSNumber *)rpm fuelLevel:(NSNumber *)fuelLevel fuelLevelState:(NSNumber *)fuelLevelState instantFuelConsumption:(NSNumber *)instantFuelConsumption externalTemperature:(NSNumber *)externalTemperature prndl:(NSNumber *)prndl tirePressure:(NSNumber *)tirePressure odometer:(NSNumber *)odometer beltStatus:(NSNumber *)beltStatus bodyInformation:(NSNumber *)bodyInformation deviceStatus:(NSNumber *)deviceStatus driverBraking:(NSNumber *)driverBraking wiperStatus:(NSNumber *)wiperStatus headLampStatus:(NSNumber *)headLampStatus engineTorque:(NSNumber *)engineTorque accPedalPosition:(NSNumber *)accPedalPosition steeringWheelAngle:(NSNumber *)steeringWheelAngle correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLSubscribeVehicleData's initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus: instead");
-+ (SDLUpdateTurnList *)buildUpdateTurnListWithTurnList:(NSMutableArray *)turnList softButtons:(NSMutableArray *)softButtons correlationID:(NSNumber *)correlationID;
++ (SDLUpdateTurnList *)buildUpdateTurnListWithTurnList:(NSMutableArray *)turnList softButtons:(NSMutableArray *)softButtons correlationID:(NSNumber *)correlationID __deprecated_msg("use SDLUpdateTurnList initWithTurnList:softButtons: instead");
@end
diff --git a/SmartDeviceLink/SDLRPCRequestFactory.m b/SmartDeviceLink/SDLRPCRequestFactory.m
index a0a96d84e..6f0d1f566 100644
--- a/SmartDeviceLink/SDLRPCRequestFactory.m
+++ b/SmartDeviceLink/SDLRPCRequestFactory.m
@@ -45,6 +45,7 @@
#import "SDLShow.h"
#import "SDLShowConstantTBT.h"
#import "SDLSlider.h"
+#import "SDLSoftButton.h"
#import "SDLSpeak.h"
#import "SDLSpeechCapabilities.h"
#import "SDLStartTime.h"
@@ -65,8 +66,33 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
//***** AddCommand *****
+ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID menuName:(NSString *)menuName parentID:(NSNumber *)parentID position:(NSNumber *)position vrCommands:(NSArray *)vrCommands iconValue:(NSString *)iconValue iconType:(SDLImageType *)iconType correlationID:(NSNumber *)correlationID {
SDLAddCommand *msg = [[SDLAddCommand alloc] init];
+
+ msg.cmdID = cmdID;
+
+ if (menuName != nil || parentID != nil || position != nil) {
+ SDLMenuParams *menuParams = [[SDLMenuParams alloc] init];
+ menuParams.menuName = menuName;
+ menuParams.parentID = parentID;
+ menuParams.position = position;
+ msg.menuParams = menuParams;
+ }
+ msg.vrCommands = [vrCommands mutableCopy];
+
+ if (iconValue != nil || iconType != nil) {
+ SDLImage *icon = [[SDLImage alloc] init];
+ icon.value = iconValue;
+ icon.imageType = iconType;
+ msg.cmdIcon = icon;
+ }
+
msg.correlationID = correlationID;
+ return msg;
+}
+
++ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID menuName:(NSString *)menuName parentID:(NSNumber *)parentID position:(NSNumber *)position vrCommands:(NSArray *)vrCommands iconValue:(NSString *)iconValue iconType:(SDLImageType *)iconType handler:(SDLRPCNotificationHandler)handler {
+ SDLAddCommand *msg = [[SDLAddCommand alloc] initWithHandler:handler];
+
msg.cmdID = cmdID;
if (menuName != nil || parentID != nil || position != nil) {
@@ -92,9 +118,17 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
return [SDLRPCRequestFactory buildAddCommandWithID:cmdID menuName:menuName parentID:nil position:nil vrCommands:vrCommands iconValue:nil iconType:nil correlationID:correlationID];
}
++ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID menuName:(NSString *)menuName vrCommands:(NSArray *)vrCommands handler:(SDLRPCNotificationHandler)handler {
+ return [SDLRPCRequestFactory buildAddCommandWithID:cmdID menuName:menuName parentID:nil position:nil vrCommands:vrCommands iconValue:nil iconType:nil handler:handler];
+}
+
+ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID vrCommands:(NSArray *)vrCommands correlationID:(NSNumber *)correlationID {
return [SDLRPCRequestFactory buildAddCommandWithID:cmdID menuName:nil vrCommands:vrCommands correlationID:correlationID];
}
+
++ (SDLAddCommand *)buildAddCommandWithID:(NSNumber *)cmdID vrCommands:(NSArray *)vrCommands handler:(SDLRPCNotificationHandler)handler {
+ return [SDLRPCRequestFactory buildAddCommandWithID:cmdID menuName:nil vrCommands:vrCommands handler:handler];
+}
//*****
@@ -133,7 +167,7 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
}
//***
-+ (SDLAlert *)buildAlertWithTTSChunks:(NSArray *)ttsChunks alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(NSNumber *)playTone duration:(NSNumber *)duration softButtons:(NSArray *)softButtons correlationID:(NSNumber *)correlationID {
++ (SDLAlert *)buildAlertWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks alertText1:(NSString *)alertText1 alertText2:(NSString *)alertText2 alertText3:(NSString *)alertText3 playTone:(NSNumber *)playTone duration:(NSNumber *)duration softButtons:(NSArray<SDLSoftButton *> *)softButtons correlationID:(NSNumber *)correlationID {
SDLAlert *msg = [[SDLAlert alloc] init];
msg.correlationID = correlationID;
msg.alertText1 = alertText1;
@@ -146,7 +180,7 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
return msg;
}
-+ (SDLAlert *)buildAlertWithTTSChunks:(NSArray *)ttsChunks playTone:(NSNumber *)playTone correlationID:(NSNumber *)correlationID {
++ (SDLAlert *)buildAlertWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks playTone:(NSNumber *)playTone correlationID:(NSNumber *)correlationID {
return [SDLRPCRequestFactory buildAlertWithTTSChunks:ttsChunks alertText1:nil alertText2:nil alertText3:nil playTone:playTone duration:nil softButtons:nil correlationID:correlationID];
}
@@ -280,7 +314,7 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
}
+ (SDLPerformAudioPassThru *)buildPerformAudioPassThruWithInitialPrompt:(NSString *)initialPrompt audioPassThruDisplayText1:(NSString *)audioPassThruDisplayText1 audioPassThruDisplayText2:(NSString *)audioPassThruDisplayText2 samplingRate:(SDLSamplingRate *)samplingRate maxDuration:(NSNumber *)maxDuration bitsPerSample:(SDLBitsPerSample *)bitsPerSample audioType:(SDLAudioType *)audioType muteAudio:(NSNumber *)muteAudio correlationID:(NSNumber *)correlationID {
- NSArray *initialChunks = [SDLTTSChunkFactory buildTTSChunksFromSimple:initialPrompt];
+ NSArray *initialChunks = [SDLTTSChunk textChunksFromString:initialPrompt];
SDLPerformAudioPassThru *msg = [[SDLPerformAudioPassThru alloc] init];
msg.initialPrompt = [initialChunks mutableCopy];
@@ -315,16 +349,16 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
//***
+ (SDLPerformInteraction *)buildPerformInteractionWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetIDList:(NSArray *)interactionChoiceSetIDList helpPrompt:(NSString *)helpPrompt timeoutPrompt:(NSString *)timeoutPrompt interactionMode:(SDLInteractionMode *)interactionMode timeout:(NSNumber *)timeout vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID {
- NSArray *initialChunks = [SDLTTSChunkFactory buildTTSChunksFromSimple:initialPrompt];
- NSArray *helpChunks = [SDLTTSChunkFactory buildTTSChunksFromSimple:helpPrompt];
- NSArray *timeoutChunks = [SDLTTSChunkFactory buildTTSChunksFromSimple:timeoutPrompt];
+ NSArray *initialChunks = [SDLTTSChunk textChunksFromString:initialPrompt];
+ NSArray *helpChunks = [SDLTTSChunk textChunksFromString:helpPrompt];
+ NSArray *timeoutChunks = [SDLTTSChunk textChunksFromString:timeoutPrompt];
return [SDLRPCRequestFactory buildPerformInteractionWithInitialChunks:initialChunks initialText:initialText interactionChoiceSetIDList:interactionChoiceSetIDList helpChunks:helpChunks timeoutChunks:timeoutChunks interactionMode:interactionMode timeout:timeout vrHelp:vrHelp correlationID:correlationID];
}
+ (SDLPerformInteraction *)buildPerformInteractionWithInitialPrompt:(NSString *)initialPrompt initialText:(NSString *)initialText interactionChoiceSetID:(NSNumber *)interactionChoiceSetID vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID {
NSArray *interactionChoiceSetIDList = [NSArray arrayWithObject:interactionChoiceSetID];
- NSArray *initialChunks = [SDLTTSChunkFactory buildTTSChunksFromSimple:initialPrompt];
+ NSArray *initialChunks = [SDLTTSChunk textChunksFromString:initialPrompt];
return [SDLRPCRequestFactory buildPerformInteractionWithInitialChunks:initialChunks initialText:initialText interactionChoiceSetIDList:interactionChoiceSetIDList helpChunks:nil timeoutChunks:nil interactionMode:SDLInteractionMode.BOTH timeout:nil vrHelp:vrHelp correlationID:correlationID];
}
@@ -426,7 +460,7 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
return msg;
}
-+ (SDLScrollableMessage *)buildScrollableMessage:(NSString *)scrollableMessageBody timeout:(NSNumber *)timeout softButtons:(NSArray *)softButtons correlationID:(NSNumber *)correlationID {
++ (SDLScrollableMessage *)buildScrollableMessage:(NSString *)scrollableMessageBody timeout:(NSNumber *)timeout softButtons:(NSArray<SDLSoftButton *> *)softButtons correlationID:(NSNumber *)correlationID {
SDLScrollableMessage *msg = [[SDLScrollableMessage alloc] init];
msg.scrollableMessageBody = scrollableMessageBody;
msg.timeout = timeout;
@@ -469,8 +503,8 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
//***** SetGlobalProperties *****
+ (SDLSetGlobalProperties *)buildSetGlobalPropertiesWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText vrHelpTitle:(NSString *)vrHelpTitle vrHelp:(NSArray *)vrHelp correlationID:(NSNumber *)correlationID {
SDLSetGlobalProperties *msg = [[SDLSetGlobalProperties alloc] init];
- msg.helpPrompt = [SDLTTSChunkFactory buildTTSChunksFromSimple:helpText];
- msg.timeoutPrompt = [SDLTTSChunkFactory buildTTSChunksFromSimple:timeoutText];
+ msg.helpPrompt = [SDLTTSChunk textChunksFromString:helpText];
+ msg.timeoutPrompt = [SDLTTSChunk textChunksFromString:timeoutText];
msg.vrHelpTitle = vrHelpTitle;
msg.vrHelp = [vrHelp mutableCopy];
msg.correlationID = correlationID;
@@ -480,8 +514,8 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
+ (SDLSetGlobalProperties *)buildSetGlobalPropertiesWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText correlationID:(NSNumber *)correlationID {
SDLSetGlobalProperties *msg = [[SDLSetGlobalProperties alloc] init];
- msg.helpPrompt = [SDLTTSChunkFactory buildTTSChunksFromSimple:helpText];
- msg.timeoutPrompt = [SDLTTSChunkFactory buildTTSChunksFromSimple:timeoutText];
+ msg.helpPrompt = [SDLTTSChunk textChunksFromString:helpText];
+ msg.timeoutPrompt = [SDLTTSChunk textChunksFromString:timeoutText];
msg.correlationID = correlationID;
return msg;
@@ -514,7 +548,7 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
//***** Show *****
-+ (SDLShow *)buildShowWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 mainField3:(NSString *)mainField3 mainField4:(NSString *)mainField4 statusBar:(NSString *)statusBar mediaClock:(NSString *)mediaClock mediaTrack:(NSString *)mediaTrack alignment:(SDLTextAlignment *)textAlignment graphic:(SDLImage *)graphic softButtons:(NSArray *)softButtons customPresets:(NSArray *)customPresets correlationID:(NSNumber *)correlationID {
++ (SDLShow *)buildShowWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 mainField3:(NSString *)mainField3 mainField4:(NSString *)mainField4 statusBar:(NSString *)statusBar mediaClock:(NSString *)mediaClock mediaTrack:(NSString *)mediaTrack alignment:(SDLTextAlignment *)textAlignment graphic:(SDLImage *)graphic softButtons:(NSArray<SDLSoftButton *> *)softButtons customPresets:(NSArray *)customPresets correlationID:(NSNumber *)correlationID {
SDLShow *msg = [[SDLShow alloc] init];
msg.correlationID = correlationID;
msg.mainField1 = mainField1;
@@ -594,9 +628,21 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
}
//*****
++ (SDLSoftButton *)buildSoftButtonWithType:(SDLSoftButtonType *)type text:(NSString *)text image:(SDLImage *)image highlighted:(BOOL)highlighted buttonID:(UInt16)buttonID systemAction:(SDLSystemAction *)systemAction handler:(SDLRPCNotificationHandler)handler {
+ SDLSoftButton *button = [[SDLSoftButton alloc] initWithHandler:handler];
+ button.type = type;
+ button.text = text;
+ button.image = image;
+ button.isHighlighted = @(highlighted);
+ button.softButtonID = @(buttonID);
+ button.systemAction = systemAction;
+
+ return button;
+}
+
//***** Speak *****
-+ (SDLSpeak *)buildSpeakWithTTSChunks:(NSArray *)ttsChunks correlationID:(NSNumber *)correlationID {
++ (SDLSpeak *)buildSpeakWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks correlationID:(NSNumber *)correlationID {
SDLSpeak *msg = [[SDLSpeak alloc] init];
msg.correlationID = correlationID;
msg.ttsChunks = [ttsChunks mutableCopy];
@@ -615,10 +661,16 @@ static NSString *const SDLBundleShortVersionStringKey = @"CFBundleShortVersionSt
}
//*****
-
+ (SDLSubscribeButton *)buildSubscribeButtonWithName:(SDLButtonName *)buttonName correlationID:(NSNumber *)correlationID {
SDLSubscribeButton *msg = [[SDLSubscribeButton alloc] init];
+ msg.buttonName = buttonName;
msg.correlationID = correlationID;
+
+ return msg;
+}
+
++ (SDLSubscribeButton *)buildSubscribeButtonWithName:(SDLButtonName *)buttonName handler:(SDLRPCNotificationHandler)handler {
+ SDLSubscribeButton *msg = [[SDLSubscribeButton alloc] initWithHandler:handler];
msg.buttonName = buttonName;
return msg;
diff --git a/SmartDeviceLink/SDLRPCResponseNotification.h b/SmartDeviceLink/SDLRPCResponseNotification.h
new file mode 100644
index 000000000..118d1f532
--- /dev/null
+++ b/SmartDeviceLink/SDLRPCResponseNotification.h
@@ -0,0 +1,24 @@
+//
+// SDLRPCResponseNotification.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 8/25/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SDLRPCResponse;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLRPCResponseNotification : NSNotification
+
+@property (copy, nonatomic, readonly) __kindof SDLRPCResponse *response;
+
+- (instancetype)initWithName:(NSString *)name object:(nullable id)object rpcResponse:(__kindof SDLRPCResponse *)response;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLRPCResponseNotification.m b/SmartDeviceLink/SDLRPCResponseNotification.m
new file mode 100644
index 000000000..6d4be548a
--- /dev/null
+++ b/SmartDeviceLink/SDLRPCResponseNotification.m
@@ -0,0 +1,33 @@
+//
+// SDLRPCResponseNotification.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 8/25/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLRPCResponseNotification.h"
+
+#import "SDLNotificationConstants.h"
+#import "SDLRPCResponse.h"
+
+
+@implementation SDLRPCResponseNotification
+
+@synthesize name = _name;
+@synthesize object = _object;
+@synthesize userInfo = _userInfo;
+
+- (instancetype)initWithName:(NSString *)name object:(nullable id)object rpcResponse:(SDLRPCResponse *)response {
+ _name = name;
+ _object = object;
+ _userInfo = @{SDLNotificationUserInfoObject: response};
+
+ return self;
+}
+
+- (__kindof SDLRPCResponse *)response {
+ return _userInfo[SDLNotificationUserInfoObject];
+}
+
+@end
diff --git a/SmartDeviceLink/SDLRPCStruct.h b/SmartDeviceLink/SDLRPCStruct.h
index e6b3bcccb..e0d0aacf4 100644
--- a/SmartDeviceLink/SDLRPCStruct.h
+++ b/SmartDeviceLink/SDLRPCStruct.h
@@ -4,6 +4,8 @@
#import <Foundation/Foundation.h>
+#import "NSNumber+NumberType.h"
+
@interface SDLRPCStruct : NSObject {
NSMutableDictionary *store;
}
diff --git a/SmartDeviceLink/SDLRPCStruct.m b/SmartDeviceLink/SDLRPCStruct.m
index dd96fff5d..cd0f4d481 100644
--- a/SmartDeviceLink/SDLRPCStruct.m
+++ b/SmartDeviceLink/SDLRPCStruct.m
@@ -7,7 +7,6 @@
#import "SDLEnum.h"
#import "SDLNames.h"
-
@implementation SDLRPCStruct
- (id)initWithDictionary:(NSMutableDictionary *)dict {
diff --git a/SmartDeviceLink/SDLReadDID.h b/SmartDeviceLink/SDLReadDID.h
index 76df4a592..c1026ad05 100644
--- a/SmartDeviceLink/SDLReadDID.h
+++ b/SmartDeviceLink/SDLReadDID.h
@@ -30,6 +30,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithECUName:(UInt16)ecuNumber didLocation:(NSArray<NSNumber<SDLInt> *> *)didLocation;
+
/**
* @abstract An ID of the vehicle module
* <br/><b>Notes: </b>Minvalue:0; Maxvalue:65535
diff --git a/SmartDeviceLink/SDLReadDID.m b/SmartDeviceLink/SDLReadDID.m
index 198d992e0..082d717a3 100644
--- a/SmartDeviceLink/SDLReadDID.m
+++ b/SmartDeviceLink/SDLReadDID.m
@@ -20,6 +20,18 @@
return self;
}
+- (instancetype)initWithECUName:(UInt16)ecuName didLocation:(NSArray *)didLocation {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.ecuName = @(ecuName);
+ self.didLocation = [didLocation mutableCopy];
+
+ return self;
+}
+
- (void)setEcuName:(NSNumber *)ecuName {
if (ecuName != nil) {
[parameters setObject:ecuName forKey:NAMES_ecuName];
diff --git a/SmartDeviceLink/SDLRegisterAppInterface.h b/SmartDeviceLink/SDLRegisterAppInterface.h
index 642edd3e3..694554747 100644
--- a/SmartDeviceLink/SDLRegisterAppInterface.h
+++ b/SmartDeviceLink/SDLRegisterAppInterface.h
@@ -3,10 +3,13 @@
#import "SDLRPCRequest.h"
+@class SDLAppInfo;
+@class SDLAppHMIType;
@class SDLDeviceInfo;
@class SDLLanguage;
+@class SDLLifecycleConfiguration;
@class SDLSyncMsgVersion;
-@class SDLAppInfo;
+@class SDLTTSChunk;
/**
* Registers the application's interface with SDL&reg;, declaring properties of
@@ -94,6 +97,14 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithLifecycleConfiguration:(SDLLifecycleConfiguration *)lifecycleConfiguration;
+
+- (instancetype)initWithAppName:(NSString *)appName appId:(NSString *)appId languageDesired:(SDLLanguage *)languageDesired;
+
+- (instancetype)initWithAppName:(NSString *)appName appId:(NSString *)appId languageDesired:(SDLLanguage *)languageDesired isMediaApp:(BOOL)isMediaApp appType:(SDLAppHMIType *)appType shortAppName:(NSString *)shortAppName;
+
+- (instancetype)initWithAppName:(NSString *)appName appId:(NSString *)appId languageDesired:(SDLLanguage *)languageDesired isMediaApp:(BOOL)isMediaApp appType:(SDLAppHMIType *)appType shortAppName:(NSString *)shortAppName ttsName:(NSArray<SDLTTSChunk *> *)ttsName vrSynonyms:(NSArray<NSString *> *)vrSynonyms hmiDisplayLanguageDesired:(SDLLanguage *)hmiDisplayLanguageDesired resumeHash:(NSString *)resumeHash;
+
/**
* @abstract The version of the SDL interface
*
diff --git a/SmartDeviceLink/SDLRegisterAppInterface.m b/SmartDeviceLink/SDLRegisterAppInterface.m
index 36fac6627..97657563e 100644
--- a/SmartDeviceLink/SDLRegisterAppInterface.m
+++ b/SmartDeviceLink/SDLRegisterAppInterface.m
@@ -8,6 +8,7 @@
#import "SDLAppInfo.h"
#import "SDLDeviceInfo.h"
#import "SDLLanguage.h"
+#import "SDLLifecycleConfiguration.h"
#import "SDLNames.h"
#import "SDLSyncMsgVersion.h"
#import "SDLTTSChunk.h"
@@ -27,6 +28,46 @@
return self;
}
+- (instancetype)initWithLifecycleConfiguration:(SDLLifecycleConfiguration *)lifecycleConfiguration {
+ return [self initWithAppName:lifecycleConfiguration.appName appId:lifecycleConfiguration.appId languageDesired:lifecycleConfiguration.language isMediaApp:lifecycleConfiguration.isMedia appType:lifecycleConfiguration.appType shortAppName:lifecycleConfiguration.shortAppName ttsName:lifecycleConfiguration.ttsName vrSynonyms:lifecycleConfiguration.voiceRecognitionCommandNames hmiDisplayLanguageDesired:lifecycleConfiguration.language resumeHash:lifecycleConfiguration.resumeHash];
+}
+
+- (instancetype)initWithAppName:(NSString *)appName appId:(NSString *)appId languageDesired:(SDLLanguage *)languageDesired {
+ return [self initWithAppName:appName appId:appId languageDesired:languageDesired isMediaApp:NO appType:nil shortAppName:nil];
+}
+
+- (instancetype)initWithAppName:(NSString *)appName appId:(NSString *)appId languageDesired:(SDLLanguage *)languageDesired isMediaApp:(BOOL)isMediaApp appType:(SDLAppHMIType *)appType shortAppName:(NSString *)shortAppName {
+ return [self initWithAppName:appName appId:appId languageDesired:languageDesired isMediaApp:isMediaApp appType:appType shortAppName:shortAppName ttsName:nil vrSynonyms:nil hmiDisplayLanguageDesired:languageDesired resumeHash:nil];
+}
+
+- (instancetype)initWithAppName:(NSString *)appName appId:(NSString *)appId languageDesired:(SDLLanguage *)languageDesired isMediaApp:(BOOL)isMediaApp appType:(SDLAppHMIType *)appType shortAppName:(NSString *)shortAppName ttsName:(NSArray<SDLTTSChunk *> *)ttsName vrSynonyms:(NSArray<NSString *> *)vrSynonyms hmiDisplayLanguageDesired:(SDLLanguage *)hmiDisplayLanguageDesired resumeHash:(NSString *)resumeHash {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.appID = appId;
+ self.appName = appName;
+ self.ngnMediaScreenAppName = shortAppName;
+
+ if (appType != nil) {
+ self.appHMIType = [NSMutableArray arrayWithObject:appType];
+ }
+
+ self.languageDesired = languageDesired;
+ self.hmiDisplayLanguageDesired = hmiDisplayLanguageDesired;
+ self.isMediaApplication = @(isMediaApp);
+ self.ttsName = [ttsName copy];
+ self.vrSynonyms = [vrSynonyms copy];
+ self.syncMsgVersion = [[SDLSyncMsgVersion alloc] initWithMajorVersion:1 minorVersion:0];
+ self.appInfo = [SDLAppInfo currentAppInfo];
+ self.deviceInfo = [SDLDeviceInfo currentDevice];
+ self.hashID = resumeHash;
+ self.correlationID = @1;
+
+ return self;
+}
+
- (void)setSyncMsgVersion:(SDLSyncMsgVersion *)syncMsgVersion {
if (syncMsgVersion != nil) {
[parameters setObject:syncMsgVersion forKey:NAMES_syncMsgVersion];
diff --git a/SmartDeviceLink/SDLRequestHandler.h b/SmartDeviceLink/SDLRequestHandler.h
new file mode 100644
index 000000000..d05cdfd38
--- /dev/null
+++ b/SmartDeviceLink/SDLRequestHandler.h
@@ -0,0 +1,33 @@
+//
+// SDLRequestHandler.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/6/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLNotificationConstants.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol SDLRequestHandler <NSObject>
+
+/**
+ * The handler that is added to any RPC implementing this protocol.
+ */
+@property (copy, nonatomic) SDLRPCNotificationHandler handler;
+
+/**
+ * A special init function on any RPC implementing this protocol.
+ *
+ * @param handler The handler to be called at specified times, such as events for buttons.
+ *
+ * @return An instance of the class implementing this protocol.
+ */
+- (instancetype)initWithHandler:(SDLRPCNotificationHandler)handler;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLResetGlobalProperties.h b/SmartDeviceLink/SDLResetGlobalProperties.h
index f30b59a41..b0080c422 100644
--- a/SmartDeviceLink/SDLResetGlobalProperties.h
+++ b/SmartDeviceLink/SDLResetGlobalProperties.h
@@ -4,6 +4,8 @@
#import "SDLRPCRequest.h"
+@class SDLGlobalProperty;
+
/**
* Resets the passed global properties to their default values as defined by
* SDL
@@ -34,6 +36,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithProperties:(NSArray<SDLGlobalProperty *> *)properties;
+
/**
* @abstract An array of one or more GlobalProperty enumeration elements
* indicating which global properties to reset to their default value
diff --git a/SmartDeviceLink/SDLResetGlobalProperties.m b/SmartDeviceLink/SDLResetGlobalProperties.m
index 350f96de0..737de4b3a 100644
--- a/SmartDeviceLink/SDLResetGlobalProperties.m
+++ b/SmartDeviceLink/SDLResetGlobalProperties.m
@@ -21,6 +21,17 @@
return self;
}
+- (instancetype)initWithProperties:(NSArray *)properties {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.properties = [properties mutableCopy];
+
+ return self;
+}
+
- (void)setProperties:(NSMutableArray *)properties {
if (properties != nil) {
[parameters setObject:properties forKey:NAMES_properties];
diff --git a/SmartDeviceLink/SDLResponseDispatcher.h b/SmartDeviceLink/SDLResponseDispatcher.h
new file mode 100644
index 000000000..f89c5cc59
--- /dev/null
+++ b/SmartDeviceLink/SDLResponseDispatcher.h
@@ -0,0 +1,77 @@
+//
+// SDLResponseDispatcher.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/8/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "NSMapTable+Subscripting.h"
+#import "SDLNotificationConstants.h"
+
+
+typedef NSNumber SDLRPCCorrelationId;
+typedef NSNumber SDLAddCommandCommandId;
+typedef NSString SDLSubscribeButtonName;
+typedef NSNumber SDLSoftButtonId;
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * The SDLResponseDispatcher tracks RPC requests and watches for corresponding responses. When one is seen, it fires a completion handler if one was set. It also stores extra completion handlers for specific types of RPCs such as buttons, and fires those handlers if event notifications for those buttons were sent.
+ */
+@interface SDLResponseDispatcher : NSObject
+
+/**
+ * Holds a map of RPC request correlation ids and corresponding blocks.
+ */
+@property (strong, nonatomic, readonly) NSMapTable<SDLRPCCorrelationId *, SDLResponseHandler> *rpcResponseHandlerMap;
+
+/**
+ * Holds a dictionary of RPC request correlation ids and their corresponding RPC request.
+ */
+@property (strong, nonatomic, readonly) NSMutableDictionary<SDLRPCCorrelationId *, SDLRPCRequest *> *rpcRequestDictionary;
+
+/**
+ * Holds a map of command ids and their corresponding blocks.
+ */
+@property (strong, nonatomic, readonly) NSMapTable<SDLAddCommandCommandId *, SDLRPCNotificationHandler> *commandHandlerMap;
+
+/**
+ * Holds a map of button names and their corresponding blocks.
+ */
+@property (strong, nonatomic, readonly) NSMapTable<SDLSubscribeButtonName *, SDLRPCNotificationHandler> *buttonHandlerMap;
+
+/**
+ * Holds a map of soft button ids and their corresponding blocks.
+ */
+@property (strong, nonatomic, readonly) NSMapTable<SDLSoftButtonId *, SDLRPCNotificationHandler> *customButtonHandlerMap;
+
+/**
+ * Create a new response dispatcher.
+ *
+ * @param dispatcher A notification dispatcher to watch only its notifications.
+ *
+ * @return An instance of `SDLResponseDispatcher`.
+ */
+- (instancetype)initWithNotificationDispatcher:(nullable id)dispatcher NS_DESIGNATED_INITIALIZER;
+
+/**
+ * Store an RPC request to later call that handler. This will also store the command or button handlers on the RPC request if they exist.
+ *
+ * @param request The RPC request to track.
+ * @param handler The handler to invoke when a corresponding response returns.
+ */
+- (void)storeRequest:(SDLRPCRequest *)request handler:(nullable SDLResponseHandler)handler;
+
+/**
+ * Clear all maps and dictionaries of objects.
+ */
+- (void)clear;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLResponseDispatcher.m b/SmartDeviceLink/SDLResponseDispatcher.m
new file mode 100644
index 000000000..b4ac0b7cb
--- /dev/null
+++ b/SmartDeviceLink/SDLResponseDispatcher.m
@@ -0,0 +1,216 @@
+//
+// SDLResponseDispatcher.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/8/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLResponseDispatcher.h"
+
+#import "NSMutableDictionary+SafeRemove.h"
+#import "SDLAddCommand.h"
+#import "SDLAlert.h"
+#import "SDLButtonName.h"
+#import "SDLDeleteCommand.h"
+#import "SDLDeleteCommandResponse.h"
+#import "SDLError.h"
+#import "SDLOnButtonEvent.h"
+#import "SDLOnButtonPress.h"
+#import "SDLOnCommand.h"
+#import "SDLRPCResponse.h"
+#import "SDLResult.h"
+#import "SDLScrollableMessage.h"
+#import "SDLShow.h"
+#import "SDLSoftButton.h"
+#import "SDLSubscribeButton.h"
+#import "SDLUnsubscribeButton.h"
+#import "SDLUnsubscribeButtonResponse.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLResponseDispatcher
+
+- (instancetype)init {
+ return [self initWithNotificationDispatcher:nil];
+}
+
+- (instancetype)initWithNotificationDispatcher:(nullable id)dispatcher {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _rpcResponseHandlerMap = [NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn valueOptions:NSMapTableCopyIn];
+ _rpcRequestDictionary = [NSMutableDictionary dictionary];
+ _commandHandlerMap = [NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn valueOptions:NSMapTableCopyIn];
+ _buttonHandlerMap = [NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn valueOptions:NSMapTableCopyIn];
+ _customButtonHandlerMap = [NSMapTable mapTableWithKeyOptions:NSMapTableCopyIn valueOptions:NSMapTableCopyIn];
+
+ // Responses
+ for (SDLNotificationName responseName in [SDLNotificationConstants allResponseNames]) {
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_runHandlersForResponse:) name:responseName object:dispatcher];
+ }
+
+ // Buttons
+ for (SDLNotificationName buttonNotificationName in [SDLNotificationConstants allButtonEventNotifications]) {
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_runHandlerForButton:) name:buttonNotificationName object:dispatcher];
+ }
+
+ // Commands
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_runHandlerForCommand:) name:SDLDidReceiveCommandNotification object:dispatcher];
+
+ return self;
+}
+
+
+#pragma mark - Storage
+
+- (void)storeRequest:(SDLRPCRequest *)request handler:(nullable SDLResponseHandler)handler {
+ NSNumber *correlationId = request.correlationID;
+
+ // Check for RPCs that require an extra handler
+ if ([request isKindOfClass:[SDLAddCommand class]]) {
+ SDLAddCommand *addCommand = (SDLAddCommand *)request;
+ if (!addCommand.cmdID) {
+ @throw [NSException sdl_missingIdException];
+ }
+ if (addCommand.handler) {
+ self.commandHandlerMap[addCommand.cmdID] = addCommand.handler;
+ }
+ } else if ([request isKindOfClass:[SDLSubscribeButton class]]) {
+ // Convert SDLButtonName to NSString, since it doesn't conform to <NSCopying>
+ SDLSubscribeButton *subscribeButton = (SDLSubscribeButton *)request;
+ NSString *buttonName = subscribeButton.buttonName.value;
+ if (!buttonName) {
+ @throw [NSException sdl_missingIdException];
+ }
+ if (subscribeButton.handler) {
+ self.buttonHandlerMap[buttonName] = subscribeButton.handler;
+ }
+ } else if ([request isKindOfClass:[SDLAlert class]]) {
+ SDLAlert *alert = (SDLAlert *)request;
+ [self sdl_addToCustomButtonHandlerMap:alert.softButtons];
+ } else if ([request isKindOfClass:[SDLScrollableMessage class]]) {
+ SDLScrollableMessage *scrollableMessage = (SDLScrollableMessage *)request;
+ [self sdl_addToCustomButtonHandlerMap:scrollableMessage.softButtons];
+ } else if ([request isKindOfClass:[SDLShow class]]) {
+ SDLShow *show = (SDLShow *)request;
+ [self sdl_addToCustomButtonHandlerMap:show.softButtons];
+ }
+
+ // Always store the request, it's needed in some cases whether or not there was a handler (e.g. DeleteCommand).
+ self.rpcRequestDictionary[correlationId] = request;
+ if (handler) {
+ self.rpcResponseHandlerMap[correlationId] = handler;
+ }
+}
+
+- (void)clear {
+ [self.rpcRequestDictionary removeAllObjects];
+ [self.rpcResponseHandlerMap removeAllObjects];
+ [self.commandHandlerMap removeAllObjects];
+ [self.buttonHandlerMap removeAllObjects];
+ [self.customButtonHandlerMap removeAllObjects];
+}
+
+- (void)sdl_addToCustomButtonHandlerMap:(NSMutableArray<SDLSoftButton *> *)softButtons {
+ for (SDLSoftButton *sb in softButtons) {
+ if (!sb.softButtonID) {
+ @throw [NSException sdl_missingIdException];
+ }
+ if (sb.handler) {
+ self.customButtonHandlerMap[sb.softButtonID] = sb.handler;
+ }
+ }
+}
+
+
+#pragma mark - Notification Handler
+
+// Called by notifications
+- (void)sdl_runHandlersForResponse:(NSNotification *)notification {
+ NSAssert([notification.userInfo[SDLNotificationUserInfoObject] isKindOfClass:[SDLRPCResponse class]], @"A notification was sent with an unanticipated object");
+ if (![notification.userInfo[SDLNotificationUserInfoObject] isKindOfClass:[SDLRPCResponse class]]) {
+ return;
+ }
+
+ __kindof SDLRPCResponse *response = notification.userInfo[SDLNotificationUserInfoObject];
+
+ NSError *error = nil;
+ if (![response.success boolValue]) {
+ error = [NSError sdl_lifecycle_rpcErrorWithDescription:response.resultCode.value andReason:response.info];
+ }
+
+ // Find the appropriate request completion handler, remove the request and response handler
+ SDLResponseHandler handler = self.rpcResponseHandlerMap[response.correlationID];
+ SDLRPCRequest *request = self.rpcRequestDictionary[response.correlationID];
+ [self.rpcRequestDictionary safeRemoveObjectForKey:response.correlationID];
+ [self.rpcResponseHandlerMap safeRemoveObjectForKey:response.correlationID];
+
+ // Run the response handler
+ if (handler) {
+ handler(request, response, error);
+ }
+
+ // If we errored on the response, the delete / unsubscribe was unsuccessful
+ if (error) {
+ return;
+ }
+
+ // If it's a DeleteCommand or UnsubscribeButton, we need to remove handlers for the corresponding commands / buttons
+ if ([response isKindOfClass:[SDLDeleteCommandResponse class]]) {
+ SDLDeleteCommand *deleteCommandRequest = (SDLDeleteCommand *)request;
+ NSNumber *deleteCommandId = deleteCommandRequest.cmdID;
+ [self.commandHandlerMap safeRemoveObjectForKey:deleteCommandId];
+ } else if ([response isKindOfClass:[SDLUnsubscribeButtonResponse class]]) {
+ SDLUnsubscribeButton *unsubscribeButtonRequest = (SDLUnsubscribeButton *)request;
+ NSString *unsubscribeButtonName = unsubscribeButtonRequest.buttonName.value;
+ [self.buttonHandlerMap safeRemoveObjectForKey:unsubscribeButtonName];
+ }
+}
+
+#pragma mark Command
+
+- (void)sdl_runHandlerForCommand:(NSNotification *)notification {
+ SDLOnCommand *onCommandNotification = notification.userInfo[SDLNotificationUserInfoObject];
+ SDLRPCNotificationHandler handler = nil;
+
+ handler = self.commandHandlerMap[onCommandNotification.cmdID];
+ if (handler) {
+ handler(onCommandNotification);
+ }
+}
+
+#pragma mark Button
+
+- (void)sdl_runHandlerForButton:(NSNotification *)notification {
+ __kindof SDLRPCNotification *rpcNotification = notification.userInfo[SDLNotificationUserInfoObject];
+
+ SDLRPCNotificationHandler handler = nil;
+ SDLButtonName *name = nil;
+ NSNumber *customID = nil;
+
+ if ([rpcNotification isKindOfClass:[SDLOnButtonEvent class]]) {
+ name = ((SDLOnButtonEvent *)rpcNotification).buttonName;
+ customID = ((SDLOnButtonEvent *)rpcNotification).customButtonID;
+ } else if ([rpcNotification isKindOfClass:[SDLOnButtonPress class]]) {
+ name = ((SDLOnButtonPress *)rpcNotification).buttonName;
+ customID = ((SDLOnButtonPress *)rpcNotification).customButtonID;
+ }
+
+ if ([name isEqualToEnum:[SDLButtonName CUSTOM_BUTTON]]) {
+ handler = self.customButtonHandlerMap[customID];
+ } else {
+ handler = self.buttonHandlerMap[name.value];
+ }
+
+ if (handler) {
+ handler(rpcNotification);
+ }
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLScrollableMessage.h b/SmartDeviceLink/SDLScrollableMessage.h
index 27e894221..3a1fe8415 100644
--- a/SmartDeviceLink/SDLScrollableMessage.h
+++ b/SmartDeviceLink/SDLScrollableMessage.h
@@ -4,6 +4,8 @@
#import "SDLRPCRequest.h"
+@class SDLSoftButton;
+
/**
* Creates a full screen overlay containing a large block of formatted text that
* can be scrolled with up to 8 SoftButtons defined
@@ -27,6 +29,10 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithMessage:(NSString *)message;
+
+- (instancetype)initWithMessage:(NSString *)message timeout:(UInt16)timeout softButtons:(NSArray<SDLSoftButton *> *)softButtons;
+
/**
* @abstract A Body of text that can include newlines and tabs
* @discussion A String value representing the Body of text that can include
diff --git a/SmartDeviceLink/SDLScrollableMessage.m b/SmartDeviceLink/SDLScrollableMessage.m
index 5995e7874..ecc771c18 100644
--- a/SmartDeviceLink/SDLScrollableMessage.m
+++ b/SmartDeviceLink/SDLScrollableMessage.m
@@ -21,6 +21,29 @@
return self;
}
+- (instancetype)initWithMessage:(NSString *)message timeout:(UInt16)timeout softButtons:(NSArray<SDLSoftButton *> *)softButtons {
+ self = [self initWithMessage:message];
+ if (!self) {
+ return nil;
+ }
+
+ self.timeout = @(timeout);
+ self.softButtons = [softButtons mutableCopy];
+
+ return self;
+}
+
+- (instancetype)initWithMessage:(NSString *)message {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.scrollableMessageBody = message;
+
+ return self;
+}
+
- (void)setScrollableMessageBody:(NSString *)scrollableMessageBody {
if (scrollableMessageBody != nil) {
[parameters setObject:scrollableMessageBody forKey:NAMES_scrollableMessageBody];
diff --git a/SmartDeviceLink/SDLSendLocation.h b/SmartDeviceLink/SDLSendLocation.h
index cec60c422..0b7a77a19 100644
--- a/SmartDeviceLink/SDLSendLocation.h
+++ b/SmartDeviceLink/SDLSendLocation.h
@@ -2,6 +2,7 @@
// SDLSendLocation.h
// SmartDeviceLink
+#import <CoreGraphics/CGBase.h>
#import <Foundation/Foundation.h>
#import "SDLImage.h"
@@ -13,6 +14,8 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithLongitude:(CGFloat)longitude latitude:(CGFloat)latitude locationName:(NSString *)locationName locationDescription:(NSString *)locationDescription address:(NSArray<NSString *> *)address phoneNumber:(NSString *)phoneNumber image:(SDLImage *)image;
+
/**
* The longitudinal coordinate of the location.
*
diff --git a/SmartDeviceLink/SDLSendLocation.m b/SmartDeviceLink/SDLSendLocation.m
index 7bf1c5c70..83a420ccc 100644
--- a/SmartDeviceLink/SDLSendLocation.m
+++ b/SmartDeviceLink/SDLSendLocation.m
@@ -27,6 +27,23 @@
return self;
}
+- (instancetype)initWithLongitude:(CGFloat)longitude latitude:(CGFloat)latitude locationName:(NSString *)locationName locationDescription:(NSString *)locationDescription address:(NSArray *)address phoneNumber:(NSString *)phoneNumber image:(SDLImage *)image {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.longitudeDegrees = @(longitude);
+ self.latitudeDegrees = @(latitude);
+ self.locationName = locationName;
+ self.locationDescription = locationDescription;
+ self.addressLines = address;
+ self.phoneNumber = phoneNumber;
+ self.locationImage = image;
+
+ return self;
+}
+
- (void)setLongitudeDegrees:(NSNumber *)longitudeDegrees {
if (longitudeDegrees != nil) {
parameters[NAMES_longitudeDegrees] = longitudeDegrees;
diff --git a/SmartDeviceLink/SDLSetAppIcon.h b/SmartDeviceLink/SDLSetAppIcon.h
index eee61deb5..17b30ad00 100644
--- a/SmartDeviceLink/SDLSetAppIcon.h
+++ b/SmartDeviceLink/SDLSetAppIcon.h
@@ -24,6 +24,9 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithFileName:(NSString *)fileName;
+
+
/**
* @abstract A file reference name
* @discussion A String value representing a file reference name
diff --git a/SmartDeviceLink/SDLSetAppIcon.m b/SmartDeviceLink/SDLSetAppIcon.m
index 717eeb023..011579575 100644
--- a/SmartDeviceLink/SDLSetAppIcon.m
+++ b/SmartDeviceLink/SDLSetAppIcon.m
@@ -20,6 +20,17 @@
return self;
}
+- (instancetype)initWithFileName:(NSString *)fileName {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.syncFileName = fileName;
+
+ return self;
+}
+
- (void)setSyncFileName:(NSString *)syncFileName {
if (syncFileName != nil) {
[parameters setObject:syncFileName forKey:NAMES_syncFileName];
diff --git a/SmartDeviceLink/SDLSetDisplayLayout.h b/SmartDeviceLink/SDLSetDisplayLayout.h
index 15226a821..eae57de46 100644
--- a/SmartDeviceLink/SDLSetDisplayLayout.h
+++ b/SmartDeviceLink/SDLSetDisplayLayout.h
@@ -4,6 +4,8 @@
#import "SDLRPCRequest.h"
+@class SDLPredefinedLayout;
+
/**
* Used to set an alternate display layout. If not sent, default screen for
* given platform will be shown
@@ -24,6 +26,11 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithPredefinedLayout:(SDLPredefinedLayout *)predefinedLayout;
+
+- (instancetype)initWithLayout:(NSString *)displayLayout;
+
+
/**
* @abstract A display layout. Predefined or dynamically created screen layout.
* Currently only predefined screen layouts are defined. Predefined layouts
diff --git a/SmartDeviceLink/SDLSetDisplayLayout.m b/SmartDeviceLink/SDLSetDisplayLayout.m
index ed812f647..21c0eebfc 100644
--- a/SmartDeviceLink/SDLSetDisplayLayout.m
+++ b/SmartDeviceLink/SDLSetDisplayLayout.m
@@ -5,6 +5,7 @@
#import "SDLSetDisplayLayout.h"
#import "SDLNames.h"
+#import "SDLPredefinedLayout.h"
@implementation SDLSetDisplayLayout
@@ -20,6 +21,21 @@
return self;
}
+- (instancetype)initWithPredefinedLayout:(SDLPredefinedLayout *)predefinedLayout {
+ return [self initWithLayout:predefinedLayout.value];
+}
+
+- (instancetype)initWithLayout:(NSString *)displayLayout {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.displayLayout = displayLayout;
+
+ return self;
+}
+
- (void)setDisplayLayout:(NSString *)displayLayout {
if (displayLayout != nil) {
[parameters setObject:displayLayout forKey:NAMES_displayLayout];
diff --git a/SmartDeviceLink/SDLSetGlobalProperties.h b/SmartDeviceLink/SDLSetGlobalProperties.h
index 7ad36e8d5..fbf3bf794 100644
--- a/SmartDeviceLink/SDLSetGlobalProperties.h
+++ b/SmartDeviceLink/SDLSetGlobalProperties.h
@@ -31,6 +31,12 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText;
+
+- (instancetype)initWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText vrHelpTitle:(NSString *)vrHelpTitle vrHelp:(NSArray *)vrHelp;
+
+- (instancetype)initWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText vrHelpTitle:(NSString *)vrHelpTitle vrHelp:(NSArray *)vrHelp menuTitle:(NSString *)menuTitle menuIcon:(SDLImage *)menuIcon keyboardProperties:(SDLKeyboardProperties *)keyboardProperties;
+
/**
* @abstract Sets a Vector<TTSChunk> for Help Prompt that Array of one or more
* TTSChunk elements specifying the help prompt used in an interaction
diff --git a/SmartDeviceLink/SDLSetGlobalProperties.m b/SmartDeviceLink/SDLSetGlobalProperties.m
index ba9749e3e..490c1fc34 100644
--- a/SmartDeviceLink/SDLSetGlobalProperties.m
+++ b/SmartDeviceLink/SDLSetGlobalProperties.m
@@ -8,6 +8,7 @@
#import "SDLKeyboardProperties.h"
#import "SDLNames.h"
#import "SDLTTSChunk.h"
+#import "SDLTTSChunkFactory.h"
#import "SDLVRHelpItem.h"
@@ -25,6 +26,32 @@
return self;
}
+- (instancetype)initWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText {
+ return [self initWithHelpText:helpText timeoutText:timeoutText vrHelpTitle:nil vrHelp:nil];
+}
+
+- (instancetype)initWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText vrHelpTitle:(NSString *)vrHelpTitle vrHelp:(NSArray *)vrHelp {
+ return [self initWithHelpText:helpText timeoutText:timeoutText vrHelpTitle:vrHelpTitle vrHelp:vrHelp menuTitle:nil menuIcon:nil keyboardProperties:nil];
+}
+
+- (instancetype)initWithHelpText:(NSString *)helpText timeoutText:(NSString *)timeoutText vrHelpTitle:(NSString *)vrHelpTitle vrHelp:(NSArray *)vrHelp menuTitle:(NSString *)menuTitle menuIcon:(SDLImage *)menuIcon keyboardProperties:(SDLKeyboardProperties *)keyboardProperties {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.helpPrompt = [SDLTTSChunk textChunksFromString:helpText];
+ self.timeoutPrompt = [SDLTTSChunk textChunksFromString:timeoutText];
+ self.vrHelpTitle = vrHelpTitle;
+ self.vrHelp = [vrHelp mutableCopy];
+ self.menuTitle = menuTitle;
+ self.menuIcon = menuIcon;
+ self.keyboardProperties = keyboardProperties;
+
+ return self;
+}
+
+
- (void)setHelpPrompt:(NSMutableArray *)helpPrompt {
if (helpPrompt != nil) {
[parameters setObject:helpPrompt forKey:NAMES_helpPrompt];
diff --git a/SmartDeviceLink/SDLSetMediaClockTimer.h b/SmartDeviceLink/SDLSetMediaClockTimer.h
index 71de56b35..c15c5a192 100644
--- a/SmartDeviceLink/SDLSetMediaClockTimer.h
+++ b/SmartDeviceLink/SDLSetMediaClockTimer.h
@@ -31,6 +31,10 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithUpdateMode:(SDLUpdateMode *)updateMode hours:(NSInteger)hours minutes:(NSInteger)minutes seconds:(NSInteger)seconds;
+
+- (instancetype)initWithUpdateMode:(SDLUpdateMode *)updateMode;
+
/**
* @abstract A Start Time with specifying hour, minute, second values
*
diff --git a/SmartDeviceLink/SDLSetMediaClockTimer.m b/SmartDeviceLink/SDLSetMediaClockTimer.m
index 325d0e347..61953c912 100644
--- a/SmartDeviceLink/SDLSetMediaClockTimer.m
+++ b/SmartDeviceLink/SDLSetMediaClockTimer.m
@@ -23,6 +23,29 @@
return self;
}
+
+- (instancetype)initWithUpdateMode:(SDLUpdateMode *)updateMode hours:(NSInteger)hours minutes:(NSInteger)minutes seconds:(NSInteger)seconds {
+ self = [self initWithUpdateMode:updateMode];
+ if (!self) {
+ return nil;
+ }
+
+ self.startTime = [[SDLStartTime alloc] initWithHours:hours minutes:minutes seconds:seconds];
+
+ return self;
+}
+
+- (instancetype)initWithUpdateMode:(SDLUpdateMode *)updateMode {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.updateMode = updateMode;
+
+ return self;
+}
+
- (void)setStartTime:(SDLStartTime *)startTime {
if (startTime != nil) {
[parameters setObject:startTime forKey:NAMES_startTime];
diff --git a/SmartDeviceLink/SDLShow.h b/SmartDeviceLink/SDLShow.h
index 20cf84a92..45849cd48 100644
--- a/SmartDeviceLink/SDLShow.h
+++ b/SmartDeviceLink/SDLShow.h
@@ -4,6 +4,7 @@
#import "SDLRPCRequest.h"
@class SDLImage;
+@class SDLSoftButton;
@class SDLTextAlignment;
@@ -42,6 +43,15 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 alignment:(SDLTextAlignment *)alignment;
+
+- (instancetype)initWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 mainField3:(NSString *)mainField3 mainField4:(NSString *)mainField4 alignment:(SDLTextAlignment *)alignment;
+
+- (instancetype)initWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 alignment:(SDLTextAlignment *)alignment statusBar:(NSString *)statusBar mediaClock:(NSString *)mediaClock mediaTrack:(NSString *)mediaTrack;
+
+- (instancetype)initWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 mainField3:(NSString *)mainField3 mainField4:(NSString *)mainField4 alignment:(SDLTextAlignment *)alignment statusBar:(NSString *)statusBar mediaClock:(NSString *)mediaClock mediaTrack:(NSString *)mediaTrack graphic:(SDLImage *)graphic softButtons:(NSArray<SDLSoftButton *> *)softButtons customPresets:(NSArray<NSString *> *)customPresets;
+
+
/**
* @abstract The text displayed in a single-line display, or in the upper display
* line in a two-line display
diff --git a/SmartDeviceLink/SDLShow.m b/SmartDeviceLink/SDLShow.m
index 933167159..36251d3bc 100644
--- a/SmartDeviceLink/SDLShow.m
+++ b/SmartDeviceLink/SDLShow.m
@@ -24,6 +24,39 @@
return self;
}
+- (instancetype)initWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 alignment:(SDLTextAlignment *)alignment {
+ return [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:nil mainField4:nil alignment:alignment];
+}
+
+- (instancetype)initWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 mainField3:(NSString *)mainField3 mainField4:(NSString *)mainField4 alignment:(SDLTextAlignment *)alignment {
+ return [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:mainField3 mainField4:mainField4 alignment:alignment statusBar:nil mediaClock:nil mediaTrack:nil graphic:nil softButtons:nil customPresets:nil];
+}
+
+- (instancetype)initWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 alignment:(SDLTextAlignment *)alignment statusBar:(NSString *)statusBar mediaClock:(NSString *)mediaClock mediaTrack:(NSString *)mediaTrack {
+ return [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:nil mainField4:nil alignment:alignment statusBar:statusBar mediaClock:mediaClock mediaTrack:mediaTrack graphic:nil softButtons:nil customPresets:nil];
+}
+
+- (instancetype)initWithMainField1:(NSString *)mainField1 mainField2:(NSString *)mainField2 mainField3:(NSString *)mainField3 mainField4:(NSString *)mainField4 alignment:(SDLTextAlignment *)alignment statusBar:(NSString *)statusBar mediaClock:(NSString *)mediaClock mediaTrack:(NSString *)mediaTrack graphic:(SDLImage *)graphic softButtons:(NSArray<SDLSoftButton *> *)softButtons customPresets:(NSArray<NSString *> *)customPresets {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.mainField1 = mainField1;
+ self.mainField2 = mainField2;
+ self.mainField3 = mainField3;
+ self.mainField4 = mainField4;
+ self.statusBar = statusBar;
+ self.mediaClock = mediaClock;
+ self.mediaTrack = mediaTrack;
+ self.alignment = alignment;
+ self.graphic = graphic;
+ self.softButtons = [softButtons mutableCopy];
+ self.customPresets = [customPresets mutableCopy];
+
+ return self;
+}
+
- (void)setMainField1:(NSString *)mainField1 {
if (mainField1 != nil) {
[parameters setObject:mainField1 forKey:NAMES_mainField1];
diff --git a/SmartDeviceLink/SDLShowConstantTBT.h b/SmartDeviceLink/SDLShowConstantTBT.h
index ae5dda108..b0d60bf97 100644
--- a/SmartDeviceLink/SDLShowConstantTBT.h
+++ b/SmartDeviceLink/SDLShowConstantTBT.h
@@ -3,7 +3,10 @@
#import "SDLRPCRequest.h"
+#import <CoreGraphics/CGBase.h>
+
@class SDLImage;
+@class SDLSoftButton;
/** This RPC is used to update the user with navigation information<br>
@@ -18,6 +21,8 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithNavigationText1:(NSString *)navigationText1 navigationText2:(NSString *)navigationText2 eta:(NSString *)eta timeToDestination:(NSString *)timeToDestination totalDistance:(NSString *)totalDistance turnIcon:(SDLImage *)turnIcon nextTurnIcon:(SDLImage *)nextTurnIcon distanceToManeuver:(CGFloat)distanceToManeuver distanceToManeuverScale:(CGFloat)distanceToManeuverScale maneuverComplete:(BOOL)maneuverComplete softButtons:(NSArray<SDLSoftButton *> *)softButtons;
+
@property (strong) NSString *navigationText1;
@property (strong) NSString *navigationText2;
@property (strong) NSString *eta;
diff --git a/SmartDeviceLink/SDLShowConstantTBT.m b/SmartDeviceLink/SDLShowConstantTBT.m
index c3f87f071..87079df6a 100644
--- a/SmartDeviceLink/SDLShowConstantTBT.m
+++ b/SmartDeviceLink/SDLShowConstantTBT.m
@@ -23,6 +23,27 @@
return self;
}
+- (instancetype)initWithNavigationText1:(NSString *)navigationText1 navigationText2:(NSString *)navigationText2 eta:(NSString *)eta timeToDestination:(NSString *)timeToDestination totalDistance:(NSString *)totalDistance turnIcon:(SDLImage *)turnIcon nextTurnIcon:(SDLImage *)nextTurnIcon distanceToManeuver:(CGFloat)distanceToManeuver distanceToManeuverScale:(CGFloat)distanceToManeuverScale maneuverComplete:(BOOL)maneuverComplete softButtons:(NSArray<SDLSoftButton *> *)softButtons {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.navigationText1 = navigationText1;
+ self.navigationText2 = navigationText2;
+ self.eta = eta;
+ self.timeToDestination = timeToDestination;
+ self.totalDistance = totalDistance;
+ self.turnIcon = turnIcon;
+ self.nextTurnIcon = nextTurnIcon;
+ self.distanceToManeuver = @(distanceToManeuver);
+ self.distanceToManeuverScale = @(distanceToManeuverScale);
+ self.maneuverComplete = @(maneuverComplete);
+ self.softButtons = [softButtons mutableCopy];
+
+ return self;
+}
+
- (void)setNavigationText1:(NSString *)navigationText1 {
if (navigationText1 != nil) {
[parameters setObject:navigationText1 forKey:NAMES_navigationText1];
diff --git a/SmartDeviceLink/SDLSiphonServer.m b/SmartDeviceLink/SDLSiphonServer.m
index dbb433424..15367be41 100644
--- a/SmartDeviceLink/SDLSiphonServer.m
+++ b/SmartDeviceLink/SDLSiphonServer.m
@@ -11,7 +11,7 @@
******************************/
//#define ZERO_CONFIG //Uncomment when implementing zero-config.
-//#define DEBUG_SIPHON //Uncomment to have output to NSLog.
+//#define DEBUG_SIPHON //Uncomment to have output to SDLDebugTool.
#import "SDLSiphonServer.h"
#import "SDLDebugTool.h"
@@ -86,7 +86,7 @@ void _stopServer(NSString *reason);
void _closeSiphonSocket() {
#ifdef DEBUG_SIPHON
- NSLog(@"siphon: Resetting siphon socket ...");
+ [SDLDebugTool logInfo:@"siphon: Resetting siphon socket ..."];
#endif
if (siphonLock) {
@synchronized(siphonLock) {
@@ -97,7 +97,7 @@ void _closeSiphonSocket() {
} // end-lock
} // end-if
#ifdef DEBUG_SIPHON
- NSLog(@"siphon: siphon socket reset complete");
+ [SDLDebugTool logInfo:@"siphon: siphon socket reset complete"];
#endif
} // end-method
@@ -219,14 +219,14 @@ bool _sendSiphonData(const void *dataBytes, int dataBytesLength, SiphonDataType
return YES;
} else {
#ifdef DEBUG_SIPHON
- NSLog(@"siphon: failure sending to siphon socket");
+ [SDLDebugTool logInfo:@"siphon: failure sending to siphon socket"];
#endif
_closeSiphonSocket();
return NO;
} // end-if
} else {
#ifdef DEBUG_SIPHON
- NSLog(@"siphon: siphon socket is NULL");
+ [SDLDebugTool logInfo:@"siphon: siphon socket is NULL"];
#endif
} // end-if
} //end Synchronized
@@ -250,7 +250,7 @@ bool _sendDataToSiphonSocket(int soc, const void *pData, int dataLength) {
if (bytesSent == -1) {
#ifdef DEBUG_SIPHON
- NSLog(@"siphon: got bytesSent==-1 on send(siphonSocket)");
+ [SDLDebugTool logInfo:@"siphon: got bytesSent==-1 on send(siphonSocket)"];
#endif
return NO;
} // end-if
@@ -268,7 +268,7 @@ bool _sendDataToSiphonSocket(int soc, const void *pData, int dataLength) {
void _serverDidStartOnPort(int port) {
#ifdef DEBUG_SIPHON
- NSLog(@"siphon: server started on port: %d", port);
+ [SDLDebugTool logInfo:@"siphon: server started on port: %d", port];
#endif
}
@@ -284,11 +284,11 @@ void _serverDidStopWithReason(NSString *reason) {
}
- (void)_updateStatus:(NSString *)statusString {
- NSLog(@"siphon: %@", statusString);
+ [SDLDebugTool logFormat:@"siphon: %@", statusString];
}
- (void)_SendDidStopWithStatus:(NSString *)statusString {
- NSLog(@"siphon: server configured for output");
+ [SDLDebugTool logInfo:@"siphon: server configured for output"];
}
- (BOOL)isStarted {
@@ -304,7 +304,7 @@ void _acceptConnection(int fd) {
_closeSiphonSocket();
#ifdef DEBUG_SIPHON
- NSLog(@"siphon: storing newly accepted siphon socket handle %08x ...", fd);
+ [SDLDebugTool logFormat:@"siphon: storing newly accepted siphon socket handle %08x ...", fd];
#endif
siphonSocket = fd;
@@ -318,7 +318,7 @@ void _acceptConnection(int fd) {
static void AcceptCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) {
#ifdef DEBUG_SIPHON
- NSLog(@"siphon: accepted siphon connection ...");
+ [SDLDebugTool logInfo:@"siphon: accepted siphon connection ..."];
#endif
#pragma unused(type)
@@ -369,7 +369,7 @@ void _startServerOnPort(int port) {
if (err == 0) {
openPortFound = true;
success = (err == 0);
- port = bindPort;
+ // port = bindPort;
} else {
bindPort++;
}
@@ -388,10 +388,10 @@ void _startServerOnPort(int port) {
if (success) {
assert(addrLen == sizeof(addr));
- port = ntohs(addr.sin_port);
+ // port = ntohs(addr.sin_port);
}
#ifdef DEBUG_SIPHON
- NSLog(@"siphon: my port is %d ", port);
+ [SDLDebugTool logFormat:@"siphon: my port is %d ", port];
#endif
}
if (success) {
@@ -405,7 +405,7 @@ void _startServerOnPort(int port) {
if (success) {
CFRunLoopSourceRef rls;
- fd = -1;
+ // fd = -1;
rls = CFSocketCreateRunLoopSource(NULL, _listeningSocket, 0);
assert(rls != NULL);
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
diff --git a/SmartDeviceLink/SDLSlider.h b/SmartDeviceLink/SDLSlider.h
index 04724d780..7651bd57f 100644
--- a/SmartDeviceLink/SDLSlider.h
+++ b/SmartDeviceLink/SDLSlider.h
@@ -25,6 +25,12 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithNumTicks:(UInt8)numTicks position:(UInt8)position;
+
+- (instancetype)initWithNumTicks:(UInt8)numTicks position:(UInt8)position sliderHeader:(NSString *)sliderHeader sliderFooter:(NSString *)sliderFooter timeout:(UInt16)timeout;
+
+- (instancetype)initWithNumTicks:(UInt8)numTicks position:(UInt8)position sliderHeader:(NSString *)sliderHeader sliderFooters:(NSArray<NSString *> *)sliderFooters timeout:(UInt16)timeout;
+
/**
* @abstract Represents a number of selectable items on a horizontal axis
*
diff --git a/SmartDeviceLink/SDLSlider.m b/SmartDeviceLink/SDLSlider.m
index 80a56d1aa..38226ffdf 100644
--- a/SmartDeviceLink/SDLSlider.m
+++ b/SmartDeviceLink/SDLSlider.m
@@ -20,6 +20,42 @@
return self;
}
+- (instancetype)initWithNumTicks:(UInt8)numTicks position:(UInt8)position sliderHeader:(NSString *)sliderHeader sliderFooter:(NSString *)sliderFooter timeout:(UInt16)timeout {
+ NSMutableArray *sliderFooters = [NSMutableArray arrayWithCapacity:numTicks];
+
+ // Populates array with the same footer value for each position
+ for (int i = 0; i < sliderFooters.count; i++) {
+ sliderFooters[0] = sliderFooter;
+ }
+
+ return [self initWithNumTicks:numTicks position:position sliderHeader:sliderHeader sliderFooter:[sliderFooters copy] timeout:timeout];
+}
+
+- (instancetype)initWithNumTicks:(UInt8)numTicks position:(UInt8)position sliderHeader:(NSString *)sliderHeader sliderFooters:(NSArray<NSString *> *)sliderFooters timeout:(UInt16)timeout {
+ self = [self initWithNumTicks:numTicks position:position];
+ if (!self) {
+ return nil;
+ }
+
+ self.sliderHeader = sliderHeader;
+ self.sliderFooter = [sliderFooters mutableCopy];
+ self.timeout = @(timeout);
+
+ return self;
+}
+
+- (instancetype)initWithNumTicks:(UInt8)numTicks position:(UInt8)position {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.numTicks = @(numTicks);
+ self.position = @(position);
+
+ return self;
+}
+
- (void)setNumTicks:(NSNumber *)numTicks {
if (numTicks != nil) {
[parameters setObject:numTicks forKey:NAMES_numTicks];
diff --git a/SmartDeviceLink/SDLSoftButton.h b/SmartDeviceLink/SDLSoftButton.h
index db2393ae7..cfc62a33e 100644
--- a/SmartDeviceLink/SDLSoftButton.h
+++ b/SmartDeviceLink/SDLSoftButton.h
@@ -3,17 +3,25 @@
#import "SDLRPCMessage.h"
+#import "SDLNotificationConstants.h"
+#import "SDLRequestHandler.h"
+
@class SDLImage;
@class SDLSoftButtonType;
@class SDLSystemAction;
-@interface SDLSoftButton : SDLRPCStruct {
+@interface SDLSoftButton : SDLRPCStruct <SDLRequestHandler> {
}
- (instancetype)init;
+- (instancetype)initWithHandler:(SDLRPCNotificationHandler)handler;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithType:(SDLSoftButtonType *)tyle text:(NSString *)text image:(SDLImage *)image highlighted:(BOOL)highlighted buttonId:(UInt16)buttonId systemAction:(SDLSystemAction *)systemAction handler:(SDLRPCNotificationHandler)handler;
+
+@property (copy, nonatomic) SDLRPCNotificationHandler handler;
+
@property (strong) SDLSoftButtonType *type;
@property (strong) NSString *text;
@property (strong) SDLImage *image;
diff --git a/SmartDeviceLink/SDLSoftButton.m b/SmartDeviceLink/SDLSoftButton.m
index a93ce510c..b6b5cb484 100644
--- a/SmartDeviceLink/SDLSoftButton.m
+++ b/SmartDeviceLink/SDLSoftButton.m
@@ -17,12 +17,40 @@
return self;
}
+- (instancetype)initWithHandler:(SDLRPCNotificationHandler)handler {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ _handler = handler;
+
+ return self;
+}
+
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict {
if (self = [super initWithDictionary:dict]) {
}
return self;
}
+- (instancetype)initWithType:(SDLSoftButtonType *)type text:(NSString *)text image:(SDLImage *)image highlighted:(BOOL)highlighted buttonId:(UInt16)buttonId systemAction:(SDLSystemAction *)systemAction handler:(SDLRPCNotificationHandler)handler {
+ self = [self initWithHandler:handler];
+ if (!self) {
+ return nil;
+ }
+
+ self.type = type;
+ self.text = text;
+ self.image = image;
+ self.isHighlighted = @(highlighted);
+ self.softButtonID = @(buttonId);
+ self.systemAction = systemAction;
+ self.handler = handler;
+
+ return self;
+}
+
- (void)setType:(SDLSoftButtonType *)type {
if (type != nil) {
[store setObject:type forKey:NAMES_type];
diff --git a/SmartDeviceLink/SDLSpeak.h b/SmartDeviceLink/SDLSpeak.h
index 8e6eb8e7e..f6485030a 100644
--- a/SmartDeviceLink/SDLSpeak.h
+++ b/SmartDeviceLink/SDLSpeak.h
@@ -3,6 +3,8 @@
#import "SDLRPCRequest.h"
+@class SDLTTSChunk;
+
/**
* Speaks a phrase over the vehicle audio system using SDL'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's TTS engine to speak a "speech-sculpted" phrase.
*
@@ -50,6 +52,10 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithTTS:(NSString *)ttsText;
+
+- (instancetype)initWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks;
+
/**
* @abstract An array of TTSChunk structs which, taken together, specify the phrase to be spoken
*
diff --git a/SmartDeviceLink/SDLSpeak.m b/SmartDeviceLink/SDLSpeak.m
index 8f19b925b..875e4e513 100644
--- a/SmartDeviceLink/SDLSpeak.m
+++ b/SmartDeviceLink/SDLSpeak.m
@@ -6,6 +6,7 @@
#import "SDLNames.h"
#import "SDLTTSChunk.h"
+#import "SDLTTSChunkFactory.h"
@implementation SDLSpeak
@@ -21,6 +22,22 @@
return self;
}
+- (instancetype)initWithTTS:(NSString *)ttsText {
+ NSMutableArray *ttsChunks = [SDLTTSChunk textChunksFromString:ttsText];
+ return [self initWithTTSChunks:ttsChunks];
+}
+
+- (instancetype)initWithTTSChunks:(NSArray<SDLTTSChunk *> *)ttsChunks {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.ttsChunks = [ttsChunks mutableCopy];
+
+ return self;
+}
+
- (void)setTtsChunks:(NSMutableArray *)ttsChunks {
if (ttsChunks != nil) {
[parameters setObject:ttsChunks forKey:NAMES_ttsChunks];
diff --git a/SmartDeviceLink/SDLStartTime.h b/SmartDeviceLink/SDLStartTime.h
index 55eb147d6..923a6656c 100644
--- a/SmartDeviceLink/SDLStartTime.h
+++ b/SmartDeviceLink/SDLStartTime.h
@@ -23,6 +23,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithHours:(UInt8)hours minutes:(UInt8)minutes seconds:(UInt8)seconds;
+
/**
* @abstract The hour of the media clock
*
diff --git a/SmartDeviceLink/SDLStartTime.m b/SmartDeviceLink/SDLStartTime.m
index 4745bf712..574d4f552 100644
--- a/SmartDeviceLink/SDLStartTime.m
+++ b/SmartDeviceLink/SDLStartTime.m
@@ -20,6 +20,19 @@
return self;
}
+- (instancetype)initWithHours:(UInt8)hours minutes:(UInt8)minutes seconds:(UInt8)seconds {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.hours = @(hours);
+ self.minutes = @(minutes);
+ self.seconds = @(seconds);
+
+ return self;
+}
+
- (void)setHours:(NSNumber *)hours {
if (hours != nil) {
[store setObject:hours forKey:NAMES_hours];
diff --git a/SmartDeviceLink/SDLStateMachine.h b/SmartDeviceLink/SDLStateMachine.h
new file mode 100644
index 000000000..3690261f9
--- /dev/null
+++ b/SmartDeviceLink/SDLStateMachine.h
@@ -0,0 +1,102 @@
+//
+// SDLStateMachine.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/30/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NSString SDLState;
+typedef NSArray<SDLState *> SDLAllowableStateTransitions;
+
+extern NSString *const SDLStateMachineNotificationFormat;
+
+typedef NSString *SDLStateMachineNotificationInfoKey;
+extern SDLStateMachineNotificationInfoKey const SDLStateMachineNotificationInfoKeyOldState;
+extern SDLStateMachineNotificationInfoKey const SDLStateMachineNotificationInfoKeyNewState;
+
+typedef NSString *SDLStateMachineExceptionInfoKey;
+extern SDLStateMachineExceptionInfoKey const SDLStateMachineExceptionInfoKeyTargetClass;
+extern SDLStateMachineExceptionInfoKey const SDLStateMachineExceptionInfoKeyFromState;
+extern SDLStateMachineExceptionInfoKey const SDLStateMachineExceptionInfoKeyToClass;
+
+typedef NSString *SDLStateMachineTransitionFormat;
+extern SDLStateMachineTransitionFormat const SDLStateMachineTransitionFormatWillLeave;
+extern SDLStateMachineTransitionFormat const SDLStateMachineTransitionFormatWillTransition;
+extern SDLStateMachineTransitionFormat const SDLStateMachineTransitionFormatDidTransition;
+extern SDLStateMachineTransitionFormat const SDLStateMachineTransitionFormatDidEnter;
+
+
+/**
+ * This class allows for a state machine to be created with a set of states and allowable transitions. When a transition occurs, the state machine will attempt to call a series of methods on the `target` class.
+ *
+ * Additionally, NSNotifications will be fired. The notifications will be of type "com.sdl.notification.statemachine.`TargetClass`". The target class is generated by calling `NSStringFromClass([target Class])`. The payload will contain the transition type, the old state, and new state.
+ *
+ * The sequence of events and methods are:
+ * * `[target willLeaveState<old state name>]`
+ * * `[target willTransitionFromState<old state name>ToState<new state name>]`
+ * * The state transitions here
+ * * `[target didTransitionFromState<old state name>ToState<new state name>]`
+ * * `[target didEnterState<new state name>]`
+ */
+@interface SDLStateMachine : NSObject
+
+/**
+ * A dictionary of states and their allowed transitions.
+ */
+@property (copy, nonatomic, readonly) NSDictionary<SDLState *, SDLAllowableStateTransitions *> *states;
+
+/**
+ * The current state of the state machine.
+ */
+@property (copy, nonatomic, readonly) SDLState *currentState;
+
+/**
+ * The object that will have selector methods called upon it.
+ */
+@property (weak, nonatomic, readonly) id target;
+
+/**
+ * This transition will be sent right after the state changes, but before `didTransition` or `didEnter` method calls occur.
+ */
+@property (copy, nonatomic, readonly) NSString *transitionNotificationName;
+
+/**
+ * Create a new state machine with these parameters
+ *
+ * @param target The target class state transition messages will be sent to
+ * @param states A dictionary of states and their allowed transitions
+ * @param initialState The initial state of the state machine
+ *
+ * @return An instance of the state machine class
+ */
+- (instancetype)initWithTarget:(id)target initialState:(SDLState *)initialState states:(NSDictionary<SDLState *, SDLAllowableStateTransitions *> *)states;
+
+/**
+ * Transition to another state when called. If the current state is not allowed to transition to the new state, an exception will occur. If the state machine is already in the called state, no action will occur.
+ *
+ * @param state The state to transition to.
+ */
+- (void)transitionToState:(SDLState *)state;
+
+/**
+ * Set the state machine to a particular state without transitioning. No methods will be called or notifications sent. This is primarily used for testing.
+ *
+ * @param state The state to set to
+ */
+- (void)setToState:(SDLState *)state;
+
+/**
+ * Return whether or not the current state is the passed state
+ *
+ * @param state The state to check
+ */
+- (BOOL)isCurrentState:(SDLState *)state;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLStateMachine.m b/SmartDeviceLink/SDLStateMachine.m
new file mode 100644
index 000000000..126f0e55b
--- /dev/null
+++ b/SmartDeviceLink/SDLStateMachine.m
@@ -0,0 +1,142 @@
+//
+// SDLStateMachine.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 10/30/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "SDLStateMachine.h"
+
+#import "SDLError.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+NSString *const SDLStateMachineNotificationFormat = @"com.sdl.statemachine.%@";
+
+SDLStateMachineNotificationInfoKey const SDLStateMachineNotificationInfoKeyOldState = @"oldState";
+SDLStateMachineNotificationInfoKey const SDLStateMachineNotificationInfoKeyNewState = @"newState";
+
+SDLStateMachineExceptionInfoKey const SDLStateMachineExceptionInfoKeyTargetClass = @"targetClass";
+SDLStateMachineExceptionInfoKey const SDLStateMachineExceptionInfoKeyFromState = @"fromState";
+SDLStateMachineExceptionInfoKey const SDLStateMachineExceptionInfoKeyToClass = @"toState";
+
+SDLStateMachineTransitionFormat const SDLStateMachineTransitionFormatWillLeave = @"willLeaveState%@";
+SDLStateMachineTransitionFormat const SDLStateMachineTransitionFormatWillTransition = @"willTransitionFromState%@ToState%@";
+SDLStateMachineTransitionFormat const SDLStateMachineTransitionFormatDidTransition = @"didTransitionFromState%@ToState%@";
+SDLStateMachineTransitionFormat const SDLStateMachineTransitionFormatDidEnter = @"didEnterState%@";
+
+
+@interface SDLStateMachine ()
+
+@property (copy, nonatomic, readwrite) SDLState *currentState;
+
+@end
+
+
+@implementation SDLStateMachine
+
+- (instancetype)initWithTarget:(id)target initialState:(SDLState *)initialState states:(NSDictionary<SDLState *, SDLAllowableStateTransitions *> *)states {
+ self = [super init];
+
+ if (!self) {
+ return nil;
+ }
+
+ if (states[initialState] == nil) {
+ @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Attempted to start with an SDLState that is not in the states dictionary" userInfo:nil];
+ }
+
+ _target = target;
+ _states = states;
+ _currentState = initialState;
+
+ return self;
+}
+
+- (void)transitionToState:(SDLState *)state {
+ NSString *oldState = [self.currentState copy];
+ if ([self isCurrentState:state]) {
+ return;
+ }
+
+ if (![self sdl_canState:self.currentState transitionToState:state]) {
+ @throw [NSException exceptionWithName:NSInternalInconsistencyException
+ reason:@"Invalid state machine transition occurred"
+ userInfo:@{SDLStateMachineExceptionInfoKeyTargetClass: NSStringFromClass([self.target class]),
+ SDLStateMachineExceptionInfoKeyFromState: self.currentState,
+ SDLStateMachineExceptionInfoKeyToClass: state}];
+ }
+
+ SEL willLeave = NSSelectorFromString([NSString stringWithFormat:SDLStateMachineTransitionFormatWillLeave, oldState]);
+ SEL willTransition = NSSelectorFromString([NSString stringWithFormat:SDLStateMachineTransitionFormatWillTransition, oldState, state]);
+ SEL didTransition = NSSelectorFromString([NSString stringWithFormat:SDLStateMachineTransitionFormatDidTransition, oldState, state]);
+ SEL didEnter = NSSelectorFromString([NSString stringWithFormat:SDLStateMachineTransitionFormatDidEnter, state]);
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
+
+ // Pre state transition calls
+ if ([self.target respondsToSelector:willLeave]) {
+ [self.target performSelector:willLeave];
+ }
+
+ if ([self.target respondsToSelector:willTransition]) {
+ [self.target performSelector:willTransition];
+ }
+
+ // Transition the state
+ self.currentState = state;
+
+ // Post state transition calls
+ [[NSNotificationCenter defaultCenter] postNotificationName:self.transitionNotificationName object:self userInfo:@{SDLStateMachineNotificationInfoKeyOldState: oldState, SDLStateMachineNotificationInfoKeyNewState: state}];
+ if ([self.target respondsToSelector:didTransition]) {
+ [self.target performSelector:didTransition];
+ }
+
+ if ([self.target respondsToSelector:didEnter]) {
+ [self.target performSelector:didEnter];
+ }
+
+#pragma clang diagnostic pop
+}
+
+- (BOOL)isCurrentState:(SDLState *)state {
+ return [self.currentState isEqualToString:state];
+}
+
+
+#pragma mark - Helpers
+
+- (void)setToState:(SDLState *)state {
+ if (![self.states.allKeys containsObject:state]) {
+ return;
+ }
+
+ self.currentState = state;
+}
+
+/**
+ * Determine if a state transition is valid. Returns YES if the state transition dictionary's fromState key contains toState in its value array, or if fromState and toState are the same state.
+ *
+ * @param fromState The former state
+ * @param toState The new state
+ *
+ * @return Whether or not the state transition is valid
+ */
+- (BOOL)sdl_canState:(SDLState *)fromState transitionToState:(SDLState *)toState {
+ if ([self.states[fromState] containsObject:toState] || [fromState isEqualToString:toState]) {
+ return YES;
+ }
+
+ return NO;
+}
+
+- (NSString *)transitionNotificationName {
+ return [NSString stringWithFormat:SDLStateMachineNotificationFormat, [self.target class]];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLStreamingMediaManager.m b/SmartDeviceLink/SDLStreamingMediaManager.m
index 8739e9b95..df61205f4 100644
--- a/SmartDeviceLink/SDLStreamingMediaManager.m
+++ b/SmartDeviceLink/SDLStreamingMediaManager.m
@@ -11,6 +11,7 @@
@import UIKit;
#import "SDLAbstractProtocol.h"
+#import "SDLDebugTool.h"
#import "SDLDisplayCapabilities.h"
#import "SDLGlobals.h"
#import "SDLImageResolution.h"
@@ -258,8 +259,8 @@ NS_ASSUME_NONNULL_BEGIN
static NSDictionary *defaultVideoEncoderSettings = nil;
if (defaultVideoEncoderSettings == nil) {
defaultVideoEncoderSettings = @{
- (__bridge NSString *)kVTCompressionPropertyKey_ProfileLevel : (__bridge NSString *)kVTProfileLevel_H264_Baseline_AutoLevel,
- (__bridge NSString *)kVTCompressionPropertyKey_RealTime : @YES
+ (__bridge NSString *)kVTCompressionPropertyKey_ProfileLevel: (__bridge NSString *)kVTProfileLevel_H264_Baseline_AutoLevel,
+ (__bridge NSString *)kVTCompressionPropertyKey_RealTime: @YES
};
}
return defaultVideoEncoderSettings;
@@ -352,7 +353,7 @@ NS_ASSUME_NONNULL_BEGIN
void sdl_videoEncoderOutputCallback(void *outputCallbackRefCon, void *sourceFrameRefCon, OSStatus status, VTEncodeInfoFlags infoFlags, CMSampleBufferRef sampleBuffer) {
// If there was an error in the encoding, drop the frame
if (status != noErr) {
- NSLog(@"Error encoding video, err=%lld", (int64_t)status);
+ [SDLDebugTool logFormat:@"Error encoding video, err=%lld", (int64_t)status];
return;
}
@@ -378,7 +379,7 @@ void sdl_videoEncoderOutputCallback(void *outputCallbackRefCon, void *sourceFram
if (status != noErr) {
// TODO: Log the error
if (*error != nil) {
- *error = [NSError errorWithDomain:SDLErrorDomainStreamingMediaVideo code:SDLStreamingVideoErrorConfigurationCompressionSessionCreationFailure userInfo:@{ @"OSStatus" : @(status) }];
+ *error = [NSError errorWithDomain:SDLErrorDomainStreamingMediaVideo code:SDLStreamingVideoErrorConfigurationCompressionSessionCreationFailure userInfo:@{ @"OSStatus": @(status) }];
}
return NO;
@@ -392,7 +393,7 @@ void sdl_videoEncoderOutputCallback(void *outputCallbackRefCon, void *sourceFram
status = VTSessionCopySupportedPropertyDictionary(self.compressionSession, &supportedProperties);
if (status != noErr) {
if (*error != nil) {
- *error = [NSError errorWithDomain:SDLErrorDomainStreamingMediaVideo code:SDLStreamingVideoErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{ @"OSStatus" : @(status) }];
+ *error = [NSError errorWithDomain:SDLErrorDomainStreamingMediaVideo code:SDLStreamingVideoErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{ @"OSStatus": @(status) }];
}
return NO;
@@ -402,7 +403,7 @@ void sdl_videoEncoderOutputCallback(void *outputCallbackRefCon, void *sourceFram
if (CFDictionaryContainsKey(supportedProperties, (__bridge CFStringRef)key) == false) {
if (*error != nil) {
NSString *description = [NSString stringWithFormat:@"\"%@\" is not a supported key.", key];
- *error = [NSError errorWithDomain:SDLErrorDomainStreamingMediaVideo code:SDLStreamingVideoErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{NSLocalizedDescriptionKey : description}];
+ *error = [NSError errorWithDomain:SDLErrorDomainStreamingMediaVideo code:SDLStreamingVideoErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{NSLocalizedDescriptionKey: description}];
}
CFRelease(supportedProperties);
return NO;
@@ -417,7 +418,7 @@ void sdl_videoEncoderOutputCallback(void *outputCallbackRefCon, void *sourceFram
status = VTSessionSetProperty(self.compressionSession, (__bridge CFStringRef)key, (__bridge CFTypeRef)value);
if (status != noErr) {
if (*error != nil) {
- *error = [NSError errorWithDomain:SDLErrorDomainStreamingMediaVideo code:SDLStreamingVideoErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{ @"OSStatus" : @(status) }];
+ *error = [NSError errorWithDomain:SDLErrorDomainStreamingMediaVideo code:SDLStreamingVideoErrorConfigurationCompressionSessionSetPropertyFailure userInfo:@{ @"OSStatus": @(status) }];
}
return NO;
@@ -552,6 +553,10 @@ void sdl_videoEncoderOutputCallback(void *outputCallbackRefCon, void *sourceFram
}
- (void)sdl_updateScreenSizeFromDisplayCapabilities:(SDLDisplayCapabilities *)displayCapabilities {
+ if (displayCapabilities.graphicSupported.boolValue == false) {
+ [SDLDebugTool logInfo:@"Graphics are not supported. We are assuming screen size is also unavailable"];
+ return;
+ }
SDLImageResolution *resolution = displayCapabilities.screenParams.resolution;
if (resolution != nil) {
_screenSize = CGSizeMake(resolution.resolutionWidth.floatValue,
diff --git a/SmartDeviceLink/SDLSubscribeButton.h b/SmartDeviceLink/SDLSubscribeButton.h
index a01df2d16..9baa7d052 100644
--- a/SmartDeviceLink/SDLSubscribeButton.h
+++ b/SmartDeviceLink/SDLSubscribeButton.h
@@ -4,6 +4,8 @@
#import "SDLRPCRequest.h"
+#import "SDLRequestHandler.h"
+
@class SDLButtonName;
@@ -57,13 +59,24 @@
* Since SmartDeviceLink 1.0<br/>
* See SDLUnsubscribeButton
*/
-@interface SDLSubscribeButton : SDLRPCRequest {
-}
+@interface SDLSubscribeButton : SDLRPCRequest <SDLRequestHandler>
/**
- * @abstract Constructs a new SDLSubscribeButton object
+ * Construct an SDLSubscribeButton
+ *
+ * @return An SDLSubscribeButton object
*/
- (instancetype)init;
+
+/**
+ * Construct a SDLSubscribeButton with a handler callback when an event occurs.
+ *
+ * @param handler A callback that will be called when a button event occurs for the subscribed button.
+ *
+ * @return An SDLSubscribeButton object
+ */
+- (instancetype)initWithHandler:(SDLRPCNotificationHandler)handler;
+
/**
* @abstract Constructs a new SDLSubscribeButton object indicated by the NSMutableDictionary
* parameter
@@ -71,6 +84,15 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithButtonName:(SDLButtonName *)buttonName handler:(SDLRPCNotificationHandler)handler;
+
+/**
+ * A handler that will let you know when the button you subscribed to is selected.
+ *
+ * @warning This will only work if you use SDLManager.
+ */
+@property (copy, nonatomic) SDLRPCNotificationHandler handler;
+
/**
* @abstract The name of the button to subscribe to
* @discussion An enum value, see <i>SDLButtonName</i>
diff --git a/SmartDeviceLink/SDLSubscribeButton.m b/SmartDeviceLink/SDLSubscribeButton.m
index 58a28a797..969ee9a75 100644
--- a/SmartDeviceLink/SDLSubscribeButton.m
+++ b/SmartDeviceLink/SDLSubscribeButton.m
@@ -16,12 +16,35 @@
return self;
}
+- (instancetype)initWithHandler:(SDLRPCNotificationHandler)handler {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ _handler = handler;
+
+ return self;
+}
+
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict {
if (self = [super initWithDictionary:dict]) {
}
return self;
}
+- (instancetype)initWithButtonName:(SDLButtonName *)buttonName handler:(SDLRPCNotificationHandler)handler {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.buttonName = buttonName;
+ self.handler = handler;
+
+ return self;
+}
+
- (void)setButtonName:(SDLButtonName *)buttonName {
if (buttonName != nil) {
[parameters setObject:buttonName forKey:NAMES_buttonName];
diff --git a/SmartDeviceLink/SDLSubscribeVehicleData.h b/SmartDeviceLink/SDLSubscribeVehicleData.h
index e357cd484..e0e5a799e 100644
--- a/SmartDeviceLink/SDLSubscribeVehicleData.h
+++ b/SmartDeviceLink/SDLSubscribeVehicleData.h
@@ -34,6 +34,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus;
+
/**
* @abstract A boolean value. If true, subscribes Gps data
*/
diff --git a/SmartDeviceLink/SDLSubscribeVehicleData.m b/SmartDeviceLink/SDLSubscribeVehicleData.m
index 55ec5e9d0..2fb50e364 100644
--- a/SmartDeviceLink/SDLSubscribeVehicleData.m
+++ b/SmartDeviceLink/SDLSubscribeVehicleData.m
@@ -20,6 +20,40 @@
return self;
}
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.accPedalPosition = @(accelerationPedalPosition);
+ self.airbagStatus = @(airbagStatus);
+ self.beltStatus = @(beltStatus);
+ self.bodyInformation = @(bodyInformation);
+ self.clusterModeStatus = @(clusterModeStatus);
+ self.deviceStatus = @(deviceStatus);
+ self.driverBraking = @(driverBraking);
+ self.eCallInfo = @(eCallInfo);
+ self.emergencyEvent = @(emergencyEvent);
+ self.engineTorque = @(engineTorque);
+ self.externalTemperature = @(externalTemperature);
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
+ self.myKey = @(myKey);
+ self.odometer = @(odometer);
+ self.gps = @(gps);
+ self.headLampStatus = @(headLampStatus);
+ self.instantFuelConsumption = @(instantFuelConsumption);
+ self.prndl = @(prndl);
+ self.rpm = @(rpm);
+ self.speed = @(speed);
+ self.steeringWheelAngle = @(steeringWheelAngle);
+ self.tirePressure = @(tirePressure);
+ self.wiperStatus = @(wiperStatus);
+
+ return self;
+}
+
- (void)setGps:(NSNumber *)gps {
if (gps != nil) {
[parameters setObject:gps forKey:NAMES_gps];
diff --git a/SmartDeviceLink/SDLSyncMsgVersion.h b/SmartDeviceLink/SDLSyncMsgVersion.h
index 98b573eec..8e4e16eae 100644
--- a/SmartDeviceLink/SDLSyncMsgVersion.h
+++ b/SmartDeviceLink/SDLSyncMsgVersion.h
@@ -23,6 +23,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithMajorVersion:(NSInteger)majorVersion minorVersion:(NSInteger)minorVersion;
+
/**
* @abstract The major version indicates versions that is not-compatible to previous versions
*
diff --git a/SmartDeviceLink/SDLSyncMsgVersion.m b/SmartDeviceLink/SDLSyncMsgVersion.m
index 2d516539e..704ec7e7e 100644
--- a/SmartDeviceLink/SDLSyncMsgVersion.m
+++ b/SmartDeviceLink/SDLSyncMsgVersion.m
@@ -20,6 +20,18 @@
return self;
}
+- (instancetype)initWithMajorVersion:(NSInteger)majorVersion minorVersion:(NSInteger)minorVersion {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.majorVersion = @(majorVersion);
+ self.minorVersion = @(minorVersion);
+
+ return self;
+}
+
- (void)setMajorVersion:(NSNumber *)majorVersion {
if (majorVersion != nil) {
[store setObject:majorVersion forKey:NAMES_majorVersion];
diff --git a/SmartDeviceLink/SDLSystemRequest.h b/SmartDeviceLink/SDLSystemRequest.h
index 479b5d18e..4492760ca 100644
--- a/SmartDeviceLink/SDLSystemRequest.h
+++ b/SmartDeviceLink/SDLSystemRequest.h
@@ -17,6 +17,8 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithType:(SDLRequestType *)requestType fileName:(NSString *)fileName;
+
@property (strong) SDLRequestType *requestType;
@property (strong) NSString *fileName;
diff --git a/SmartDeviceLink/SDLSystemRequest.m b/SmartDeviceLink/SDLSystemRequest.m
index 836b44447..adbd1f724 100644
--- a/SmartDeviceLink/SDLSystemRequest.m
+++ b/SmartDeviceLink/SDLSystemRequest.m
@@ -22,6 +22,18 @@
return self;
}
+- (instancetype)initWithType:(SDLRequestType *)requestType fileName:(NSString *)fileName {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.requestType = requestType;
+ self.fileName = fileName;
+
+ return self;
+}
+
- (void)setRequestType:(SDLRequestType *)requestType {
if (requestType != nil) {
[parameters setObject:requestType forKey:NAMES_requestType];
diff --git a/SmartDeviceLink/SDLTTSChunk.h b/SmartDeviceLink/SDLTTSChunk.h
index a304c3d99..151451bdf 100644
--- a/SmartDeviceLink/SDLTTSChunk.h
+++ b/SmartDeviceLink/SDLTTSChunk.h
@@ -52,6 +52,19 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithText:(NSString *)text type:(SDLSpeechCapabilities *)type;
+
++ (NSMutableArray<SDLTTSChunk *> *)textChunksFromString:(NSString *)string;
+
++ (NSMutableArray<SDLTTSChunk *> *)sapiChunksFromString:(NSString *)string;
+
++ (NSMutableArray<SDLTTSChunk *> *)lhPlusChunksFromString:(NSString *)string;
+
++ (NSMutableArray<SDLTTSChunk *> *)prerecordedChunksFromString:(NSString *)string;
+
++ (NSMutableArray<SDLTTSChunk *> *)silenceChunks;
+
+
/**
* @abstract Text to be spoken, or a phoneme specification, or the name of a pre-recorded sound. The contents of this field are indicated by the "type" field.
*
diff --git a/SmartDeviceLink/SDLTTSChunk.m b/SmartDeviceLink/SDLTTSChunk.m
index 7e45413eb..939689b98 100644
--- a/SmartDeviceLink/SDLTTSChunk.m
+++ b/SmartDeviceLink/SDLTTSChunk.m
@@ -21,6 +21,46 @@
return self;
}
+- (instancetype)initWithText:(NSString *)text type:(SDLSpeechCapabilities *)type {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.text = text;
+ self.type = type;
+
+ return self;
+}
+
++ (NSMutableArray<SDLTTSChunk *> *)textChunksFromString:(NSString *)string {
+ return [self sdl_chunksFromString:string type:[SDLSpeechCapabilities TEXT]];
+}
+
++ (NSMutableArray<SDLTTSChunk *> *)sapiChunksFromString:(NSString *)string {
+ return [self sdl_chunksFromString:string type:[SDLSpeechCapabilities SAPI_PHONEMES]];
+}
+
++ (NSMutableArray<SDLTTSChunk *> *)lhPlusChunksFromString:(NSString *)string {
+ return [self sdl_chunksFromString:string type:[SDLSpeechCapabilities LHPLUS_PHONEMES]];
+}
+
++ (NSMutableArray<SDLTTSChunk *> *)prerecordedChunksFromString:(NSString *)string {
+ return [self sdl_chunksFromString:string type:[SDLSpeechCapabilities PRE_RECORDED]];
+}
+
++ (NSMutableArray<SDLTTSChunk *> *)silenceChunks {
+ return [self sdl_chunksFromString:nil type:[SDLSpeechCapabilities SILENCE]];
+}
+
++ (NSMutableArray<SDLTTSChunk *> *)sdl_chunksFromString:(NSString *)string type:(SDLSpeechCapabilities *)type {
+ if (string.length == 0) {
+ return nil;
+ }
+
+ return [NSMutableArray arrayWithObject:[[[self class] alloc] initWithText:string type:type]];
+}
+
- (void)setText:(NSString *)text {
if (text != nil) {
[store setObject:text forKey:NAMES_text];
diff --git a/SmartDeviceLink/SDLTTSChunkFactory.h b/SmartDeviceLink/SDLTTSChunkFactory.h
index 466ae2bae..a22c0c39b 100644
--- a/SmartDeviceLink/SDLTTSChunkFactory.h
+++ b/SmartDeviceLink/SDLTTSChunkFactory.h
@@ -7,10 +7,10 @@
@class SDLSpeechCapabilities;
-@interface SDLTTSChunkFactory : NSObject {
+__deprecated_msg("use SDLTTSChunk initializers instead") @interface SDLTTSChunkFactory : NSObject {
}
-+ (SDLTTSChunk *)buildTTSChunkForString:(NSString *)text type:(SDLSpeechCapabilities *)type;
-+ (NSMutableArray *)buildTTSChunksFromSimple:(NSString *)simple;
++ (SDLTTSChunk *)buildTTSChunkForString:(NSString *)text type:(SDLSpeechCapabilities *)type __deprecated_msg("use SDLTTSChunk's initWithText:type: instead");
++ (NSMutableArray *)buildTTSChunksFromSimple:(NSString *)simple __deprecated_msg("use SDLTTSChunk's textChunksFromString: instead");
@end
diff --git a/SmartDeviceLink/SDLTTSChunkFactory.m b/SmartDeviceLink/SDLTTSChunkFactory.m
index c27983d3a..ec5b37ec9 100644
--- a/SmartDeviceLink/SDLTTSChunkFactory.m
+++ b/SmartDeviceLink/SDLTTSChunkFactory.m
@@ -10,9 +10,7 @@
@implementation SDLTTSChunkFactory
+ (SDLTTSChunk *)buildTTSChunkForString:(NSString *)text type:(SDLSpeechCapabilities *)type {
- SDLTTSChunk *ret = [[SDLTTSChunk alloc] init];
- ret.text = text;
- ret.type = type;
+ SDLTTSChunk *ret = [[SDLTTSChunk alloc] initWithText:text type:type];
return ret;
}
diff --git a/SmartDeviceLink/SDLTurn.h b/SmartDeviceLink/SDLTurn.h
index ef2cf9ebe..f7d5c7d53 100644
--- a/SmartDeviceLink/SDLTurn.h
+++ b/SmartDeviceLink/SDLTurn.h
@@ -12,6 +12,8 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithNavigationText:(NSString *)navigationText turnIcon:(SDLImage *)icon;
+
@property (strong) NSString *navigationText;
@property (strong) SDLImage *turnIcon;
diff --git a/SmartDeviceLink/SDLTurn.m b/SmartDeviceLink/SDLTurn.m
index 875fa2e73..8d6787bd9 100644
--- a/SmartDeviceLink/SDLTurn.m
+++ b/SmartDeviceLink/SDLTurn.m
@@ -21,6 +21,18 @@
return self;
}
+- (instancetype)initWithNavigationText:(NSString *)navigationText turnIcon:(SDLImage *)icon {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.navigationText = navigationText;
+ self.turnIcon = icon;
+
+ return self;
+}
+
- (void)setNavigationText:(NSString *)navigationText {
if (navigationText != nil) {
[store setObject:navigationText forKey:NAMES_navigationText];
diff --git a/SmartDeviceLink/SDLUnsubscribeButton.h b/SmartDeviceLink/SDLUnsubscribeButton.h
index bb16f43f5..b2ed32e00 100644
--- a/SmartDeviceLink/SDLUnsubscribeButton.h
+++ b/SmartDeviceLink/SDLUnsubscribeButton.h
@@ -33,6 +33,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithButtonName:(SDLButtonName *)buttonName;
+
/**
* @abstract A name of the button to unsubscribe from
* @discussion An Enumeration value, see <i>
diff --git a/SmartDeviceLink/SDLUnsubscribeButton.m b/SmartDeviceLink/SDLUnsubscribeButton.m
index 9853fa9da..a54b30ca2 100644
--- a/SmartDeviceLink/SDLUnsubscribeButton.m
+++ b/SmartDeviceLink/SDLUnsubscribeButton.m
@@ -22,6 +22,17 @@
return self;
}
+- (instancetype)initWithButtonName:(SDLButtonName *)buttonName {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.buttonName = buttonName;
+
+ return self;
+}
+
- (void)setButtonName:(SDLButtonName *)buttonName {
if (buttonName != nil) {
[parameters setObject:buttonName forKey:NAMES_buttonName];
diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleData.h b/SmartDeviceLink/SDLUnsubscribeVehicleData.h
index 389173256..47cd85322 100644
--- a/SmartDeviceLink/SDLUnsubscribeVehicleData.h
+++ b/SmartDeviceLink/SDLUnsubscribeVehicleData.h
@@ -31,6 +31,8 @@
*/
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus;
+
/**
* @abstract A boolean value. If true, unsubscribes Gps data
*/
diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleData.m b/SmartDeviceLink/SDLUnsubscribeVehicleData.m
index 11aa044e1..b9e89feeb 100644
--- a/SmartDeviceLink/SDLUnsubscribeVehicleData.m
+++ b/SmartDeviceLink/SDLUnsubscribeVehicleData.m
@@ -20,6 +20,40 @@
return self;
}
+- (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.accPedalPosition = @(accelerationPedalPosition);
+ self.airbagStatus = @(airbagStatus);
+ self.beltStatus = @(beltStatus);
+ self.bodyInformation = @(bodyInformation);
+ self.clusterModeStatus = @(clusterModeStatus);
+ self.deviceStatus = @(deviceStatus);
+ self.driverBraking = @(driverBraking);
+ self.eCallInfo = @(eCallInfo);
+ self.emergencyEvent = @(emergencyEvent);
+ self.engineTorque = @(engineTorque);
+ self.externalTemperature = @(externalTemperature);
+ self.fuelLevel = @(fuelLevel);
+ self.fuelLevel_State = @(fuelLevelState);
+ self.myKey = @(myKey);
+ self.odometer = @(odometer);
+ self.gps = @(gps);
+ self.headLampStatus = @(headLampStatus);
+ self.instantFuelConsumption = @(instantFuelConsumption);
+ self.prndl = @(prndl);
+ self.rpm = @(rpm);
+ self.speed = @(speed);
+ self.steeringWheelAngle = @(steeringWheelAngle);
+ self.tirePressure = @(tirePressure);
+ self.wiperStatus = @(wiperStatus);
+
+ return self;
+}
+
- (void)setGps:(NSNumber *)gps {
if (gps != nil) {
[parameters setObject:gps forKey:NAMES_gps];
diff --git a/SmartDeviceLink/SDLUpdateTurnList.h b/SmartDeviceLink/SDLUpdateTurnList.h
index d5d9daf6a..17f507ffa 100644
--- a/SmartDeviceLink/SDLUpdateTurnList.h
+++ b/SmartDeviceLink/SDLUpdateTurnList.h
@@ -4,6 +4,9 @@
#import "SDLRPCRequest.h"
+@class SDLSoftButton;
+@class SDLTurn;
+
/** Updates the list of next maneuvers, which can be requested by the user pressing the softbutton<br>
* “Turns” on the Navigation base screen. Three softbuttons are predefined by the system: Up, Down, Close.
*<p>
@@ -15,6 +18,8 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithTurnList:(NSArray<SDLTurn *> *)turnList softButtons:(NSArray<SDLSoftButton *> *)softButtons;
+
/**
* Optional, SDLTurn, 1 - 100 entries
*/
diff --git a/SmartDeviceLink/SDLUpdateTurnList.m b/SmartDeviceLink/SDLUpdateTurnList.m
index 7063c9c29..65f37f60a 100644
--- a/SmartDeviceLink/SDLUpdateTurnList.m
+++ b/SmartDeviceLink/SDLUpdateTurnList.m
@@ -22,6 +22,18 @@
return self;
}
+- (instancetype)initWithTurnList:(NSArray *)turnList softButtons:(NSArray<SDLSoftButton *> *)softButtons {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.turnList = [turnList mutableCopy];
+ self.softButtons = [softButtons mutableCopy];
+
+ return self;
+}
+
- (void)setTurnList:(NSMutableArray *)turnList {
if (turnList != nil) {
[parameters setObject:turnList forKey:NAMES_turnList];
diff --git a/SmartDeviceLink/SDLUploadFileOperation.h b/SmartDeviceLink/SDLUploadFileOperation.h
new file mode 100644
index 000000000..5b3d55f24
--- /dev/null
+++ b/SmartDeviceLink/SDLUploadFileOperation.h
@@ -0,0 +1,35 @@
+//
+// SDLUploadFileOperation.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 5/11/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLAsynchronousOperation.h"
+#import "SDLFileManagerConstants.h"
+
+@protocol SDLConnectionManagerType;
+@class SDLFileWrapper;
+
+
+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.
+ *
+ * @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
+ *
+ * @return An instance of SDLUploadFilesOperation
+ */
+- (instancetype)initWithFile:(SDLFileWrapper *)file connectionManager:(id<SDLConnectionManagerType>)connectionManager;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLink/SDLUploadFileOperation.m b/SmartDeviceLink/SDLUploadFileOperation.m
new file mode 100644
index 000000000..a88b9a0c2
--- /dev/null
+++ b/SmartDeviceLink/SDLUploadFileOperation.m
@@ -0,0 +1,175 @@
+//
+// SDLUploadFileOperation.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 5/11/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLUploadFileOperation.h"
+
+#import "SDLConnectionManagerType.h"
+#import "SDLFile.h"
+#import "SDLFileWrapper.h"
+#import "SDLGlobals.h"
+#import "SDLPutFile.h"
+#import "SDLPutFileResponse.h"
+#import "SDLRPCResponse.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+#pragma mark - SDLUploadFileOperation
+
+@interface SDLUploadFileOperation ()
+
+@property (strong, nonatomic) SDLFileWrapper *fileWrapper;
+@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+
+@end
+
+
+@implementation SDLUploadFileOperation {
+ BOOL executing;
+ BOOL finished;
+}
+
+- (instancetype)initWithFile:(SDLFileWrapper *)file connectionManager:(id<SDLConnectionManagerType>)connectionManager {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ executing = NO;
+ finished = NO;
+
+ _fileWrapper = file;
+ _connectionManager = connectionManager;
+
+ return self;
+}
+
+- (void)start {
+ [super start];
+
+ [self sdl_sendPutFiles:[self.class sdl_splitFile:self.fileWrapper.file mtuSize:[SDLGlobals globals].maxMTUSize] withCompletion:self.fileWrapper.completionHandler];
+}
+
+- (void)sdl_sendPutFiles:(NSArray<SDLPutFile *> *)putFiles withCompletion:(SDLFileManagerUploadCompletionHandler)completion {
+ __block BOOL stop = NO;
+ __block NSError *streamError = nil;
+ __block NSUInteger bytesAvailable = 0;
+ __block NSInteger highestCorrelationIDReceived = -1;
+
+ dispatch_group_t putFileGroup = dispatch_group_create();
+ dispatch_group_enter(putFileGroup);
+
+ // When the putfiles all complete, run this block
+ __weak typeof(self) weakself = self;
+ dispatch_group_notify(putFileGroup, dispatch_get_main_queue(), ^{
+ if (streamError != nil || stop) {
+ completion(NO, bytesAvailable, streamError);
+ } else {
+ completion(YES, bytesAvailable, nil);
+ }
+
+ [weakself finishOperation];
+ });
+
+ for (SDLPutFile *putFile in putFiles) {
+ dispatch_group_enter(putFileGroup);
+ __weak typeof(self) weakself = self;
+ [self.connectionManager sendManagerRequest:putFile
+ withResponseHandler:^(__kindof SDLRPCRequest *_Nullable request, __kindof SDLRPCResponse *_Nullable response, NSError *_Nullable error) {
+ typeof(weakself) strongself = weakself;
+ // If we've already encountered an error, then just abort
+ // 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) {
+ stop = YES;
+ }
+
+ if (stop) {
+ dispatch_group_leave(putFileGroup);
+ BLOCK_RETURN;
+ }
+
+ // If we encounted an error, abort in the future and call the completion handler
+ if (error != nil || response == nil || ![response.success boolValue]) {
+ stop = YES;
+ streamError = error;
+
+ if (completion != nil) {
+ completion(NO, 0, error);
+ }
+
+ dispatch_group_leave(putFileGroup);
+ BLOCK_RETURN;
+ }
+
+ // If we haven't encounted an error
+ SDLPutFileResponse *putFileResponse = (SDLPutFileResponse *)response;
+
+ // We need to do this to make sure our bytesAvailable is accurate
+ if ([request.correlationID integerValue] > highestCorrelationIDReceived) {
+ highestCorrelationIDReceived = [request.correlationID integerValue];
+ bytesAvailable = [putFileResponse.spaceAvailable unsignedIntegerValue];
+ }
+
+ dispatch_group_leave(putFileGroup);
+ }];
+ }
+
+ dispatch_group_leave(putFileGroup);
+}
+
++ (NSArray<SDLPutFile *> *)sdl_splitFile:(SDLFile *)file mtuSize:(NSUInteger)mtuSize {
+ NSData *fileData = [file.data copy];
+ NSUInteger currentOffset = 0;
+ NSMutableArray<SDLPutFile *> *putFiles = [NSMutableArray array];
+
+ // http://stackoverflow.com/a/503201 Make sure we get the exact number of packets we need
+ for (int i = 0; i < (((fileData.length - 1) / mtuSize) + 1); i++) {
+ SDLPutFile *putFile = [[SDLPutFile alloc] initWithFileName:file.name fileType:file.fileType persistentFile:file.isPersistent];
+ putFile.offset = @(currentOffset);
+
+ // Set the length putfile based on the offset
+ if (currentOffset == 0) {
+ // If the offset is 0, the putfile expects to have the full file length within it
+ putFile.length = @(fileData.length);
+ } else if ((fileData.length - currentOffset) < mtuSize) {
+ // The file length remaining is less than our total MTU size, so use the file length remaining
+ putFile.length = @(fileData.length - currentOffset);
+ } else {
+ // The file length remaining is greater than our total MTU size, and the offset is not zero, we will fill the packet with our max MTU size
+ putFile.length = @(mtuSize);
+ }
+
+ // Place the data and set the new offset
+ if (currentOffset == 0 && (mtuSize < [putFile.length unsignedIntegerValue])) {
+ putFile.bulkData = [fileData subdataWithRange:NSMakeRange(currentOffset, mtuSize)];
+ currentOffset = mtuSize;
+ } else {
+ putFile.bulkData = [fileData subdataWithRange:NSMakeRange(currentOffset, [putFile.length unsignedIntegerValue])];
+ currentOffset = [putFile.length unsignedIntegerValue];
+ }
+
+ [putFiles addObject:putFile];
+ }
+
+ return putFiles;
+}
+
+
+#pragma mark Property Overrides
+
+- (nullable NSString *)name {
+ return self.fileWrapper.file.name;
+}
+
+- (NSOperationQueuePriority)queuePriority {
+ return NSOperationQueuePriorityNormal;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLV2ProtocolHeader.m b/SmartDeviceLink/SDLV2ProtocolHeader.m
index 649d30ee9..7cc1297d9 100644
--- a/SmartDeviceLink/SDLV2ProtocolHeader.m
+++ b/SmartDeviceLink/SDLV2ProtocolHeader.m
@@ -87,7 +87,7 @@ const int V2PROTOCOL_HEADERSIZE = 12;
- (NSString *)description {
NSString *frameTypeString = nil;
if (self.frameType >= 0 && self.frameType <= 3) {
- NSArray *frameTypeNames = @[ @"Control", @"Single", @"First", @"Consecutive" ];
+ NSArray *frameTypeNames = @[@"Control", @"Single", @"First", @"Consecutive"];
frameTypeString = frameTypeNames[self.frameType];
}
@@ -95,7 +95,7 @@ const int V2PROTOCOL_HEADERSIZE = 12;
NSString *frameDataString = nil;
if (self.frameType == SDLFrameType_Control) {
if (self.frameData >= 0 && self.frameData <= 5) {
- NSArray *controlFrameDataNames = @[ @"Heartbeat", @"StartSession", @"StartSessionACK", @"StartSessionNACK", @"EndSession", @"EndSessionNACK" ];
+ NSArray *controlFrameDataNames = @[@"Heartbeat", @"StartSession", @"StartSessionACK", @"StartSessionNACK", @"EndSession", @"EndSessionNACK"];
frameDataString = controlFrameDataNames[self.frameData];
} else {
frameDataString = @"Reserved";
diff --git a/SmartDeviceLink/SDLV2ProtocolMessage.m b/SmartDeviceLink/SDLV2ProtocolMessage.m
index 683c10335..5b033b7f3 100644
--- a/SmartDeviceLink/SDLV2ProtocolMessage.m
+++ b/SmartDeviceLink/SDLV2ProtocolMessage.m
@@ -47,7 +47,7 @@
// Store it in the containing dictionary
UInt8 rpcType = rpcPayload.rpcType;
- NSArray *rpcTypeNames = @[ NAMES_request, NAMES_response, NAMES_notification ];
+ NSArray *rpcTypeNames = @[NAMES_request, NAMES_response, NAMES_notification];
[rpcMessageAsDictionary setObject:innerDictionary forKey:rpcTypeNames[rpcType]];
// The bulk data also goes in the dictionary
diff --git a/SmartDeviceLink/SDLViewControllerPresentable.h b/SmartDeviceLink/SDLViewControllerPresentable.h
new file mode 100644
index 000000000..76ee668ef
--- /dev/null
+++ b/SmartDeviceLink/SDLViewControllerPresentable.h
@@ -0,0 +1,22 @@
+//
+// SDLDialogPresenting.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/15/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+/**
+ * A protocol used to tell a view controller to present another view controller. This makes testing of modal VCs' presentation easier.
+ */
+@protocol SDLViewControllerPresentable <NSObject>
+
+@property (strong, nonatomic) UIViewController *viewController;
+@property (assign, nonatomic, readonly) BOOL presented;
+
+- (void)present;
+- (void)dismiss;
+
+@end
diff --git a/SmartDeviceLink/SDLVrHelpItem.h b/SmartDeviceLink/SDLVrHelpItem.h
index a46c1301b..514d3e29f 100644
--- a/SmartDeviceLink/SDLVrHelpItem.h
+++ b/SmartDeviceLink/SDLVrHelpItem.h
@@ -12,6 +12,10 @@
- (instancetype)init;
- (instancetype)initWithDictionary:(NSMutableDictionary *)dict;
+- (instancetype)initWithText:(NSString *)text image:(SDLImage *)image;
+
+- (instancetype)initWithText:(NSString *)text image:(SDLImage *)image position:(UInt8)position;
+
@property (strong) NSString *text;
@property (strong) SDLImage *image;
@property (strong) NSNumber *position;
diff --git a/SmartDeviceLink/SDLVrHelpItem.m b/SmartDeviceLink/SDLVrHelpItem.m
index 4ed2c1409..97dc86df4 100644
--- a/SmartDeviceLink/SDLVrHelpItem.m
+++ b/SmartDeviceLink/SDLVrHelpItem.m
@@ -21,6 +21,29 @@
return self;
}
+- (instancetype)initWithText:(NSString *)text image:(SDLImage *)image position:(UInt8)position {
+ self = [self initWithText:text image:image];
+ if (!self) {
+ return nil;
+ }
+
+ self.position = @(position);
+
+ return self;
+}
+
+- (instancetype)initWithText:(NSString *)text image:(SDLImage *)image {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.text = text;
+ self.image = image;
+
+ return self;
+}
+
- (void)setText:(NSString *)text {
if (text != nil) {
[store setObject:text forKey:NAMES_text];
diff --git a/SmartDeviceLink/SmartDeviceLink.h b/SmartDeviceLink/SmartDeviceLink.h
index 18bb0f8de..176bee596 100644
--- a/SmartDeviceLink/SmartDeviceLink.h
+++ b/SmartDeviceLink/SmartDeviceLink.h
@@ -15,12 +15,12 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
/***** Proxy *****/
#import "SDLProxy.h"
#import "SDLProxyFactory.h"
-#import "SDLProxyFactory.h"
#import "SDLProxyListener.h"
#import "SDLSecurityType.h"
#import "SDLStreamingMediaManager.h"
#import "SDLTTSChunkFactory.h"
#import "SDLTouchManager.h"
+#import "SDLTouchManagerDelegate.h"
/***** Debug *****/
#import "SDLConsoleController.h"
@@ -39,7 +39,6 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLAbstractProtocol.h"
#import "SDLProtocol.h"
#import "SDLProtocolListener.h"
-#import "SDLTouchManagerDelegate.h"
// Header
#import "SDLProtocolHeader.h"
@@ -278,3 +277,36 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLVehicleDataType.h"
#import "SDLWarningLightStatus.h"
#import "SDLWiperStatus.h"
+
+// Developer API
+// Configurations
+#import "SDLConfiguration.h"
+#import "SDLLifecycleConfiguration.h"
+#import "SDLLockScreenConfiguration.h"
+
+// Files
+#import "SDLArtwork.h"
+#import "SDLFile.h"
+#import "SDLFileManager.h"
+#import "SDLFileManagerConstants.h"
+
+// Lockscreen
+#import "SDLLockScreenViewController.h"
+
+// Lifecycle
+#import "SDLManager.h"
+#import "SDLManagerDelegate.h"
+
+// Permissions
+#import "SDLPermissionConstants.h"
+#import "SDLPermissionManager.h"
+
+// Utilities
+#import "NSNumber+NumberType.h"
+#import "SDLErrorConstants.h"
+#import "SDLNotificationConstants.h"
+#import "SDLRequestHandler.h"
+
+// Notifications
+#import "SDLRPCNotificationNotification.h"
+#import "SDLRPCResponseNotification.h"
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black.png
new file mode 100644
index 000000000..68f1c3ca7
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black@2x.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black@2x.png
new file mode 100644
index 000000000..85fbc3446
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black@2x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black@3x.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black@3x.png
new file mode 100644
index 000000000..af14aa8bb
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/black/lock_arrow_down_black@3x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white.png
new file mode 100644
index 000000000..07e620d05
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white@2x.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white@2x.png
new file mode 100644
index 000000000..57fa8120f
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white@2x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white@3x.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white@3x.png
new file mode 100644
index 000000000..b354c1a13
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_down/white/lock_arrow_down_white@3x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black.png
new file mode 100644
index 000000000..ecc048331
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black@2x.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black@2x.png
new file mode 100644
index 000000000..fa38a0772
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black@2x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black@3x.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black@3x.png
new file mode 100644
index 000000000..b59bda372
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/black/lock_arrow_up_black@3x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white.png
new file mode 100644
index 000000000..bb0662fe5
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white@2x.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white@2x.png
new file mode 100644
index 000000000..f45e6b299
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white@2x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white@3x.png b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white@3x.png
new file mode 100644
index 000000000..d30fc404c
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/lock_arrow_up/white/lock_arrow_up_white@3x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black.png b/SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black.png
new file mode 100644
index 000000000..68cf3a52d
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black@2x.png b/SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black@2x.png
new file mode 100644
index 000000000..1427721a7
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black@2x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black@3x.png b/SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black@3x.png
new file mode 100644
index 000000000..dfe0ab3f8
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/sdl_logo/black/sdl_logo_black@3x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white.png b/SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white.png
new file mode 100644
index 000000000..1c35ef9b3
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white@2x.png b/SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white@2x.png
new file mode 100644
index 000000000..b7d0bd92a
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white@2x.png
Binary files differ
diff --git a/SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white@3x.png b/SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white@3x.png
new file mode 100644
index 000000000..b8b9ef757
--- /dev/null
+++ b/SmartDeviceLink/iOS 7 Assets/sdl_logo/white/sdl_logo_white@3x.png
Binary files differ
diff --git a/SmartDeviceLinkTests/Assets/TestLockScreenAppIcon.png b/SmartDeviceLinkTests/Assets/TestLockScreenAppIcon.png
new file mode 100644
index 000000000..f38b8a0d8
--- /dev/null
+++ b/SmartDeviceLinkTests/Assets/TestLockScreenAppIcon.png
Binary files differ
diff --git a/SmartDeviceLinkTests/Assets/testFileJSON.json b/SmartDeviceLinkTests/Assets/testFileJSON.json
new file mode 100644
index 000000000..3d3340762
--- /dev/null
+++ b/SmartDeviceLinkTests/Assets/testFileJSON.json
@@ -0,0 +1,4 @@
+{
+ "test": "hello",
+ "test2": 2
+} \ No newline at end of file
diff --git a/SmartDeviceLinkTests/Assets/testImageBMP.bmp b/SmartDeviceLinkTests/Assets/testImageBMP.bmp
new file mode 100644
index 000000000..d05b724d0
--- /dev/null
+++ b/SmartDeviceLinkTests/Assets/testImageBMP.bmp
Binary files differ
diff --git a/SmartDeviceLinkTests/Assets/testImageJPEG.jpeg b/SmartDeviceLinkTests/Assets/testImageJPEG.jpeg
new file mode 100644
index 000000000..8a9702ede
--- /dev/null
+++ b/SmartDeviceLinkTests/Assets/testImageJPEG.jpeg
Binary files differ
diff --git a/SmartDeviceLinkTests/Assets/testImageJPG.jpg b/SmartDeviceLinkTests/Assets/testImageJPG.jpg
new file mode 100644
index 000000000..8a9702ede
--- /dev/null
+++ b/SmartDeviceLinkTests/Assets/testImageJPG.jpg
Binary files differ
diff --git a/SmartDeviceLinkTests/Assets/testImagePNG.png b/SmartDeviceLinkTests/Assets/testImagePNG.png
new file mode 100644
index 000000000..017399a8e
--- /dev/null
+++ b/SmartDeviceLinkTests/Assets/testImagePNG.png
Binary files differ
diff --git a/SmartDeviceLinkTests/Assets/testImageTIFF.tiff b/SmartDeviceLinkTests/Assets/testImageTIFF.tiff
new file mode 100644
index 000000000..af249fdc2
--- /dev/null
+++ b/SmartDeviceLinkTests/Assets/testImageTIFF.tiff
Binary files differ
diff --git a/SmartDeviceLinkTests/DevAPISpecs/NSMapTable+SubscriptingSpec.m b/SmartDeviceLinkTests/DevAPISpecs/NSMapTable+SubscriptingSpec.m
new file mode 100644
index 000000000..b88a2345d
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/NSMapTable+SubscriptingSpec.m
@@ -0,0 +1,32 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "NSMapTable+Subscripting.h"
+
+QuickSpecBegin(NSMapTable_SubscriptingSpec)
+
+describe(@"A map table with the subscripting category imported", ^{
+ __block NSMapTable *testMapTable = nil;
+
+ beforeEach(^{
+ testMapTable = [NSMapTable strongToStrongObjectsMapTable];
+ });
+
+ describe(@"adding an object", ^{
+ __block NSString *testKey = nil;
+ __block NSString *testObject = nil;
+
+ beforeEach(^{
+ testKey = @"Key";
+ testObject = @"Object";
+
+ testMapTable[testKey] = testObject;
+ });
+
+ it(@"should properly add the key and object", ^{
+ expect(testMapTable[testKey]).to(equal(testObject));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLArtworkSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLArtworkSpec.m
new file mode 100644
index 000000000..9c0dc8c1a
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLArtworkSpec.m
@@ -0,0 +1,93 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLArtwork.h"
+#import "SDLFileType.h"
+
+QuickSpecBegin(SDLArtworkSpec)
+
+describe(@"SDLArtwork", ^{
+ __block SDLArtwork *testArtwork = nil;
+
+ describe(@"when created", ^{
+ context(@"As a PNG", ^{
+ __block NSString *testArtworkName = nil;
+ __block UIImage *testImage = nil;
+ __block SDLArtworkImageFormat testFormat = NSNotFound;
+
+ beforeEach(^{
+ testImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
+ testArtworkName = @"Test Artwork";
+ testFormat = SDLArtworkImageFormatPNG;
+
+ testArtwork = [[SDLArtwork alloc] initWithImage:testImage name:testArtworkName persistent:NO asImageFormat:testFormat];
+ });
+
+ it(@"should correctly store image data", ^{
+ expect(testArtwork.data).to(equal(UIImagePNGRepresentation(testImage)));
+ });
+
+ it(@"should correctly store name", ^{
+ expect(testArtwork.name).to(equal(testArtworkName));
+ });
+
+ it(@"should correctly store format", ^{
+ expect(testArtwork.fileType).to(equal([SDLFileType GRAPHIC_PNG]));
+ });
+
+ it(@"should correctly store persistence", ^{
+ expect(@(testArtwork.persistent)).to(equal(@NO));
+ });
+ });
+
+ context(@"As a JPG", ^{
+ __block NSString *testArtworkName = nil;
+ __block UIImage *testImage = nil;
+ __block SDLArtworkImageFormat testFormat = NSNotFound;
+
+ beforeEach(^{
+ testImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
+ testArtworkName = @"Test Artwork";
+ testFormat = SDLArtworkImageFormatJPG;
+
+ testArtwork = [[SDLArtwork alloc] initWithImage:testImage name:testArtworkName persistent:NO asImageFormat:testFormat];
+ });
+
+ it(@"should correctly store image data", ^{
+ expect(testArtwork.data).to(equal(UIImageJPEGRepresentation(testImage, 0.85)));
+ });
+
+ it(@"should correctly store name", ^{
+ expect(testArtwork.name).to(equal(testArtworkName));
+ });
+
+ it(@"should correctly store format", ^{
+ expect(testArtwork.fileType).to(equal([SDLFileType GRAPHIC_JPEG]));
+ });
+
+ it(@"should correctly store persistence", ^{
+ expect(@(testArtwork.persistent)).to(equal(@NO));
+ });
+ });
+
+ describe(@"to be persistent", ^{
+ __block NSString *testArtworkName = nil;
+ __block UIImage *testImage = nil;
+ __block SDLArtworkImageFormat testFormat = NSNotFound;
+
+ beforeEach(^{
+ testImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
+ testArtworkName = @"Test Artwork";
+ testFormat = SDLArtworkImageFormatPNG;
+
+ testArtwork = [[SDLArtwork alloc] initWithImage:testImage name:testArtworkName persistent:YES asImageFormat:testFormat];
+ });
+
+ it(@"is persistent", ^{
+ expect(@(testArtwork.persistent)).to(equal(@YES));
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLConfigurationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLConfigurationSpec.m
new file mode 100644
index 000000000..9d86dfbc2
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLConfigurationSpec.m
@@ -0,0 +1,60 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLConfiguration.h"
+#import "SDLLifecycleConfiguration.h"
+#import "SDLLockScreenConfiguration.h"
+
+QuickSpecBegin(SDLConfigurationSpec)
+
+describe(@"a configuration", ^{
+ __block SDLConfiguration *testConfig = nil;
+
+ context(@"created with a custom lifecycle and default lockscreen config", ^{
+ __block SDLLifecycleConfiguration *someLifecycleConfig = nil;
+ __block NSString *someAppName = nil;
+ __block NSString *someAppId = nil;
+
+ beforeEach(^{
+ someAppName = @"some name";
+ someAppId = @"some id";
+ someLifecycleConfig = [SDLLifecycleConfiguration defaultConfigurationWithAppName:someAppName appId:someAppId];
+
+ testConfig = [SDLConfiguration configurationWithLifecycle:someLifecycleConfig lockScreen:[SDLLockScreenConfiguration enabledConfiguration]];
+ });
+
+ it(@"should contain the correct configs", ^{
+ expect(testConfig.lifecycleConfig).to(equal(someLifecycleConfig));
+ expect(@(testConfig.lockScreenConfig.enableAutomaticLockScreen)).to(equal(@YES));
+ });
+ });
+
+ context(@"created with a custom lifecycle and lockscreen config", ^{
+ __block SDLLifecycleConfiguration *someLifecycleConfig = nil;
+ __block SDLLockScreenConfiguration *someLockscreenConfig = nil;
+
+ __block NSString *someAppName = nil;
+ __block NSString *someAppId = nil;
+ __block UIColor *someBackgroundColor = nil;
+ __block UIImage *someImage = nil;
+
+ beforeEach(^{
+ someAppName = @"some name";
+ someAppId = @"some id";
+ someBackgroundColor = [UIColor blueColor];
+ someImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
+
+ someLifecycleConfig = [SDLLifecycleConfiguration defaultConfigurationWithAppName:someAppName appId:someAppId];
+ someLockscreenConfig = [SDLLockScreenConfiguration enabledConfigurationWithAppIcon:someImage backgroundColor:someBackgroundColor];
+
+ testConfig = [SDLConfiguration configurationWithLifecycle:someLifecycleConfig lockScreen:someLockscreenConfig];
+ });
+
+ it(@"should contain the correct configs", ^{
+ expect(testConfig.lifecycleConfig).to(equal(someLifecycleConfig));
+ expect(testConfig.lockScreenConfig).to(equal(someLockscreenConfig));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteFileOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteFileOperationSpec.m
new file mode 100644
index 000000000..a86796abe
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLDeleteFileOperationSpec.m
@@ -0,0 +1,100 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLDeleteFile.h"
+#import "SDLDeleteFileOperation.h"
+#import "SDLDeleteFileResponse.h"
+#import "SDLError.h"
+#import "TestConnectionManager.h"
+
+QuickSpecBegin(SDLDeleteFileOperationSpec)
+
+describe(@"Delete File Operation", ^{
+ __block TestConnectionManager *testConnectionManager = nil;
+ __block SDLDeleteFileOperation *testOperation = nil;
+
+ __block NSString *deleteFileName = nil;
+ __block BOOL successResult = NO;
+ __block NSUInteger bytesAvailableResult = NO;
+ __block NSError *errorResult = nil;
+
+ beforeEach(^{
+ deleteFileName = @"Some File";
+ testConnectionManager = [[TestConnectionManager alloc] init];
+
+ testOperation = [[SDLDeleteFileOperation alloc] initWithFileName:deleteFileName connectionManager:testConnectionManager completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ successResult = success;
+ bytesAvailableResult = bytesAvailable;
+ errorResult = error;
+ }];
+ });
+
+ it(@"should have a priority of 'very high'", ^{
+ expect(@(testOperation.queuePriority)).to(equal(@(NSOperationQueuePriorityVeryHigh)));
+ });
+
+ 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;
+
+ 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));
+ });
+ });
+
+ 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));
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.h b/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.h
new file mode 100644
index 000000000..1f71cffa8
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.h
@@ -0,0 +1,18 @@
+//
+// SDLFakeViewControllerPresenter.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/18/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLViewControllerPresentable.h"
+
+@interface SDLFakeViewControllerPresenter : NSObject <SDLViewControllerPresentable>
+
+@property (strong, nonatomic) UIViewController *viewController;
+@property (assign, nonatomic, readonly) BOOL presented;
+
+@end
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.m b/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.m
new file mode 100644
index 000000000..0630fd9f7
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFakeViewControllerPresenter.m
@@ -0,0 +1,33 @@
+//
+// SDLFakeViewControllerPresenter.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/18/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "SDLFakeViewControllerPresenter.h"
+
+
+@interface SDLFakeViewControllerPresenter ()
+
+@property (assign, nonatomic, readwrite) BOOL presented;
+
+@end
+
+
+@implementation SDLFakeViewControllerPresenter
+
+- (void)present {
+ if (!self.viewController) { return; }
+
+ _presented = YES;
+}
+
+- (void)dismiss {
+ if (!self.viewController) { return; }
+
+ _presented = NO;
+}
+
+@end
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
new file mode 100644
index 000000000..8b3d3d7db
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
@@ -0,0 +1,416 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLDeleteFileResponse.h"
+#import "SDLError.h"
+#import "SDLFile.h"
+#import "SDLFileManager.h"
+#import "SDLFileType.h"
+#import "SDLListFiles.h"
+#import "SDLListFilesOperation.h"
+#import "SDLListFilesResponse.h"
+#import "SDLNotificationConstants.h"
+#import "SDLPutFile.h"
+#import "SDLPutFileResponse.h"
+#import "SDLRPCResponse.h"
+#import "TestConnectionManager.h"
+
+
+typedef NSString SDLFileManagerState;
+SDLFileManagerState *const SDLFileManagerStateShutdown = @"Shutdown";
+SDLFileManagerState *const SDLFileManagerStateFetchingInitialList = @"FetchingInitialList";
+SDLFileManagerState *const SDLFileManagerStateReady = @"Ready";
+
+
+@interface SDLFileManager ()
+
+@property (strong, nonatomic) NSOperationQueue *transactionQueue;
+
+@end
+
+
+QuickSpecBegin(SDLFileManagerSpec)
+
+describe(@"SDLFileManager", ^{
+ __block TestConnectionManager *testConnectionManager = nil;
+ __block SDLFileManager *testFileManager = nil;
+ __block NSUInteger initialSpaceAvailable = 250;
+
+ beforeEach(^{
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ testFileManager = [[SDLFileManager alloc] initWithConnectionManager:testConnectionManager];
+ testFileManager.suspended = YES;
+ });
+
+ describe(@"before starting", ^{
+ it(@"should be in the shutdown state", ^{
+ expect(testFileManager.currentState).to(match(SDLFileManagerStateShutdown));
+ });
+
+ it(@"bytesAvailable should be 0", ^{
+ expect(@(testFileManager.bytesAvailable)).to(equal(@0));
+ });
+
+ it(@"remoteFileNames should be empty", ^{
+ expect(testFileManager.remoteFileNames).to(beEmpty());
+ });
+
+ it(@"should have no pending operations", ^{
+ expect(testFileManager.pendingTransactions).to(beEmpty());
+ });
+ });
+
+ describe(@"after receiving a start message", ^{
+ __block BOOL startupSuccess = NO;
+ __block NSError *startupError = nil;
+
+ beforeEach(^{
+ [testFileManager startWithCompletionHandler:^(BOOL success, NSError * _Nullable error) {
+ startupSuccess = success;
+ startupError = error;
+ }];
+
+ testFileManager.suspended = NO;
+
+ [NSThread sleepForTimeInterval:0.1];
+ });
+
+ it(@"should have queued a ListFiles request", ^{
+ expect(testFileManager.pendingTransactions).to(haveCount(@1));
+ expect(testFileManager.pendingTransactions.firstObject).to(beAnInstanceOf([SDLListFilesOperation class]));
+ });
+
+ it(@"should be in the fetching initial list state", ^{
+ expect(testFileManager.currentState).to(match(SDLFileManagerStateFetchingInitialList));
+ });
+
+ describe(@"after receiving a ListFiles response", ^{
+ __block SDLListFilesResponse *testListFilesResponse = nil;
+ __block NSSet<NSString *> *testInitialFileNames = nil;
+
+ beforeEach(^{
+ testInitialFileNames = [NSSet setWithArray:@[@"testFile1", @"testFile2", @"testFile3"]];
+
+ testListFilesResponse = [[SDLListFilesResponse alloc] init];
+ testListFilesResponse.success = @YES;
+ testListFilesResponse.spaceAvailable = @(initialSpaceAvailable);
+ testListFilesResponse.filenames = [NSMutableArray arrayWithArray:[testInitialFileNames allObjects]];
+
+ [testConnectionManager respondToLastRequestWithResponse:testListFilesResponse];
+ });
+
+ it(@"the file manager should be in the correct state", ^{
+ expect(testFileManager.currentState).toEventually(match(SDLFileManagerStateReady));
+ expect(testFileManager.remoteFileNames).toEventually(equal(testInitialFileNames));
+ expect(@(testFileManager.bytesAvailable)).toEventually(equal(@(initialSpaceAvailable)));
+ });
+
+ describe(@"deleting a file", ^{
+ __block BOOL completionSuccess = NO;
+ __block NSUInteger completionBytesAvailable = 0;
+ __block NSError *completionError = nil;
+
+ context(@"when the file is unknown", ^{
+ beforeEach(^{
+ NSString *someUnknownFileName = @"Some Unknown File Name";
+ [testFileManager deleteRemoteFileWithName:someUnknownFileName completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ completionSuccess = success;
+ completionBytesAvailable = bytesAvailable;
+ completionError = error;
+ }];
+
+ [NSThread sleepForTimeInterval:0.1];
+ });
+
+ it(@"should return the correct data", ^{
+ expect(@(completionSuccess)).toEventually(equal(@NO));
+ expect(@(completionBytesAvailable)).toEventually(equal(@250));
+ expect(completionError).toEventually(equal([NSError sdl_fileManager_noKnownFileError]));
+ });
+
+ it(@"should not have deleted any files in the file manager", ^{
+ expect(testFileManager.remoteFileNames).toEventually(haveCount(@(testInitialFileNames.count)));
+ });
+ });
+
+ context(@"when the file is known", ^{
+ __block NSUInteger newSpaceAvailable = 600;
+ __block NSString *someKnownFileName = nil;
+ __block BOOL completionSuccess = NO;
+ __block NSUInteger completionBytesAvailable = 0;
+ __block NSError *completionError = nil;
+
+ beforeEach(^{
+ someKnownFileName = [testInitialFileNames anyObject];
+ [testFileManager deleteRemoteFileWithName:someKnownFileName completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ completionSuccess = success;
+ completionBytesAvailable = bytesAvailable;
+ completionError = error;
+ }];
+
+ SDLDeleteFileResponse *deleteResponse = [[SDLDeleteFileResponse alloc] init];
+ deleteResponse.success = @YES;
+ deleteResponse.spaceAvailable = @(newSpaceAvailable);
+
+ [NSThread sleepForTimeInterval:0.1];
+
+ [testConnectionManager respondToLastRequestWithResponse:deleteResponse];
+ });
+
+ it(@"should return the correct data", ^{
+ expect(@(completionSuccess)).to(equal(@YES));
+ expect(@(completionBytesAvailable)).to(equal(@(newSpaceAvailable)));
+ expect(@(testFileManager.bytesAvailable)).to(equal(@(newSpaceAvailable)));
+ expect(completionError).to(beNil());
+ });
+
+ it(@"should have removed the file from the file manager", ^{
+ expect(testFileManager.remoteFileNames).toNot(contain(someKnownFileName));
+ });
+ });
+ });
+
+ describe(@"uploading a new file", ^{
+ __block NSString *testFileName = nil;
+ __block SDLFile *testUploadFile = nil;
+ __block BOOL completionSuccess = NO;
+ __block NSUInteger completionBytesAvailable = 0;
+ __block NSError *completionError = nil;
+
+ __block SDLPutFile *sentPutFile = nil;
+ __block NSData *testFileData = nil;
+
+ context(@"when there is a remote file named the same thing", ^{
+ beforeEach(^{
+ testFileName = [testInitialFileNames anyObject];
+ testFileData = [@"someData" dataUsingEncoding:NSUTF8StringEncoding];
+ testUploadFile = [SDLFile fileWithData:testFileData name:testFileName fileExtension:@"bin"];
+ });
+
+ context(@"when the file's overwrite property is YES", ^{
+ beforeEach(^{
+ testUploadFile.overwrite = YES;
+
+ [testFileManager uploadFile:testUploadFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ completionSuccess = success;
+ completionBytesAvailable = bytesAvailable;
+ completionError = error;
+ }];
+
+ [NSThread sleepForTimeInterval:0.1];
+
+ sentPutFile = testConnectionManager.receivedRequests.lastObject;
+ });
+
+ it(@"should set the file manager state to be waiting", ^{
+ expect(testFileManager.currentState).to(match(SDLFileManagerStateReady));
+ });
+
+ it(@"should create a putfile with the correct data", ^{
+ expect(sentPutFile.length).to(equal(@(testFileData.length)));
+ expect(sentPutFile.bulkData).to(equal(testFileData));
+ expect(sentPutFile.fileType.value).to(match([SDLFileType BINARY].value));
+ });
+
+ context(@"when the response returns without error", ^{
+ __block SDLPutFileResponse *testResponse = nil;
+ __block NSNumber *testResponseSuccess = nil;
+ __block NSNumber *testResponseBytesAvailable = nil;
+
+ beforeEach(^{
+ testResponseBytesAvailable = @750;
+ testResponseSuccess = @YES;
+
+ testResponse = [[SDLPutFileResponse alloc] init];
+ testResponse.success = testResponseSuccess;
+ testResponse.spaceAvailable = testResponseBytesAvailable;
+
+ [testConnectionManager respondToLastRequestWithResponse:testResponse];
+ });
+
+ it(@"should set the file manager data correctly", ^{
+ expect(@(testFileManager.bytesAvailable)).toEventually(equal(testResponseBytesAvailable));
+ expect(testFileManager.currentState).toEventually(match(SDLFileManagerStateReady));
+ expect(testFileManager.remoteFileNames).toEventually(contain(testFileName));
+ });
+
+ it(@"should call the completion handler with the correct data", ^{
+ expect(@(completionBytesAvailable)).to(equal(testResponseBytesAvailable));
+ expect(@(completionSuccess)).to(equal(@YES));
+ expect(completionError).to(beNil());
+ });
+ });
+
+ context(@"when the connection returns failure", ^{
+ __block SDLPutFileResponse *testResponse = nil;
+ __block NSNumber *testResponseBytesAvailable = nil;
+ __block NSNumber *testResponseSuccess = nil;
+
+ beforeEach(^{
+ testResponseBytesAvailable = @750;
+ testResponseSuccess = @NO;
+
+ testResponse = [[SDLPutFileResponse alloc] init];
+ testResponse.spaceAvailable = testResponseBytesAvailable;
+ testResponse.success = testResponseSuccess;
+
+ [testConnectionManager respondToLastRequestWithResponse:testResponse];
+ });
+
+ it(@"should set the file manager data correctly", ^{
+ expect(@(testFileManager.bytesAvailable)).toEventually(equal(@(initialSpaceAvailable)));
+ expect(testFileManager.remoteFileNames).toEventually(contain(testFileName));
+ expect(testFileManager.currentState).toEventually(match(SDLFileManagerStateReady));
+ });
+
+ it(@"should call the completion handler with the correct data", ^{
+ expect(@(completionBytesAvailable)).to(equal(@0));
+ expect(@(completionSuccess)).to(equal(testResponseSuccess));
+ expect(completionError).to(beNil());
+ });
+ });
+
+ context(@"when the connection errors without a response", ^{
+ beforeEach(^{
+ [testConnectionManager respondToLastRequestWithResponse:nil error:[NSError sdl_lifecycle_notReadyError]];
+ });
+
+ it(@"should have the correct file manager state", ^{
+ expect(testFileManager.remoteFileNames).to(contain(testFileName));
+ expect(testFileManager.currentState).to(match(SDLFileManagerStateReady));
+ });
+
+ it(@"should call the completion handler with correct data", ^{
+ expect(completionError).to(equal([NSError sdl_lifecycle_notReadyError]));
+ });
+ });
+ });
+
+ context(@"when allow overwrite is false", ^{
+ __block SDLRPCRequest *lastRequest = nil;
+
+ beforeEach(^{
+ testUploadFile.overwrite = NO;
+
+ [testFileManager uploadFile:testUploadFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ completionSuccess = success;
+ completionBytesAvailable = bytesAvailable;
+ completionError = error;
+ }];
+
+ [NSThread sleepForTimeInterval:0.1];
+
+ lastRequest = testConnectionManager.receivedRequests.lastObject;
+ });
+
+ it(@"should have called the completion handler with correct data", ^{
+ expect(lastRequest).toNot(beAnInstanceOf([SDLPutFile class]));
+ expect(@(completionSuccess)).to(equal(@NO));
+ expect(@(completionBytesAvailable)).to(equal(@(testFileManager.bytesAvailable)));
+ expect(completionError).to(equal([NSError sdl_fileManager_cannotOverwriteError]));
+ });
+ });
+ });
+
+ context(@"when there is not a remote file named the same thing", ^{
+ beforeEach(^{
+ testFileName = @"not a test file";
+ testFileData = [@"someData" dataUsingEncoding:NSUTF8StringEncoding];
+ testUploadFile = [SDLFile fileWithData:testFileData name:testFileName fileExtension:@"bin"];
+
+ [testFileManager uploadFile:testUploadFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ completionSuccess = success;
+ completionBytesAvailable = bytesAvailable;
+ completionError = error;
+ }];
+
+ [NSThread sleepForTimeInterval:0.1];
+
+ sentPutFile = (SDLPutFile *)testConnectionManager.receivedRequests.lastObject;
+ });
+
+ it(@"should not have testFileName in the files set", ^{
+ expect(testInitialFileNames).toNot(contain(testFileName));
+ });
+
+ context(@"when the connection returns without error", ^{
+ __block SDLPutFileResponse *testResponse = nil;
+ __block NSNumber *testResponseSuccess = nil;
+ __block NSNumber *testResponseBytesAvailable = nil;
+
+ beforeEach(^{
+ testResponseBytesAvailable = @750;
+ testResponseSuccess = @YES;
+
+ testResponse = [[SDLPutFileResponse alloc] init];
+ testResponse.success = testResponseSuccess;
+ testResponse.spaceAvailable = testResponseBytesAvailable;
+
+ [testConnectionManager respondToLastRequestWithResponse:testResponse];
+ });
+
+ it(@"should set the file manager state correctly", ^{
+ expect(@(testFileManager.bytesAvailable)).toEventually(equal(testResponseBytesAvailable));
+ expect(testFileManager.remoteFileNames).toEventually(contain(testFileName));
+ expect(testFileManager.currentState).toEventually(match(SDLFileManagerStateReady));
+ });
+
+ it(@"should call the completion handler with the correct data", ^{
+ expect(@(completionBytesAvailable)).to(equal(testResponseBytesAvailable));
+ expect(@(completionSuccess)).to(equal(@YES));
+ expect(completionError).to(beNil());
+ });
+ });
+
+ context(@"when the connection returns failure", ^{
+ __block SDLPutFileResponse *testResponse = nil;
+ __block NSNumber *testResponseBytesAvailable = nil;
+ __block NSNumber *testResponseSuccess = nil;
+
+ beforeEach(^{
+ testResponseBytesAvailable = @750;
+ testResponseSuccess = @NO;
+
+ testResponse = [[SDLPutFileResponse alloc] init];
+ testResponse.spaceAvailable = testResponseBytesAvailable;
+ testResponse.success = testResponseSuccess;
+
+ testFileManager.accessibilityHint = @"This doesn't matter";
+
+ [testConnectionManager respondToLastRequestWithResponse:testResponse];
+ });
+
+ it(@"should set the file manager state correctly", ^{
+ expect(@(testFileManager.bytesAvailable)).toEventually(equal(@(initialSpaceAvailable)));
+ expect(testFileManager.remoteFileNames).toEventuallyNot(contain(testFileName));
+ expect(testFileManager.currentState).toEventually(match(SDLFileManagerStateReady));
+ });
+
+ it(@"should call the completion handler with the correct data", ^{
+ expect(@(completionBytesAvailable)).to(equal(@0));
+ expect(@(completionSuccess)).to(equal(testResponseSuccess));
+ expect(completionError).to(beNil());
+ });
+ });
+
+ context(@"when the connection errors without a response", ^{
+ beforeEach(^{
+ [testConnectionManager respondToLastRequestWithResponse:nil error:[NSError sdl_lifecycle_notReadyError]];
+ });
+
+ it(@"should set the file manager state correctly", ^{
+ expect(testFileManager.remoteFileNames).toNot(contain(testFileName));
+ expect(testFileManager.currentState).to(match(SDLFileManagerStateReady));
+ });
+
+ it(@"should call the completion handler with nil error", ^{
+ expect(completionError).to(equal([NSError sdl_lifecycle_notReadyError]));
+ });
+ });
+ });
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFileSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLFileSpec.m
new file mode 100644
index 000000000..0e32c0f9f
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFileSpec.m
@@ -0,0 +1,220 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLFile.h"
+#import "SDLFileType.h"
+
+
+QuickSpecBegin(SDLFileSpec)
+
+describe(@"SDLFile", ^{
+ __block SDLFile *testFile = nil;
+
+ context(@"when created with data", ^{
+ __block NSData *testData = nil;
+ __block NSString *testName = nil;
+ __block NSString *testFileType = nil;
+ __block BOOL testPersistence = NO;
+
+ context(@"using test data", ^{
+ testName = @"Example Name";
+ testData = [@"Example Data" dataUsingEncoding:NSUTF8StringEncoding];
+ testFileType = @"mp3";
+ testPersistence = YES;
+
+ beforeEach(^{
+ testFile = [[SDLFile alloc] initWithData:testData name:testName fileExtension:testFileType persistent:testPersistence];
+ });
+
+ it(@"should not store the data in a temp file", ^{
+ expect(testFile.fileURL).to(beNil());
+ expect(@([[NSFileManager defaultManager] fileExistsAtPath:testFile.fileURL.path])).to(beFalsy());
+ });
+
+ it(@"should correctly store data", ^{
+ expect(testFile.data).to(equal(testData));
+ });
+
+ it(@"should correctly store name", ^{
+ expect(testFile.name).to(equal(testName));
+ });
+
+ it(@"should correctly store file type", ^{
+ expect(testFile.fileType).to(equal([SDLFileType AUDIO_MP3]));
+ });
+
+ it(@"should correctly start as non-overwrite", ^{
+ expect(@(testFile.overwrite)).to(equal(@NO));
+ });
+ });
+ });
+
+ context(@"when created with a file", ^{
+ __block NSURL *testFileURL = nil;
+ __block NSString *testFileName = nil;
+
+ context(@"when created with a non-extant file url", ^{
+ beforeEach(^{
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testFileURL = [testBundle URLForResource:@"imageThatDoesNotExist" withExtension:@"jpg"];
+ testFileName = @"someImage";
+
+ testFile = [[SDLFile alloc] initWithFileURL:testFileURL name:testFileName persistent:NO];
+ });
+
+ it(@"should be nil", ^{
+ expect(testFile).to(beNil());
+ });
+ });
+
+ context(@"when created with an extant file url", ^{
+ context(@"that is ephemeral", ^{
+ beforeEach(^{
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testFileURL = [testBundle URLForResource:@"testImageJPG" withExtension:@"jpg"];
+ testFileName = @"someImage";
+
+ testFile = [SDLFile fileAtFileURL:testFileURL name:testFileName];
+ });
+
+ it(@"should correctly store data", ^{
+ expect(testFile.data).to(equal([NSData dataWithContentsOfURL:testFileURL]));
+ });
+
+ it(@"should correctly store name", ^{
+ expect(testFile.name).to(match(testFileName));
+ });
+
+ it(@"should correctly store file type", ^{
+ expect(testFile.fileType).to(equal([SDLFileType GRAPHIC_JPEG]));
+ });
+
+ it(@"should correctly store persistence", ^{
+ expect(@(testFile.persistent)).to(equal(@NO));
+ });
+
+ it(@"should correctly start as non-overwrite", ^{
+ expect(@(testFile.overwrite)).to(equal(@NO));
+ });
+ });
+
+ context(@"That is persistent", ^{
+ beforeEach(^{
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testFileURL = [testBundle URLForResource:@"testImageJPG" withExtension:@"jpg"];
+ testFileName = @"someImage";
+
+ testFile = [SDLFile persistentFileAtFileURL:testFileURL name:testFileName];
+ });
+
+ it(@"should correctly store data", ^{
+ expect(testFile.data).to(equal([NSData dataWithContentsOfURL:testFileURL]));
+ });
+
+ it(@"should correctly store name", ^{
+ expect(testFile.name).to(equal(testFileName));
+ });
+
+ it(@"should correctly store file type", ^{
+ expect(testFile.fileType).to(equal([SDLFileType GRAPHIC_JPEG]));
+ });
+
+ it(@"should correctly store persistence", ^{
+ expect(@(testFile.persistent)).to(equal(@YES));
+ });
+
+ it(@"should correctly start as non-overwrite", ^{
+ expect(@(testFile.overwrite)).to(equal(@NO));
+ });
+ });
+ });
+
+ describe(@"it should recognize file of type", ^{
+ context(@"jpg", ^{
+ beforeEach(^{
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testFileURL = [testBundle URLForResource:@"testImageJPG" withExtension:@"jpg"];
+ testFileName = @"someJPG";
+
+ testFile = [[SDLFile alloc] initWithFileURL:testFileURL name:testFileName persistent:NO];
+ });
+
+ it(@"should properly interpret file type", ^{
+ expect(testFile.fileType).to(equal([SDLFileType GRAPHIC_JPEG]));
+ });
+ });
+
+ context(@"jpeg", ^{
+ beforeEach(^{
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testFileURL = [testBundle URLForResource:@"testImageJPEG" withExtension:@"jpeg"];
+ testFileName = @"someJPEG";
+
+ testFile = [[SDLFile alloc] initWithFileURL:testFileURL name:testFileName persistent:NO];
+ });
+
+ it(@"should properly interpret file type", ^{
+ expect(testFile.fileType).to(equal([SDLFileType GRAPHIC_JPEG]));
+ });
+ });
+
+ context(@"png", ^{
+ beforeEach(^{
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testFileURL = [testBundle URLForResource:@"testImagePNG" withExtension:@"png"];
+ testFileName = @"somePNG";
+
+ testFile = [[SDLFile alloc] initWithFileURL:testFileURL name:testFileName persistent:NO];
+ });
+
+ it(@"should properly interpret file type", ^{
+ expect(testFile.fileType).to(equal([SDLFileType GRAPHIC_PNG]));
+ });
+ });
+
+ context(@"bmp", ^{
+ beforeEach(^{
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testFileURL = [testBundle URLForResource:@"testImageBMP" withExtension:@"bmp"];
+ testFileName = @"someBMP";
+
+ testFile = [[SDLFile alloc] initWithFileURL:testFileURL name:testFileName persistent:NO];
+ });
+
+ it(@"should properly interpret file type", ^{
+ expect(testFile.fileType).to(equal([SDLFileType GRAPHIC_BMP]));
+ });
+ });
+
+ context(@"json", ^{
+ beforeEach(^{
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testFileURL = [testBundle URLForResource:@"testFileJSON" withExtension:@"json"];
+ testFileName = @"someJSON";
+
+ testFile = [[SDLFile alloc] initWithFileURL:testFileURL name:testFileName persistent:NO];
+ });
+
+ it(@"should properly interpret file type", ^{
+ expect(testFile.fileType).to(equal([SDLFileType JSON]));
+ });
+ });
+
+ context(@"binary", ^{
+ beforeEach(^{
+ NSBundle *testBundle = [NSBundle bundleForClass:[self class]];
+ testFileURL = [testBundle URLForResource:@"testImageTIFF" withExtension:@"tiff"];
+ testFileName = @"someTIFF";
+
+ testFile = [[SDLFile alloc] initWithFileURL:testFileURL name:testFileName persistent:NO];
+ });
+
+ it(@"should properly interpret file type", ^{
+ expect(testFile.fileType).to(equal([SDLFileType BINARY]));
+ });
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleConfigurationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleConfigurationSpec.m
new file mode 100644
index 000000000..e398e429a
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleConfigurationSpec.m
@@ -0,0 +1,165 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLAppHMIType.h"
+#import "SDLLanguage.h"
+#import "SDLLifecycleConfiguration.h"
+#import "SDLSpeechCapabilities.h"
+#import "SDLTTSChunk.h"
+
+QuickSpecBegin(SDLLifecycleConfigurationSpec)
+
+describe(@"a lifecycle configuration", ^{
+ __block SDLLifecycleConfiguration *testConfig = nil;
+
+ context(@"that is created with default settings", ^{
+ __block NSString *someAppName = nil;
+ __block NSString *someAppId = nil;
+
+ beforeEach(^{
+ someAppName = @"An App Name";
+ someAppId = @"00542596432764329684352896423679";
+
+ testConfig = [SDLLifecycleConfiguration defaultConfigurationWithAppName:someAppName appId:someAppId];
+ });
+
+ it(@"should have properly set properties", ^{
+ expect(testConfig.appName).to(match(someAppName));
+ expect(testConfig.appId).to(match(someAppId));
+ expect(@(testConfig.tcpDebugMode)).to(beFalsy());
+ expect(testConfig.tcpDebugIPAddress).to(match(@"192.168.0.1"));
+ expect(@(testConfig.tcpDebugPort)).to(equal(@12345));
+ expect(@([testConfig.appType isEqualToEnum:[SDLAppHMIType DEFAULT]])).to(equal(@YES));
+ expect(@(testConfig.isMedia)).to(beFalsy());
+ expect(@([testConfig.language isEqualToEnum:[SDLLanguage EN_US]])).to(equal(@YES));
+ expect(@([[testConfig.languagesSupported firstObject] isEqualToEnum:[SDLLanguage EN_US]])).to(equal(@YES));
+ expect(testConfig.shortAppName).to(beNil());
+ expect(testConfig.ttsName).to(beNil());
+ expect(testConfig.voiceRecognitionCommandNames).to(beNil());
+ expect(testConfig.resumeHash).to(beNil());
+ expect(testConfig.securityManagers).to(beNil());
+ });
+
+ describe(@"after setting properties manually", ^{
+ __block NSString *someShortAppName = nil;
+ __block SDLTTSChunk *someTTSChunk = nil;
+ __block NSArray *someTTSName = nil;
+ __block NSArray *someSynonyms = nil;
+ __block NSString *someResumeHashString = nil;
+
+ beforeEach(^{
+ someTTSChunk = [[SDLTTSChunk alloc] init];
+ someTTSChunk.text = @"some tts name";
+ someTTSChunk.type = [SDLSpeechCapabilities TEXT];
+
+ someTTSName = @[someTTSChunk];
+ someShortAppName = @"Short Name";
+ someSynonyms = @[@"Test 1", @"Test 2", @"Test 3", @"Test 4"];
+ someResumeHashString = @"testing";
+
+ testConfig.appType = [SDLAppHMIType MEDIA];
+ testConfig.language = [SDLLanguage AR_SA];
+ testConfig.languagesSupported = @[[SDLLanguage AR_SA], [SDLLanguage EN_AU], [SDLLanguage EN_US]];
+ testConfig.shortAppName = someShortAppName;
+ testConfig.ttsName = someTTSName;
+ testConfig.voiceRecognitionCommandNames = someSynonyms;
+ testConfig.resumeHash = someResumeHashString;
+ });
+
+ it(@"should have properly set properties", ^{
+ expect(testConfig.appName).to(match(someAppName));
+ expect(testConfig.appId).to(match(someAppId));
+ expect(@(testConfig.tcpDebugMode)).to(beFalsy());
+ expect(testConfig.tcpDebugIPAddress).to(match(@"192.168.0.1"));
+ expect(@(testConfig.tcpDebugPort)).to(equal(@12345));
+ expect(@([testConfig.appType isEqualToEnum:[SDLAppHMIType MEDIA]])).to(equal(@YES));
+ expect(@(testConfig.isMedia)).to(beTruthy());
+ expect(@([testConfig.language isEqualToEnum:[SDLLanguage AR_SA]])).to(equal(@YES));
+ expect(testConfig.languagesSupported).to(haveCount(@3));
+ expect(testConfig.shortAppName).to(match(someShortAppName));
+ expect(testConfig.ttsName).to(contain(someTTSChunk));
+ expect(testConfig.ttsName).to(haveCount(@1));
+ expect(testConfig.voiceRecognitionCommandNames).to(haveCount(@(someSynonyms.count)));
+ expect(testConfig.resumeHash).to(match(someResumeHashString));
+ expect(testConfig.securityManagers).to(beNil());
+ });
+ });
+ });
+
+ context(@"that is created with debug settings", ^{
+ __block NSString *someAppName = nil;
+ __block NSString *someAppId = nil;
+ __block NSString *someIPAddress = nil;
+ __block UInt16 somePort = 0;
+
+ beforeEach(^{
+ someAppName = @"An App Name";
+ someAppId = @"00542596432764329684352896423679";
+ someIPAddress = @"1.1.1.1";
+ somePort = 42;
+
+ testConfig = [SDLLifecycleConfiguration debugConfigurationWithAppName:someAppName appId:someAppId ipAddress:someIPAddress port:somePort];
+ });
+
+ it(@"should have properly set properties", ^{
+ expect(testConfig.appName).to(match(someAppName));
+ expect(testConfig.appId).to(match(someAppId));
+ expect(@(testConfig.tcpDebugMode)).to(beTruthy());
+ expect(testConfig.tcpDebugIPAddress).to(match(someIPAddress));
+ expect(@(testConfig.tcpDebugPort)).to(equal(@(somePort)));
+ expect(@([testConfig.appType isEqualToEnum:[SDLAppHMIType DEFAULT]])).to(equal(@YES));
+ expect(@([testConfig.language isEqualToEnum:[SDLLanguage EN_US]])).to(equal(@YES));
+ expect(@([[testConfig.languagesSupported firstObject] isEqualToEnum:[SDLLanguage EN_US]])).to(equal(@YES));
+ expect(testConfig.shortAppName).to(beNil());
+ expect(testConfig.ttsName).to(beNil());
+ expect(testConfig.voiceRecognitionCommandNames).to(beNil());
+ expect(testConfig.resumeHash).to(beNil());
+ expect(testConfig.securityManagers).to(beNil());
+ });
+
+ describe(@"after setting properties manually", ^{
+ __block NSString *someShortAppName = nil;
+ __block SDLTTSChunk *someTTSChunk = nil;
+ __block NSArray *someTTSName = nil;
+ __block NSArray *someSynonyms = nil;
+ __block NSString *someResumeHashString = nil;
+
+ beforeEach(^{
+ someTTSChunk = [[SDLTTSChunk alloc] init];
+ someTTSChunk.text = @"some tts name";
+ someTTSChunk.type = [SDLSpeechCapabilities TEXT];
+
+ someShortAppName = @"Short Name 2";
+ someTTSName = @[someTTSChunk];
+ someSynonyms = @[@"Test 1", @"Test 2"];
+
+ testConfig.appType = [SDLAppHMIType MEDIA];
+ testConfig.language = [SDLLanguage AR_SA];
+ testConfig.languagesSupported = @[[SDLLanguage AR_SA], [SDLLanguage EN_AU], [SDLLanguage EN_US]];
+ testConfig.shortAppName = someShortAppName;
+ testConfig.ttsName = someTTSName;
+ testConfig.voiceRecognitionCommandNames = someSynonyms;
+ testConfig.resumeHash = someResumeHashString;
+ });
+
+ it(@"should have properly set properties", ^{
+ expect(testConfig.appName).to(match(someAppName));
+ expect(testConfig.appId).to(match(someAppId));
+ expect(@(testConfig.tcpDebugMode)).to(beTruthy());
+ expect(testConfig.tcpDebugIPAddress).to(match(someIPAddress));
+ expect(@(testConfig.tcpDebugPort)).to(equal(@(somePort)));
+ expect(@([testConfig.appType isEqualToEnum:[SDLAppHMIType MEDIA]])).to(equal(@YES));
+ expect(@(testConfig.isMedia)).to(beTruthy());
+ expect(@([testConfig.language isEqualToEnum:[SDLLanguage AR_SA]])).to(equal(@YES));
+ expect(testConfig.languagesSupported).to(haveCount(@3));
+ expect(testConfig.shortAppName).to(match(someShortAppName));
+ expect(testConfig.ttsName).to(contain(someTTSChunk));
+ expect(testConfig.ttsName).to(haveCount(@1));
+ expect(testConfig.voiceRecognitionCommandNames).to(haveCount(@(someSynonyms.count)));
+ expect(testConfig.securityManagers).to(beNil());
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m
new file mode 100644
index 000000000..55a7fcde1
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLifecycleManagerSpec.m
@@ -0,0 +1,328 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+#import <OCMock/OCMock.h>
+
+#import "SDLLifecycleManager.h"
+
+#import "SDLConfiguration.h"
+#import "SDLConnectionManagerType.h"
+#import "SDLError.h"
+#import "SDLFileManager.h"
+#import "SDLHMILevel.h"
+#import "SDLLifecycleConfiguration.h"
+#import "SDLLockScreenConfiguration.h"
+#import "SDLLockScreenManager.h"
+#import "SDLManagerDelegate.h"
+#import "SDLNotificationDispatcher.h"
+#import "SDLOnHashChange.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLPermissionManager.h"
+#import "SDLProxy.h"
+#import "SDLProxyFactory.h"
+#import "SDLRegisterAppInterface.h"
+#import "SDLRegisterAppInterfaceResponse.h"
+#import "SDLShow.h"
+#import "SDLStateMachine.h"
+#import "SDLTextAlignment.h"
+#import "SDLUnregisterAppInterface.h"
+#import "SDLUnregisterAppInterfaceResponse.h"
+
+
+// Ignore the deprecated proxy methods
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+
+QuickConfigurationBegin(SendingRPCsConfiguration)
+
++ (void)configure:(Configuration *)configuration {
+ sharedExamples(@"unable to send an RPC", ^(QCKDSLSharedExampleContext exampleContext) {
+ it(@"cannot publicly send RPCs", ^{
+ __block NSError *testError = nil;
+ SDLLifecycleManager *testManager = exampleContext()[@"manager"];
+ SDLShow *testShow = [[SDLShow alloc] initWithMainField1:@"test" mainField2:nil alignment:nil];
+
+ [testManager sendRequest:testShow withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ testError = error;
+ }];
+
+ expect(testError).to(equal([NSError sdl_lifecycle_notReadyError]));
+ });
+ });
+}
+
+QuickConfigurationEnd
+
+
+QuickSpecBegin(SDLLifecycleManagerSpec)
+
+describe(@"a lifecycle manager", ^{
+ __block SDLLifecycleManager *testManager = nil;
+ __block SDLConfiguration *testConfig = nil;
+
+ __block id managerDelegateMock = OCMProtocolMock(@protocol(SDLManagerDelegate));
+ __block id proxyBuilderClassMock = OCMStrictClassMock([SDLProxyFactory class]);
+ __block id proxyMock = OCMClassMock([SDLProxy class]);
+ __block id lockScreenManagerMock = OCMClassMock([SDLLockScreenManager class]);
+ __block id fileManagerMock = OCMClassMock([SDLFileManager class]);
+ __block id permissionManagerMock = OCMClassMock([SDLPermissionManager class]);
+
+ beforeEach(^{
+ OCMStub([proxyBuilderClassMock buildSDLProxyWithListener:[OCMArg any]]).andReturn(proxyMock);
+
+ SDLLifecycleConfiguration *testLifecycleConfig = [SDLLifecycleConfiguration defaultConfigurationWithAppName:@"Test App" appId:@"Test Id"];
+ testLifecycleConfig.shortAppName = @"Short Name";
+
+ testConfig = [SDLConfiguration configurationWithLifecycle:testLifecycleConfig lockScreen:[SDLLockScreenConfiguration disabledConfiguration]];
+ testManager = [[SDLLifecycleManager alloc] initWithConfiguration:testConfig delegate:managerDelegateMock];
+ testManager.lockScreenManager = lockScreenManagerMock;
+ testManager.fileManager = fileManagerMock;
+ testManager.permissionManager = permissionManagerMock;
+ });
+
+ it(@"should initialize properties", ^{
+ expect(testManager.configuration).to(equal(testConfig));
+ expect(testManager.delegate).to(equal(managerDelegateMock)); // TODO: Broken on OCMock 3.3.1 & Swift 3 Quick / Nimble
+ expect(testManager.lifecycleState).to(match(SDLLifecycleStateDisconnected));
+ expect(@(testManager.lastCorrelationId)).to(equal(@0));
+ expect(testManager.fileManager).toNot(beNil());
+ expect(testManager.permissionManager).toNot(beNil());
+ expect(testManager.streamManager).to(beNil());
+ expect(testManager.proxy).to(beNil());
+ expect(testManager.registerResponse).to(beNil());
+ expect(testManager.lockScreenManager).toNot(beNil());
+ expect(testManager.notificationDispatcher).toNot(beNil());
+ expect(testManager.responseDispatcher).toNot(beNil());
+ expect(@([testManager conformsToProtocol:@protocol(SDLConnectionManagerType)])).to(equal(@YES));
+ });
+
+ itBehavesLike(@"unable to send an RPC", ^{ return @{ @"manager": testManager }; });
+
+ describe(@"after receiving an HMI Status", ^{
+ __block SDLOnHMIStatus *testHMIStatus = nil;
+ __block SDLHMILevel *testHMILevel = nil;
+
+ beforeEach(^{
+ testHMIStatus = [[SDLOnHMIStatus alloc] init];
+ });
+
+ context(@"a non-none hmi level", ^{
+ beforeEach(^{
+ testHMILevel = [SDLHMILevel NONE];
+ testHMIStatus.hmiLevel = testHMILevel;
+
+ [testManager.notificationDispatcher postRPCNotificationNotification:SDLDidChangeHMIStatusNotification notification:testHMIStatus];
+ });
+
+ it(@"should set the hmi level", ^{
+ expect(testManager.hmiLevel).toEventually(equal(testHMILevel));
+ });
+ });
+
+ context(@"a non-full, non-none hmi level", ^{
+ beforeEach(^{
+ testHMILevel = [SDLHMILevel BACKGROUND];
+ testHMIStatus.hmiLevel = testHMILevel;
+
+ [testManager.notificationDispatcher postRPCNotificationNotification:SDLDidChangeHMIStatusNotification notification:testHMIStatus];
+ });
+
+ it(@"should set the hmi level", ^{
+ expect(testManager.hmiLevel).toEventually(equal(testHMILevel));
+ });
+ });
+
+ context(@"a full hmi level", ^{
+ beforeEach(^{
+ testHMILevel = [SDLHMILevel FULL];
+ testHMIStatus.hmiLevel = testHMILevel;
+
+ [testManager.notificationDispatcher postRPCNotificationNotification:SDLDidChangeHMIStatusNotification notification:testHMIStatus];
+ });
+
+ it(@"should set the hmi level", ^{
+ expect(testManager.hmiLevel).toEventually(equal(testHMILevel));
+ });
+ });
+ });
+
+ describe(@"calling stop", ^{
+ beforeEach(^{
+ [testManager stop];
+ });
+
+ it(@"should do nothing", ^{
+ expect(testManager.lifecycleState).to(match(SDLLifecycleStateDisconnected));
+ });
+ });
+
+ describe(@"when started", ^{
+ beforeEach(^{
+ [testManager startWithReadyHandler:^(BOOL success, NSError * _Nullable error) {}];
+ });
+
+ it(@"should initialize the proxy property", ^{
+ expect(testManager.proxy).toNot(beNil());
+ expect(testManager.lifecycleState).to(match(SDLLifecycleStateDisconnected));
+ });
+
+ describe(@"after receiving a connect notification", ^{
+ beforeEach(^{
+ // When we connect, we should be creating an sending an RAI
+ OCMExpect([proxyMock sendRPC:[OCMArg isKindOfClass:[SDLRegisterAppInterface class]]]);
+
+ [testManager.notificationDispatcher postNotificationName:SDLTransportDidConnect infoObject:nil];
+ [NSThread sleepForTimeInterval:0.1];
+ });
+
+ it(@"should send a register app interface request and be in the connected state", ^{
+ OCMVerifyAllWithDelay(proxyMock, 0.5);
+ expect(testManager.lifecycleState).to(match(SDLLifecycleStateTransportConnected));
+ });
+
+ itBehavesLike(@"unable to send an RPC", ^{ return @{ @"manager": testManager }; });
+
+ describe(@"after receiving a disconnect notification", ^{
+ beforeEach(^{
+ [testManager.notificationDispatcher postNotificationName:SDLTransportDidDisconnect infoObject:nil];
+ [NSThread sleepForTimeInterval:0.1];
+ });
+
+ it(@"should be in the disconnect state", ^{
+ expect(testManager.lifecycleState).to(match(SDLLifecycleStateDisconnected));
+ });
+ });
+
+ describe(@"stopping the manager", ^{
+ beforeEach(^{
+ [testManager stop];
+ });
+
+ it(@"should simply disconnect", ^{
+ expect(testManager.lifecycleState).to(match(SDLLifecycleStateDisconnected));
+ });
+ });
+ });
+
+ describe(@"in the connected state", ^{
+ beforeEach(^{
+ [testManager.lifecycleStateMachine setToState:SDLLifecycleStateTransportConnected];
+ });
+
+ describe(@"after receiving a register app interface response", ^{
+ __block NSError *fileManagerStartError = [NSError errorWithDomain:@"testDomain" code:0 userInfo:nil];
+ __block NSError *permissionManagerStartError = [NSError errorWithDomain:@"testDomain" code:0 userInfo:nil];
+
+ beforeEach(^{
+ OCMStub([(SDLLockScreenManager *)lockScreenManagerMock start]);
+ OCMStub([fileManagerMock startWithCompletionHandler:([OCMArg invokeBlockWithArgs:@(YES), fileManagerStartError, nil])]);
+ OCMStub([permissionManagerMock startWithCompletionHandler:([OCMArg invokeBlockWithArgs:@(YES), permissionManagerStartError, nil])]);
+
+ // Send an RAI response to move the lifecycle forward
+ [testManager.lifecycleStateMachine transitionToState:SDLLifecycleStateRegistered];
+ [NSThread sleepForTimeInterval:0.3];
+ });
+
+ it(@"should eventually reach the ready state", ^{
+ expect(testManager.lifecycleState).toEventually(match(SDLLifecycleStateReady));
+ OCMVerify([(SDLLockScreenManager *)lockScreenManagerMock start]);
+ OCMVerify([fileManagerMock startWithCompletionHandler:[OCMArg any]]);
+ OCMVerify([permissionManagerMock startWithCompletionHandler:[OCMArg any]]);
+ });
+
+ itBehavesLike(@"unable to send an RPC", ^{ return @{ @"manager": testManager }; });
+ });
+
+ describe(@"after receiving a disconnect notification", ^{
+ beforeEach(^{
+ [testManager.notificationDispatcher postNotificationName:SDLTransportDidDisconnect infoObject:nil];
+ });
+
+ it(@"should enter the disconnect state", ^{
+ expect(testManager.lifecycleState).toEventually(match(SDLLifecycleStateDisconnected));
+ });
+ });
+
+ describe(@"stopping the manager", ^{
+ beforeEach(^{
+ [testManager stop];
+ });
+
+ it(@"should enter the disconnect state", ^{
+ expect(testManager.lifecycleState).to(match(SDLLifecycleStateDisconnected));
+ });
+ });
+ });
+
+ describe(@"in the ready state", ^{
+ beforeEach(^{
+ [testManager.lifecycleStateMachine setToState:SDLLifecycleStateReady];
+ });
+
+ it(@"can send an RPC", ^{
+ SDLShow *testShow = [[SDLShow alloc] initWithMainField1:@"test" mainField2:nil alignment:nil];
+ [testManager sendRequest:testShow];
+
+ OCMVerify([proxyMock sendRPC:[OCMArg isKindOfClass:[SDLShow class]]]);
+ });
+
+ describe(@"stopping the manager", ^{
+ beforeEach(^{
+ [testManager stop];
+ });
+
+ it(@"should attempt to unregister", ^{
+ OCMVerify([proxyMock sendRPC:[OCMArg isKindOfClass:[SDLUnregisterAppInterface class]]]);
+ expect(testManager.lifecycleState).toEventually(match(SDLLifecycleStateUnregistering));
+ });
+
+ describe(@"when receiving an unregister response", ^{
+ __block SDLUnregisterAppInterfaceResponse *testUnregisterResponse = nil;
+
+ beforeEach(^{
+ testUnregisterResponse = [[SDLUnregisterAppInterfaceResponse alloc] init];
+ testUnregisterResponse.success = @YES;
+ testUnregisterResponse.correlationID = @(testManager.lastCorrelationId);
+
+ [testManager.notificationDispatcher postRPCResponseNotification:SDLDidReceiveUnregisterAppInterfaceResponse response:testUnregisterResponse];
+ });
+
+ it(@"should disconnect", ^{
+ expect(testManager.lifecycleState).toEventually(match(SDLLifecycleStateDisconnected));
+ });
+ });
+ });
+
+ describe(@"receiving an HMI level change", ^{
+ __block SDLOnHMIStatus *testHMIStatus = nil;
+ __block SDLHMILevel *testHMILevel = nil;
+ __block SDLHMILevel *oldHMILevel = nil;
+
+ beforeEach(^{
+ oldHMILevel = testManager.hmiLevel;
+ testHMIStatus = [[SDLOnHMIStatus alloc] init];
+ });
+
+ context(@"a full hmi level", ^{
+ beforeEach(^{
+ testHMILevel = [SDLHMILevel FULL];
+ testHMIStatus.hmiLevel = testHMILevel;
+
+ [testManager.notificationDispatcher postRPCNotificationNotification:SDLDidChangeHMIStatusNotification notification:testHMIStatus];
+ });
+
+ it(@"should set the hmi level", ^{
+ expect(testManager.hmiLevel).toEventually(equal(testHMILevel));
+ });
+
+ it(@"should call the delegate", ^{
+ OCMVerify([managerDelegateMock hmiLevel:oldHMILevel didChangeToLevel:testHMILevel]);
+ });
+ });
+ });
+ });
+ });
+});
+
+QuickSpecEnd
+
+#pragma clang diagnostic pop
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLListFilesOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLListFilesOperationSpec.m
new file mode 100644
index 000000000..472a590e0
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLListFilesOperationSpec.m
@@ -0,0 +1,108 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLError.h"
+#import "SDLListFiles.h"
+#import "SDLListFilesResponse.h"
+#import "SDLListFilesOperation.h"
+#import "TestConnectionManager.h"
+
+
+QuickSpecBegin(SDLListFilesOperationSpec)
+
+describe(@"List Files Operation", ^{
+ __block TestConnectionManager *testConnectionManager = nil;
+ __block SDLListFilesOperation *testOperation = nil;
+
+ __block BOOL successResult = NO;
+ __block NSUInteger bytesAvailableResult = NO;
+ __block NSError *errorResult = nil;
+ __block NSArray<NSString *> *fileNamesResult = nil;
+
+ beforeEach(^{
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ testOperation = [[SDLListFilesOperation alloc] initWithConnectionManager:testConnectionManager completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSArray<NSString *> * _Nonnull fileNames, NSError * _Nullable error) {
+ successResult = success;
+ bytesAvailableResult = bytesAvailable;
+ fileNamesResult = fileNames;
+ errorResult = error;
+ }];
+ });
+
+ it(@"should have a priority of 'very high'", ^{
+ expect(@(testOperation.queuePriority)).to(equal(@(NSOperationQueuePriorityVeryHigh)));
+ });
+
+ describe(@"running the operation", ^{
+ beforeEach(^{
+ [testOperation start];
+ });
+
+ it(@"should send a list files request", ^{
+ expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLListFiles class]));
+ });
+
+ context(@"when a good response comes back", ^{
+ __block SDLListFilesResponse *goodResponse = nil;
+ __block NSNumber *responseSpaceAvailable = nil;
+ __block NSMutableArray *responseFileNames = nil;
+
+ beforeEach(^{
+ responseSpaceAvailable = @(11212512);
+ responseFileNames = [NSMutableArray arrayWithArray:@[@"test1", @"test2"]];
+
+ goodResponse = [[SDLListFilesResponse alloc] init];
+ goodResponse.success = @YES;
+ goodResponse.spaceAvailable = responseSpaceAvailable;
+ goodResponse.filenames = responseFileNames;
+
+ [testConnectionManager respondToLastRequestWithResponse:goodResponse];
+ });
+
+ it(@"should have called the completion handler with proper data", ^{
+ expect(@(successResult)).to(equal(@YES));
+ expect(@(bytesAvailableResult)).to(equal(responseSpaceAvailable));
+ expect(fileNamesResult).to(haveCount(@(responseFileNames.count)));
+ expect(fileNamesResult).to(contain(responseFileNames.firstObject));
+ expect(errorResult).to(beNil());
+ });
+
+ it(@"should be set to finished", ^{
+ expect(@(testOperation.finished)).to(equal(@YES));
+ expect(@(testOperation.executing)).to(equal(@NO));
+ });
+ });
+
+ context(@"when a bad response comes back", ^{
+ __block SDLListFilesResponse *badResponse = nil;
+ __block NSNumber *responseSpaceAvailable = nil;
+ __block NSMutableArray *responseFileNames = nil;
+
+ __block NSString *responseErrorDescription = nil;
+ __block NSString *responseErrorReason = nil;
+
+ beforeEach(^{
+ responseSpaceAvailable = @(0);
+ responseFileNames = [NSMutableArray arrayWithArray:@[]];
+
+ responseErrorDescription = @"some description";
+ responseErrorReason = @"some reason";
+
+ badResponse = [[SDLListFilesResponse alloc] init];
+ badResponse.success = @NO;
+ badResponse.spaceAvailable = responseSpaceAvailable;
+ badResponse.filenames = responseFileNames;
+
+ [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));
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenConfigurationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenConfigurationSpec.m
new file mode 100644
index 000000000..59c3974df
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenConfigurationSpec.m
@@ -0,0 +1,78 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLLockScreenConfiguration.h"
+
+QuickSpecBegin(SDLLockScreenConfigurationSpec)
+
+describe(@"a lock screen configuration", ^{
+ __block SDLLockScreenConfiguration *testConfig = nil;
+
+ context(@"in the disabled configuration", ^{
+ beforeEach(^{
+ testConfig = [SDLLockScreenConfiguration disabledConfiguration];
+ });
+
+ it(@"should properly set properties", ^{
+ expect(@(testConfig.enableAutomaticLockScreen)).to(beFalsy());
+ expect(@(testConfig.showInOptionalState)).to(beFalsy());
+ expect(testConfig.backgroundColor).to(equal([UIColor colorWithRed:(57.0/255.0) green:(78.0/255.0) blue:(96.0/255.0) alpha:1.0]));
+ expect(testConfig.appIcon).to(beNil());
+ expect(testConfig.customViewController).to(beNil());
+ });
+ });
+
+ context(@"in the base enabled configuration", ^{
+ beforeEach(^{
+ testConfig = [SDLLockScreenConfiguration enabledConfiguration];
+ });
+
+ it(@"should properly set properties", ^{
+ expect(@(testConfig.enableAutomaticLockScreen)).to(beTruthy());
+ expect(@(testConfig.showInOptionalState)).to(beFalsy());
+ expect(testConfig.backgroundColor).to(equal([UIColor colorWithRed:(57.0/255.0) green:(78.0/255.0) blue:(96.0/255.0) alpha:1.0]));
+ expect(testConfig.appIcon).to(beNil());
+ expect(testConfig.customViewController).to(beNil());
+ });
+ });
+
+ context(@"in the background customizable enabled configuration", ^{
+ __block UIColor *testBackgroundColor = nil;
+ __block UIImage *testImage = nil;
+
+ beforeEach(^{
+ testBackgroundColor = [UIColor blueColor];
+ testImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
+
+ testConfig = [SDLLockScreenConfiguration enabledConfigurationWithAppIcon:testImage backgroundColor:testBackgroundColor];
+ });
+
+ it(@"should properly set properties", ^{
+ expect(@(testConfig.enableAutomaticLockScreen)).to(beTruthy());
+ expect(@(testConfig.showInOptionalState)).to(beFalsy());
+ expect(testConfig.backgroundColor).to(equal([UIColor blueColor]));
+ expect(testConfig.appIcon).to(equal(testImage));
+ expect(testConfig.customViewController).to(beNil());
+ });
+ });
+
+ context(@"in the view controller customizable enabled configuration", ^{
+ __block UIViewController *testVC = nil;
+
+ beforeEach(^{
+ testVC = [[UIViewController alloc] init];
+
+ testConfig = [SDLLockScreenConfiguration enabledConfigurationWithViewController:testVC];
+ });
+
+ it(@"should properly set properties", ^{
+ expect(@(testConfig.enableAutomaticLockScreen)).to(beTruthy());
+ expect(@(testConfig.showInOptionalState)).to(beFalsy());
+ expect(testConfig.backgroundColor).to(equal([UIColor colorWithRed:(57.0/255.0) green:(78.0/255.0) blue:(96.0/255.0) alpha:1.0]));
+ expect(testConfig.appIcon).to(beNil());
+ expect(testConfig.customViewController).to(equal(testVC));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenManagerSpec.m
new file mode 100644
index 000000000..0a31d63a0
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenManagerSpec.m
@@ -0,0 +1,206 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLFakeViewControllerPresenter.h"
+#import "SDLLockScreenConfiguration.h"
+#import "SDLLockScreenManager.h"
+#import "SDLLockScreenStatus.h"
+#import "SDLLockScreenViewController.h"
+#import "SDLNotificationConstants.h"
+#import "SDLNotificationDispatcher.h"
+#import "SDLOnLockScreenStatus.h"
+#import "SDLRPCNotificationNotification.h"
+
+
+QuickSpecBegin(SDLLockScreenManagerSpec)
+
+describe(@"a lock screen manager", ^{
+ __block SDLLockScreenManager *testManager = nil;
+ __block SDLFakeViewControllerPresenter *fakePresenter = nil;
+ __block SDLNotificationDispatcher *testNotificationDispatcher = nil;
+
+ beforeEach(^{
+ fakePresenter = [[SDLFakeViewControllerPresenter alloc] init];
+ });
+
+ context(@"with a disabled configuration", ^{
+ beforeEach(^{
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration disabledConfiguration] notificationDispatcher:nil presenter:fakePresenter];
+ });
+
+ it(@"should set properties correctly", ^{
+ // Note: We can't check the "lockScreenPresented" flag on the Lock Screen Manager because it's a computer property checking the window
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ expect(testManager.lockScreenViewController).to(beNil());
+ });
+
+ describe(@"after it is started", ^{
+ beforeEach(^{
+ [testManager start];
+ });
+
+ it(@"should not have a lock screen controller", ^{
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ expect(testManager.lockScreenViewController).to(beNil());
+ });
+
+ describe(@"when the lock screen status becomes REQUIRED", ^{
+ __block SDLOnLockScreenStatus *testRequiredStatus = nil;
+
+ beforeEach(^{
+ testRequiredStatus = [[SDLOnLockScreenStatus alloc] init];
+ testRequiredStatus.lockScreenStatus = [SDLLockScreenStatus REQUIRED];
+
+ [testNotificationDispatcher postNotificationName:SDLDidChangeLockScreenStatusNotification infoObject:testRequiredStatus];
+ });
+
+ it(@"should not have presented the lock screen", ^{
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ });
+ });
+ });
+ });
+
+ context(@"with an enabled configuration", ^{
+ beforeEach(^{
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration enabledConfiguration] notificationDispatcher:nil presenter:fakePresenter];
+ });
+
+ it(@"should set properties correctly", ^{
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ expect(testManager.lockScreenViewController).to(beNil());
+ });
+
+ describe(@"after it's started", ^{
+ beforeEach(^{
+ [testManager start];
+ });
+
+ it(@"should set up the view controller correctly", ^{
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ expect(testManager.lockScreenViewController).toNot(beNil());
+ expect(testManager.lockScreenViewController).to(beAnInstanceOf([SDLLockScreenViewController class]));
+ });
+
+ describe(@"when the lock screen status becomes REQUIRED", ^{
+ __block SDLOnLockScreenStatus *testRequiredStatus = nil;
+
+ beforeEach(^{
+ testRequiredStatus = [[SDLOnLockScreenStatus alloc] init];
+ testRequiredStatus.lockScreenStatus = [SDLLockScreenStatus REQUIRED];
+
+ SDLRPCNotificationNotification *testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:nil rpcNotification:testRequiredStatus];
+ [[NSNotificationCenter defaultCenter] postNotification:testLockStatusNotification];
+ });
+
+ it(@"should have presented the lock screen", ^{
+ expect(@(fakePresenter.presented)).to(beTruthy());
+ });
+
+ it(@"should not have a vehicle icon", ^{
+ expect(((SDLLockScreenViewController *)testManager.lockScreenViewController).vehicleIcon).to(beNil());
+ });
+
+ describe(@"when a vehicle icon is received", ^{
+ __block UIImage *testIcon = nil;
+
+ beforeEach(^{
+ testIcon = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:self.class] compatibleWithTraitCollection:nil];
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveLockScreenIcon object:nil userInfo:@{ SDLNotificationUserInfoObject: testIcon }];
+ });
+
+ it(@"should have a vehicle icon", ^{
+ expect(((SDLLockScreenViewController *)testManager.lockScreenViewController).vehicleIcon).toNot(beNil());
+ expect(((SDLLockScreenViewController *)testManager.lockScreenViewController).vehicleIcon).to(equal(testIcon));
+ });
+ });
+
+ describe(@"then the manager is stopped", ^{
+ beforeEach(^{
+ [testManager stop];
+ });
+
+ it(@"should have dismissed the lock screen", ^{
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ });
+ });
+
+ describe(@"then the status becomes OFF", ^{
+ __block SDLOnLockScreenStatus *testOffStatus = nil;
+
+ beforeEach(^{
+ testOffStatus = [[SDLOnLockScreenStatus alloc] init];
+ testOffStatus.lockScreenStatus = [SDLLockScreenStatus OFF];
+
+ SDLRPCNotificationNotification *testLockStatusNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeLockScreenStatusNotification object:nil rpcNotification:testOffStatus];
+ [[NSNotificationCenter defaultCenter] postNotification:testLockStatusNotification];
+ });
+
+ it(@"should have dismissed the lock screen", ^{
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ });
+ });
+ });
+ });
+ });
+
+ context(@"with a custom color configuration", ^{
+ __block UIColor *testColor = nil;
+ __block UIImage *testImage = nil;
+
+ beforeEach(^{
+ testColor = [UIColor blueColor];
+ testImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:self.class] compatibleWithTraitCollection:nil];
+
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration enabledConfigurationWithAppIcon:testImage backgroundColor:testColor] notificationDispatcher:nil presenter:fakePresenter];
+ });
+
+ it(@"should set properties correctly", ^{
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ expect(testManager.lockScreenViewController).to(beNil());
+ });
+
+ describe(@"after it's started", ^{
+ beforeEach(^{
+ [testManager start];
+ });
+
+ it(@"should set up the view controller correctly", ^{
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ expect(testManager.lockScreenViewController).toNot(beNil());
+ expect(testManager.lockScreenViewController).to(beAnInstanceOf([SDLLockScreenViewController class]));
+ expect(((SDLLockScreenViewController *)testManager.lockScreenViewController).backgroundColor).to(equal(testColor));
+ expect(((SDLLockScreenViewController *)testManager.lockScreenViewController).appIcon).to(equal(testImage));
+ });
+ });
+ });
+
+ context(@"with a custom view controller configuration", ^{
+ __block UIViewController *testViewController = nil;
+
+ beforeEach(^{
+ testViewController = [[UIViewController alloc] init];
+ testManager = [[SDLLockScreenManager alloc] initWithConfiguration:[SDLLockScreenConfiguration enabledConfigurationWithViewController:testViewController] notificationDispatcher:nil presenter:fakePresenter];
+ });
+
+ it(@"should set properties correctly", ^{
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ expect(testManager.lockScreenViewController).to(beNil());
+ });
+
+ describe(@"after it's started", ^{
+ beforeEach(^{
+ [testManager start];
+ });
+
+ it(@"should set up the view controller correctly", ^{
+ expect(@(fakePresenter.presented)).to(beFalsy());
+ expect(testManager.lockScreenViewController).toNot(beNil());
+ expect(testManager.lockScreenViewController).toNot(beAnInstanceOf([SDLLockScreenViewController class]));
+ expect(testManager.lockScreenViewController).to(equal(testViewController));
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenViewControllerSnapshotTests.m b/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenViewControllerSnapshotTests.m
new file mode 100644
index 000000000..7eedccfe2
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLLockScreenViewControllerSnapshotTests.m
@@ -0,0 +1,80 @@
+//
+// SDLLockScreenViewControllerSnapshotTests.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 7/27/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+@import UIKit;
+#import <FBSnapshotTestCase/FBSnapshotTestCase.h>
+
+#import "SDLLockScreenConfiguration.h"
+#import "SDLLockScreenViewController.h"
+
+
+@interface SDLLockScreenViewControllerSnapshotTests : FBSnapshotTestCase
+
+@property (strong, nonatomic) SDLLockScreenViewController *lockScreenViewController;
+
+@end
+
+
+@implementation SDLLockScreenViewControllerSnapshotTests
+
+- (void)setUp {
+ [super setUp];
+
+ self.lockScreenViewController = [[UIStoryboard storyboardWithName:@"SDLLockScreen" bundle:[NSBundle bundleForClass:[self class]]] instantiateInitialViewController];
+ self.lockScreenViewController.view.frame = [[UIScreen mainScreen] bounds];
+
+// self.deviceAgnostic = YES;
+// self.recordMode = YES;
+}
+
+- (void)tearDown {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ [super tearDown];
+}
+
+- (void)testNoAppNoVehicleIcons {
+ self.lockScreenViewController.appIcon = nil;
+ self.lockScreenViewController.vehicleIcon = nil;
+ self.lockScreenViewController.backgroundColor = [SDLLockScreenConfiguration enabledConfiguration].backgroundColor;
+
+ FBSnapshotVerifyView(self.lockScreenViewController.view, nil);
+}
+
+- (void)testOnlyAppIcon {
+ self.lockScreenViewController.appIcon = [UIImage imageNamed:@"TestLockScreenAppIcon" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
+ self.lockScreenViewController.vehicleIcon = nil;
+ self.lockScreenViewController.backgroundColor = [SDLLockScreenConfiguration enabledConfiguration].backgroundColor;
+
+ FBSnapshotVerifyView(self.lockScreenViewController.view, nil);
+}
+
+- (void)testOnlyVehicleIcon {
+ self.lockScreenViewController.appIcon = nil;
+ self.lockScreenViewController.vehicleIcon = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
+ self.lockScreenViewController.backgroundColor = [SDLLockScreenConfiguration enabledConfiguration].backgroundColor;
+
+ FBSnapshotVerifyView(self.lockScreenViewController.view, nil);
+}
+
+- (void)testAppAndVehicleIcons {
+ self.lockScreenViewController.appIcon = [UIImage imageNamed:@"TestLockScreenAppIcon" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];;
+ self.lockScreenViewController.vehicleIcon = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
+ self.lockScreenViewController.backgroundColor = [SDLLockScreenConfiguration enabledConfiguration].backgroundColor;
+
+ FBSnapshotVerifyView(self.lockScreenViewController.view, nil);
+}
+
+- (void)testLightBackgroundNoAppNoVehicleIcons {
+ self.lockScreenViewController.appIcon = nil;
+ self.lockScreenViewController.vehicleIcon = nil;
+ self.lockScreenViewController.backgroundColor = [UIColor whiteColor];
+
+ FBSnapshotVerifyView(self.lockScreenViewController.view, nil);
+}
+
+@end
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLNotificationDispatcherSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLNotificationDispatcherSpec.m
new file mode 100644
index 000000000..ba3b2f1c1
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLNotificationDispatcherSpec.m
@@ -0,0 +1,105 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLNotificationConstants.h"
+#import "SDLNotificationDispatcher.h"
+
+
+QuickSpecBegin(SDLNotificationDispatcherSpec)
+
+describe(@"a notification dispatcher", ^{
+ __block SDLNotificationDispatcher *testDispatcher = nil;
+
+ beforeEach(^{
+ testDispatcher = [[SDLNotificationDispatcher alloc] init];
+ });
+
+ it(@"should conform to SDLProxyListener", ^{
+ expect(@([testDispatcher conformsToProtocol:@protocol(SDLProxyListener)])).to(beTruthy());
+
+ expect(@([testDispatcher respondsToSelector:@selector(onOnDriverDistraction:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnHMIStatus:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onProxyClosed)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onProxyOpened)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onAddCommandResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onAddSubMenuResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onAlertManeuverResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onAlertResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onChangeRegistrationResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onCreateInteractionChoiceSetResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onDeleteCommandResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onDeleteInteractionChoiceSetResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onDeleteSubMenuResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onDiagnosticMessageResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onDialNumberResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onEncodedSyncPDataResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onEndAudioPassThruResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onError:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onGenericResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onGetDTCsResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onGetVehicleDataResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onReceivedLockScreenIcon:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnAppInterfaceUnregistered:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnAudioPassThru:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnButtonEvent:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnButtonPress:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnCommand:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnEncodedSyncPData:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnHashChange:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnLanguageChange:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnLockScreenNotification:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnSyncPData:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnSystemRequest:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnTBTClientState:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnTouchEvent:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onOnVehicleData:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onPerformAudioPassThruResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onPerformInteractionResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onPutFileResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onReadDIDResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onRegisterAppInterfaceResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onResetGlobalPropertiesResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onScrollableMessageResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onSendLocationResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onSetAppIconResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onSetDisplayLayoutResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onSetGlobalPropertiesResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onSetMediaClockTimerResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onShowConstantTBTResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onShowResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onSliderResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onSpeakResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onSubscribeButtonResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onSubscribeVehicleDataResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onSyncPDataResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onUpdateTurnListResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onUnregisterAppInterfaceResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onUnsubscribeButtonResponse:)])).to(beTruthy());
+ expect(@([testDispatcher respondsToSelector:@selector(onUnsubscribeVehicleDataResponse:)])).to(beTruthy());
+ });
+
+ describe(@"when told to post a notification", ^{
+ __block NSString *testNotificationName = nil;
+ __block NSString *testUserInfo = nil;
+
+ __block NSNotification *returnNotification = nil;
+
+ beforeEach(^{
+ testNotificationName = @"com.test.notification";
+ testUserInfo = @"testuserinfo";
+
+ [[NSNotificationCenter defaultCenter] addObserverForName:testNotificationName object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
+ returnNotification = note;
+ }];
+
+ [testDispatcher postNotificationName:testNotificationName infoObject:testUserInfo];
+ });
+
+ it(@"should post", ^{
+ expect(returnNotification.userInfo[SDLNotificationUserInfoObject]).toEventually(match(testUserInfo));
+ expect(returnNotification.object).toEventually(equal(testDispatcher));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionFilterSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionFilterSpec.m
new file mode 100644
index 000000000..ede06caf6
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionFilterSpec.m
@@ -0,0 +1,157 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLPermissionConstants.h"
+#import "SDLPermissionFilter.h"
+
+QuickSpecBegin(SDLPermissionFilterSpec)
+
+describe(@"A filter", ^{
+ __block NSString *testRPCName1 = nil;
+ __block NSString *testRPCName2 = nil;
+
+ beforeEach(^{
+ testRPCName1 = @"testRPCName1";
+ testRPCName2 = @"testRPCName2";
+ });
+
+ describe(@"should initialize correctly", ^{
+ __block NSArray<SDLPermissionRPCName *> *testRPCNames = nil;
+ __block SDLPermissionGroupType testGroupType = SDLPermissionGroupTypeAny;
+ __block SDLPermissionFilter *testFilter = nil;
+
+ __block NSDictionary<SDLPermissionRPCName *, NSNumber<SDLBool> *> *testObserverReturnChangedDict = nil;
+
+ beforeEach(^{
+ testRPCNames = @[testRPCName1, testRPCName2];
+ testGroupType = SDLPermissionGroupTypeAny;
+ });
+
+ context(@"using initWithRPCNames:changeType:observer:", ^{
+ beforeEach(^{
+ testFilter = [[SDLPermissionFilter alloc] initWithRPCNames:testRPCNames groupType:testGroupType observer:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ testObserverReturnChangedDict = changedDict;
+ }];
+ });
+
+ it(@"should set the rpcNames array correctly", ^{
+ expect(testFilter.rpcNames).to(equal(testRPCNames));
+ });
+
+ describe(@"it should set up the observer correctly", ^{
+ __block NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> *testObserverChangedDict = nil;
+ __block NSNumber<SDLBool> *testRPCName1Bool = nil;
+ __block NSNumber<SDLBool> *testRPCName2Bool = nil;
+ __block SDLPermissionGroupStatus testObserverGroupStatus = SDLPermissionGroupStatusUnknown;
+
+ beforeEach(^{
+ testRPCName1Bool = @YES;
+ testRPCName2Bool = @NO;
+ testObserverChangedDict = @{testRPCName1: testRPCName1Bool,
+ testRPCName2: testRPCName2Bool};
+ testObserverGroupStatus = SDLPermissionGroupStatusMixed;
+
+ testFilter.handler(testObserverChangedDict, testObserverGroupStatus);
+ });
+
+ it(@"should call the changedDict correctly", ^{
+ expect(testObserverReturnChangedDict).to(equal(testObserverChangedDict));
+ });
+
+ it(@"should call the status correctly", ^{
+ expect(@(testObserverGroupStatus)).to(equal(@(testObserverGroupStatus)));
+ });
+ });
+ });
+
+ context(@"using filterWithRPCNames:changeType:observer:", ^{
+ beforeEach(^{
+ testFilter = [SDLPermissionFilter filterWithRPCNames:testRPCNames groupType:testGroupType observer:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ testObserverReturnChangedDict = changedDict;
+ }];
+ });
+
+ it(@"should set the rpcNames array correctly", ^{
+ expect(testFilter.rpcNames).to(equal(testRPCNames));
+ });
+
+ describe(@"it should set up the observer correctly", ^{
+ __block NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> *testObserverChangedDict = nil;
+ __block NSNumber<SDLBool> *testRPCName1Bool = nil;
+ __block NSNumber<SDLBool> *testRPCName2Bool = nil;
+ __block SDLPermissionGroupStatus testObserverGroupStatus = SDLPermissionGroupStatusUnknown;
+
+ beforeEach(^{
+ testRPCName1Bool = @YES;
+ testRPCName2Bool = @NO;
+ testObserverChangedDict = @{testRPCName1: testRPCName1Bool,
+ testRPCName2: testRPCName2Bool};
+ testObserverGroupStatus = SDLPermissionGroupStatusMixed;
+
+ testFilter.handler(testObserverChangedDict, testObserverGroupStatus);
+ });
+
+ it(@"should call the changedDict correctly", ^{
+ expect(testObserverReturnChangedDict).to(equal(testObserverChangedDict));
+ });
+
+ it(@"should call the status correctly", ^{
+ expect(@(testObserverGroupStatus)).to(equal(@(testObserverGroupStatus)));
+ });
+ });
+ });
+ });
+
+ describe(@"copying a filter", ^{
+ __block SDLPermissionFilter *testFilter = nil;
+ __block SDLPermissionFilter *testCopiedFilter = nil;
+
+ beforeEach(^{
+ testFilter = [SDLPermissionFilter filterWithRPCNames:@[testRPCName1] groupType:SDLPermissionGroupTypeAny observer:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {}];
+ testCopiedFilter = [testFilter copy];
+ });
+
+ it(@"should say copied filters are not the same instance", ^{
+ expect(testCopiedFilter).toNot(beIdenticalTo(testFilter));
+ });
+
+ it(@"should copy the identifier correctly", ^{
+ expect(testCopiedFilter.identifier).to(equal(testFilter.identifier));
+ });
+
+ it(@"should copy the filter array correctly", ^{
+ expect(testCopiedFilter.rpcNames).to(equal(testFilter.rpcNames));
+ });
+
+ it(@"should copy the change type correctly", ^{
+ expect(@(testCopiedFilter.groupType)).to(equal(@(testFilter.groupType)));
+ });
+
+ it(@"should copy the observer correctly", ^{
+ expect(testCopiedFilter.handler).to(equal(testFilter.handler));
+ });
+ });
+
+ describe(@"testing equality", ^{
+ __block SDLPermissionFilter *testSameFilter1 = nil;
+ __block SDLPermissionFilter *testSameFilter2 = nil;
+ __block SDLPermissionFilter *testDifferentFilter = nil;
+
+ beforeEach(^{
+ testSameFilter1 = [SDLPermissionFilter filterWithRPCNames:@[testRPCName1] groupType:SDLPermissionGroupTypeAny observer:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {}];
+ testSameFilter2 = [testSameFilter1 copy];
+
+ testDifferentFilter = [SDLPermissionFilter filterWithRPCNames:@[testRPCName1] groupType:SDLPermissionGroupTypeAny observer:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {}];
+ });
+
+ it(@"should say copied filters are the same", ^{
+ expect(testSameFilter1).to(equal(testSameFilter2));
+ });
+
+ it(@"should say new filters are different", ^{
+ expect(testSameFilter1).toNot(equal(testDifferentFilter));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m
new file mode 100644
index 000000000..95ebc515e
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPermissionsManagerSpec.m
@@ -0,0 +1,887 @@
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLHMILevel.h"
+#import "SDLHMIPermissions.h"
+#import "SDLNotificationConstants.h"
+#import "SDLOnHMIStatus.h"
+#import "SDLOnPermissionsChange.h"
+#import "SDLParameterPermissions.h"
+#import "SDLPermissionItem.h"
+#import "SDLPermissionManager.h"
+#import "SDLRPCNotificationNotification.h"
+#import "SDLRPCResponseNotification.h"
+
+QuickSpecBegin(SDLPermissionsManagerSpec)
+
+describe(@"SDLPermissionsManager", ^{
+ __block SDLPermissionManager *testPermissionsManager = nil;
+
+ __block NSString *testRPCNameAllAllowed = nil;
+ __block NSString *testRPCNameAllDisallowed = nil;
+ __block NSString *testRPCNameFullLimitedAllowed = nil;
+ __block NSString *testRPCNameFullLimitedBackgroundAllowed = nil;
+
+ __block SDLPermissionItem *testPermissionAllAllowed = nil;
+ __block SDLHMIPermissions *testHMIPermissionsAllAllowed = nil;
+ __block SDLPermissionItem *testPermissionAllDisallowed = nil;
+ __block SDLHMIPermissions *testHMIPermissionsAllDisallowed = nil;
+ __block SDLPermissionItem *testPermissionFullLimitedAllowed = nil;
+ __block SDLHMIPermissions *testHMIPermissionsFullLimitedAllowed = nil;
+ __block SDLPermissionItem *testPermissionFullLimitedBackgroundAllowed = nil;
+ __block SDLHMIPermissions *testHMIPermissionsFullLimitedBackgroundAllowed = nil;
+
+ __block SDLOnPermissionsChange *testPermissionsChange = nil;
+
+ __block SDLOnHMIStatus *testLimitedHMIStatus = nil;
+ __block SDLOnHMIStatus *testBackgroundHMIStatus = nil;
+ __block SDLOnHMIStatus *testNoneHMIStatus = nil;
+
+ __block SDLRPCNotificationNotification *testPermissionsNotification = nil;
+ __block SDLRPCNotificationNotification *limitedHMINotification = nil;
+ __block SDLRPCNotificationNotification *backgroundHMINotification = nil;
+ __block SDLRPCNotificationNotification *noneHMINotification = nil;
+
+ beforeEach(^{
+ // Permission Names
+ testRPCNameAllAllowed = @"AllAllowed";
+ testRPCNameAllDisallowed = @"AllDisallowed";
+ testRPCNameFullLimitedAllowed = @"FullAndLimitedAllowed";
+ testRPCNameFullLimitedBackgroundAllowed = @"FullAndLimitedAndBackgroundAllowed";
+
+ // Create a manager
+ testPermissionsManager = [[SDLPermissionManager alloc] init];
+
+ // Permission states
+ testHMIPermissionsAllAllowed = [[SDLHMIPermissions alloc] init];
+ testHMIPermissionsAllAllowed.allowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel BACKGROUND], [SDLHMILevel FULL], [SDLHMILevel LIMITED], [SDLHMILevel NONE]]];
+
+ testHMIPermissionsAllDisallowed = [[SDLHMIPermissions alloc] init];
+ testHMIPermissionsAllDisallowed.userDisallowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel BACKGROUND], [SDLHMILevel FULL], [SDLHMILevel LIMITED], [SDLHMILevel NONE]]];
+
+ testHMIPermissionsFullLimitedAllowed = [[SDLHMIPermissions alloc] init];
+ testHMIPermissionsFullLimitedAllowed.allowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel FULL], [SDLHMILevel LIMITED]]];
+ testHMIPermissionsFullLimitedAllowed.userDisallowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel BACKGROUND], [SDLHMILevel NONE]]];
+
+ testHMIPermissionsFullLimitedBackgroundAllowed = [[SDLHMIPermissions alloc] init];
+ testHMIPermissionsFullLimitedBackgroundAllowed.allowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel FULL], [SDLHMILevel LIMITED], [SDLHMILevel BACKGROUND]]];
+ testHMIPermissionsFullLimitedBackgroundAllowed.userDisallowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel NONE]]];
+
+ // Assemble Permissions
+ SDLParameterPermissions *testParameterPermissions = [[SDLParameterPermissions alloc] init];
+
+ testPermissionAllAllowed = [[SDLPermissionItem alloc] init];
+ testPermissionAllAllowed.rpcName = testRPCNameAllAllowed;
+ testPermissionAllAllowed.hmiPermissions = testHMIPermissionsAllAllowed;
+ testPermissionAllAllowed.parameterPermissions = testParameterPermissions;
+
+ testPermissionAllDisallowed = [[SDLPermissionItem alloc] init];
+ testPermissionAllDisallowed.rpcName = testRPCNameAllDisallowed;
+ testPermissionAllDisallowed.hmiPermissions = testHMIPermissionsAllDisallowed;
+ testPermissionAllDisallowed.parameterPermissions = testParameterPermissions;
+
+ testPermissionFullLimitedAllowed = [[SDLPermissionItem alloc] init];
+ testPermissionFullLimitedAllowed.rpcName = testRPCNameFullLimitedAllowed;
+ testPermissionFullLimitedAllowed.hmiPermissions = testHMIPermissionsFullLimitedAllowed;
+ testPermissionFullLimitedAllowed.parameterPermissions = testParameterPermissions;
+
+ testPermissionFullLimitedBackgroundAllowed = [[SDLPermissionItem alloc] init];
+ testPermissionFullLimitedBackgroundAllowed.rpcName = testRPCNameFullLimitedBackgroundAllowed;
+ testPermissionFullLimitedBackgroundAllowed.hmiPermissions = testHMIPermissionsFullLimitedBackgroundAllowed;
+ testPermissionFullLimitedBackgroundAllowed.parameterPermissions = testParameterPermissions;
+
+ // Create OnHMIStatus objects
+ testLimitedHMIStatus = [[SDLOnHMIStatus alloc] init];
+ testLimitedHMIStatus.hmiLevel = [SDLHMILevel LIMITED];
+
+ testBackgroundHMIStatus = [[SDLOnHMIStatus alloc] init];
+ testBackgroundHMIStatus.hmiLevel = [SDLHMILevel BACKGROUND];
+
+ testNoneHMIStatus = [[SDLOnHMIStatus alloc] init];
+ testNoneHMIStatus.hmiLevel = [SDLHMILevel NONE];
+
+ // Create OnPermissionsChange object
+ testPermissionsChange = [[SDLOnPermissionsChange alloc] init];
+ testPermissionsChange.permissionItem = [NSMutableArray arrayWithArray:@[testPermissionAllAllowed, testPermissionAllDisallowed, testPermissionFullLimitedAllowed, testPermissionFullLimitedBackgroundAllowed]];
+
+ // Permission Notifications
+ testPermissionsNotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangePermissionsNotification object:nil rpcNotification:testPermissionsChange];
+ limitedHMINotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:testLimitedHMIStatus];
+ backgroundHMINotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:testBackgroundHMIStatus];
+ noneHMINotification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:testNoneHMIStatus];
+ });
+
+ describe(@"checking if a permission is allowed", ^{
+ __block NSString *someRPCName = nil;
+ __block BOOL testResultBOOL = NO;
+
+ context(@"when no permissions exist", ^{
+ beforeEach(^{
+ someRPCName = @"some rpc name";
+
+ testResultBOOL = [testPermissionsManager isRPCAllowed:someRPCName];
+ });
+
+ it(@"should not be allowed", ^{
+ expect(@(testResultBOOL)).to(equal(@NO));
+ });
+ });
+
+ context(@"when permissions exist but no HMI level", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultBOOL = [testPermissionsManager isRPCAllowed:testRPCNameAllAllowed];
+ });
+
+ it(@"should not be allowed", ^{
+ expect(@(testResultBOOL)).to(equal(@NO));
+ });
+ });
+
+ context(@"when permissions exist", ^{
+ context(@"and the permission is allowed", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultBOOL = [testPermissionsManager isRPCAllowed:testRPCNameAllAllowed];
+ });
+
+ it(@"should be allowed", ^{
+ expect(@(testResultBOOL)).to(equal(@YES));
+ });
+ });
+
+ context(@"and the permission is denied", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultBOOL = [testPermissionsManager isRPCAllowed:testRPCNameAllDisallowed];
+ });
+
+ it(@"should be denied", ^{
+ expect(@(testResultBOOL)).to(equal(@NO));
+ });
+ });
+ });
+ });
+
+ describe(@"checking the group status of RPCs", ^{
+ __block SDLPermissionGroupStatus testResultStatus = SDLPermissionGroupStatusUnknown;
+
+ context(@"with no permissions data", ^{
+ beforeEach(^{
+ testResultStatus = [testPermissionsManager groupStatusOfRPCs:@[testRPCNameAllAllowed, testRPCNameAllDisallowed]];
+ });
+
+ it(@"should return unknown", ^{
+ expect(@(testResultStatus)).to(equal(@(SDLPermissionGroupStatusUnknown)));
+ });
+ });
+
+ context(@"for an all allowed group", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultStatus = [testPermissionsManager groupStatusOfRPCs:@[testRPCNameAllAllowed, testRPCNameFullLimitedAllowed]];
+ });
+
+ it(@"should return mixed", ^{
+ expect(@(testResultStatus)).to(equal(@(SDLPermissionGroupStatusAllowed)));
+ });
+ });
+
+ context(@"for an all disallowed group", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:backgroundHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultStatus = [testPermissionsManager groupStatusOfRPCs:@[testRPCNameFullLimitedAllowed, testRPCNameAllDisallowed]];
+ });
+
+ it(@"should return mixed", ^{
+ expect(@(testResultStatus)).to(equal(@(SDLPermissionGroupStatusDisallowed)));
+ });
+ });
+
+ context(@"for a mixed group", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultStatus = [testPermissionsManager groupStatusOfRPCs:@[testRPCNameAllAllowed, testRPCNameAllDisallowed]];
+ });
+
+ it(@"should return mixed", ^{
+ expect(@(testResultStatus)).to(equal(@(SDLPermissionGroupStatusMixed)));
+ });
+ });
+ });
+
+ describe(@"checking the status of RPCs", ^{
+ __block NSDictionary<SDLPermissionRPCName *, NSNumber<SDLBool> *> *testResultPermissionStatusDict = nil;
+
+ context(@"with no permissions data", ^{
+ beforeEach(^{
+ testResultPermissionStatusDict = [testPermissionsManager statusOfRPCs:@[testRPCNameAllAllowed, testRPCNameAllDisallowed]];
+ });
+
+ it(@"should return correct permission statuses", ^{
+ expect(testResultPermissionStatusDict[testRPCNameAllAllowed]).to(equal(@NO));
+ expect(testResultPermissionStatusDict[testRPCNameAllDisallowed]).to(equal(@NO));
+ });
+ });
+
+ context(@"with permissions data", ^{
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ testResultPermissionStatusDict = [testPermissionsManager statusOfRPCs:@[testRPCNameAllAllowed, testRPCNameAllDisallowed]];
+ });
+
+ it(@"should return correct permission statuses", ^{
+ expect(testResultPermissionStatusDict[testRPCNameAllAllowed]).to(equal(@YES));
+ expect(testResultPermissionStatusDict[testRPCNameAllDisallowed]).to(equal(@NO));
+ });
+ });
+ });
+
+ describe(@"adding and using observers", ^{
+ describe(@"adding new observers", ^{
+ context(@"when no data is present", ^{
+ __block BOOL testObserverCalled = NO;
+ __block SDLPermissionGroupStatus testObserverStatus = SDLPermissionGroupStatusUnknown;
+ __block NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> *testObserverChangeDict = nil;
+
+ beforeEach(^{
+ testObserverCalled = NO;
+ testObserverStatus = SDLPermissionGroupStatusUnknown;
+ testObserverChangeDict = nil;
+
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameAllDisallowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ testObserverChangeDict = change;
+ testObserverStatus = status;
+ testObserverCalled = YES;
+ }];
+ });
+
+ it(@"should return correct permission statuses", ^{
+ expect(@(testObserverCalled)).to(equal(@YES));
+ expect(@(testObserverStatus)).to(equal(@(SDLPermissionGroupStatusUnknown)));
+ expect(testObserverChangeDict[testRPCNameAllAllowed]).to(equal(@NO));
+ expect(testObserverChangeDict[testRPCNameAllDisallowed]).to(equal(@NO));
+ });
+ });
+
+ context(@"when data is already present", ^{
+ __block NSInteger numberOfTimesObserverCalled = 0;
+ __block NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> *testObserverBlockChangedDict = nil;
+ __block SDLPermissionGroupStatus testObserverReturnStatus = SDLPermissionGroupStatusUnknown;
+
+ context(@"to match an ANY observer", ^{
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+
+ // Post the notification before setting the observer to make sure data is already present
+ // HMI Full & Limited allowed
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ // This should be called twice, once for each RPC being observed. It should be called immediately since data should already be present
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameAllDisallowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ testObserverBlockChangedDict = changedDict;
+ testObserverReturnStatus = status;
+ }];
+ });
+
+ it(@"should call the observer with proper status", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@1));
+ expect(testObserverBlockChangedDict[testRPCNameAllAllowed]).to(equal(@YES));
+ expect(testObserverBlockChangedDict[testRPCNameAllDisallowed]).to(equal(@NO));
+ expect(testObserverBlockChangedDict.allKeys).to(haveCount(@2));
+ expect(@(testObserverReturnStatus)).to(equal(@(SDLPermissionGroupStatusMixed)));
+ });
+ });
+
+ context(@"to match an all allowed observer", ^{
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+
+ // Post the notification before setting the observer to make sure data is already present
+ // HMI Full & Limited allowed, hmi level LIMITED
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ // This should be called twice, once for each RPC being observed. It should be called immediately since data should already be present
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameFullLimitedAllowed] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ testObserverBlockChangedDict = change;
+ testObserverReturnStatus = status;
+ }];
+ });
+
+ it(@"should call the observer with proper status", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@1));
+ expect(testObserverBlockChangedDict[testRPCNameAllAllowed]).to(equal(@YES));
+ expect(testObserverBlockChangedDict[testRPCNameFullLimitedAllowed]).to(equal(@YES));
+ expect(testObserverBlockChangedDict.allKeys).to(haveCount(@2));
+ expect(@(testObserverReturnStatus)).to(equal(@(SDLPermissionGroupStatusAllowed)));
+ });
+ });
+
+ context(@"that does not match an all allowed observer", ^{
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+
+ // Post the notification before setting the observer to make sure data is already present
+ // HMI Full & Limited allowed, hmi level NONE
+ [[NSNotificationCenter defaultCenter] postNotification:noneHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ // This should be called twice, once for each RPC being observed. It should be called immediately since data should already be present
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllDisallowed, testRPCNameFullLimitedAllowed] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ testObserverReturnStatus = status;
+ }];
+ });
+
+ it(@"should call the observer with status Disallowed", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@1));
+ expect(@(testObserverReturnStatus)).to(equal(@(SDLPermissionGroupStatusDisallowed)));
+ });
+ });
+ });
+ });
+
+ context(@"updating an observer with new permission data", ^{
+ __block NSInteger numberOfTimesObserverCalled = 0;
+
+ __block SDLOnPermissionsChange *testPermissionChangeUpdate = nil;
+ __block SDLPermissionItem *testPermissionUpdated = nil;
+ __block NSMutableArray<NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> *> *changeDicts = nil;
+ __block NSMutableArray<NSNumber<SDLUInt> *> *testStatuses = nil;
+
+ context(@"to match an ANY observer", ^{
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+ changeDicts = [NSMutableArray array];
+ testStatuses = [NSMutableArray array];
+
+ // Post the notification before setting the observer to make sure data is already present
+ // HMI Full & Limited allowed, hmi level LIMITED
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ // Set an observer that should be called immediately for the preexisting data, then called again when new data is sent
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameAllDisallowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ [changeDicts addObject:changedDict];
+ }];
+
+ // Create a permission update disallowing our current HMI level for the observed permission
+ SDLParameterPermissions *testParameterPermissions = [[SDLParameterPermissions alloc] init];
+ SDLHMIPermissions *testHMIPermissionsUpdated = [[SDLHMIPermissions alloc] init];
+ testHMIPermissionsUpdated.allowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel BACKGROUND], [SDLHMILevel FULL]]];
+ testHMIPermissionsUpdated.userDisallowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel LIMITED], [SDLHMILevel NONE]]];
+
+ testPermissionUpdated = [[SDLPermissionItem alloc] init];
+ testPermissionUpdated.rpcName = testRPCNameAllAllowed;
+ testPermissionUpdated.hmiPermissions = testHMIPermissionsUpdated;
+ testPermissionUpdated.parameterPermissions = testParameterPermissions;
+
+ testPermissionChangeUpdate = [[SDLOnPermissionsChange alloc] init];
+ testPermissionChangeUpdate.permissionItem = [NSMutableArray arrayWithObject:testPermissionUpdated];
+
+ // Send the permission update
+ NSNotification *updatedNotification = [NSNotification notificationWithName:SDLDidChangePermissionsNotification object:nil userInfo:@{SDLNotificationUserInfoObject: testPermissionChangeUpdate}];
+ [[NSNotificationCenter defaultCenter] postNotification:updatedNotification];
+ });
+
+ it(@"should call the observer twice", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@2));
+ });
+
+ it(@"should have proper data in the first change dict", ^{
+ expect(changeDicts[0].allKeys).to(contain(testRPCNameAllAllowed));
+ expect(changeDicts[0].allKeys).to(contain(testRPCNameAllDisallowed));
+
+ NSNumber<SDLBool> *allAllowed = changeDicts[0][testRPCNameAllAllowed];
+ expect(allAllowed).to(equal(@YES));
+
+ NSNumber<SDLBool> *allDisallowed = changeDicts[0][testRPCNameAllDisallowed];
+ expect(allDisallowed).to(equal(@NO));
+ });
+
+ it(@"should have the proper data in the second change dict", ^{
+ expect(changeDicts[1].allKeys).to(contain(testRPCNameAllAllowed));
+ expect(changeDicts[1].allKeys).to(contain(testRPCNameAllDisallowed));
+
+ NSNumber<SDLBool> *allAllowed = changeDicts[1][testRPCNameAllAllowed];
+ expect(allAllowed).to(equal(@NO));
+
+ NSNumber<SDLBool> *allDisallowed = changeDicts[1][testRPCNameAllDisallowed];
+ expect(allDisallowed).to(equal(@NO));
+ });
+ });
+
+ context(@"to match an all allowed observer", ^{
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+ changeDicts = [NSMutableArray array];
+ testStatuses = [NSMutableArray array];
+
+ // Post the notification before setting the observer to make sure data is already present
+ // HMI Full & Limited allowed, hmi level BACKGROUND
+ [[NSNotificationCenter defaultCenter] postNotification:backgroundHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+ });
+
+ context(@"so that it becomes All Allowed", ^{
+ beforeEach(^{
+ // Set an observer that should be called immediately for the preexisting data, then called again when new data is sent
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllDisallowed, testRPCNameFullLimitedBackgroundAllowed] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ [changeDicts addObject:change];
+ [testStatuses addObject:@(status)];
+ }];
+
+ // Create a permission update allowing our current HMI level for the observed permission
+ SDLParameterPermissions *testParameterPermissions = [[SDLParameterPermissions alloc] init];
+ SDLHMIPermissions *testHMIPermissionsUpdated = [[SDLHMIPermissions alloc] init];
+ testHMIPermissionsUpdated.allowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel LIMITED], [SDLHMILevel NONE], [SDLHMILevel BACKGROUND], [SDLHMILevel FULL]]];
+ testHMIPermissionsUpdated.userDisallowed = [NSMutableArray arrayWithArray:@[]];
+
+ testPermissionUpdated = [[SDLPermissionItem alloc] init];
+ testPermissionUpdated.rpcName = testRPCNameAllDisallowed;
+ testPermissionUpdated.hmiPermissions = testHMIPermissionsUpdated;
+ testPermissionUpdated.parameterPermissions = testParameterPermissions;
+
+ testPermissionChangeUpdate = [[SDLOnPermissionsChange alloc] init];
+ testPermissionChangeUpdate.permissionItem = [NSMutableArray arrayWithObject:testPermissionUpdated];
+
+ // Send the permission update
+ NSNotification *updatedNotification = [NSNotification notificationWithName:SDLDidChangePermissionsNotification object:nil userInfo:@{SDLNotificationUserInfoObject: testPermissionChangeUpdate}];
+ [[NSNotificationCenter defaultCenter] postNotification:updatedNotification];
+ });
+
+ it(@"should call the observer twice", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@2));
+ });
+
+ it(@"should have proper data in the first change dict", ^{
+ expect(changeDicts[0].allKeys).to(haveCount(@2));
+ expect(testStatuses[0]).to(equal(@(SDLPermissionGroupStatusMixed)));
+ });
+
+ it(@"should have the proper data in the second change dict", ^{
+ expect(changeDicts[1].allKeys).to(haveCount(@2));
+ expect(testStatuses[1]).to(equal(@(SDLPermissionGroupStatusAllowed)));
+ });
+ });
+
+ context(@"so that it goes from All Allowed to mixed", ^{
+ beforeEach(^{
+ // Set an observer that should be called immediately for the preexisting data, then called again when new data is sent
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ [changeDicts addObject:change];
+ [testStatuses addObject:@(status)];
+ }];
+
+ // Create a permission update disallowing our current HMI level for the observed permission
+ SDLParameterPermissions *testParameterPermissions = [[SDLParameterPermissions alloc] init];
+ SDLHMIPermissions *testHMIPermissionsUpdated = [[SDLHMIPermissions alloc] init];
+ testHMIPermissionsUpdated.allowed = [NSMutableArray arrayWithArray:@[]];
+ testHMIPermissionsUpdated.userDisallowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel BACKGROUND], [SDLHMILevel FULL], [SDLHMILevel LIMITED], [SDLHMILevel NONE]]];
+
+ testPermissionUpdated = [[SDLPermissionItem alloc] init];
+ testPermissionUpdated.rpcName = testRPCNameAllAllowed;
+ testPermissionUpdated.hmiPermissions = testHMIPermissionsUpdated;
+ testPermissionUpdated.parameterPermissions = testParameterPermissions;
+
+ testPermissionChangeUpdate = [[SDLOnPermissionsChange alloc] init];
+ testPermissionChangeUpdate.permissionItem = [NSMutableArray arrayWithObject:testPermissionUpdated];
+
+ // Send the permission update
+ NSNotification *updatedNotification = [NSNotification notificationWithName:SDLDidChangePermissionsNotification object:nil userInfo:@{SDLNotificationUserInfoObject: testPermissionChangeUpdate}];
+ [[NSNotificationCenter defaultCenter] postNotification:updatedNotification];
+ });
+
+ it(@"should call the observer twice", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@2));
+ });
+
+ it(@"should have proper data in the first change dict", ^{
+ expect(testStatuses[0]).to(equal(@(SDLPermissionGroupStatusAllowed)));
+ expect(changeDicts[0].allKeys).to(contain(testRPCNameAllAllowed));
+
+ NSNumber<SDLBool> *isAllowed = changeDicts[0][testRPCNameAllAllowed];
+ expect(isAllowed).to(equal(@YES));
+ });
+
+ it(@"should have the proper data in the second change dict", ^{
+ expect(testStatuses[1]).to(equal(@(SDLPermissionGroupStatusDisallowed)));
+ expect(changeDicts[1].allKeys).to(contain(testRPCNameAllAllowed));
+
+ NSNumber<SDLBool> *isAllowed = changeDicts[1][testRPCNameAllAllowed];
+ expect(isAllowed).to(equal(@NO));
+ });
+ });
+ });
+
+ context(@"to not match an all allowed observer", ^{
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+ changeDicts = [NSMutableArray array];
+ testStatuses = [NSMutableArray array];
+
+ // Post the notification before setting the observer to make sure data is already present
+ // HMI Full & Limited allowed, hmi level BACKGROUND
+ [[NSNotificationCenter defaultCenter] postNotification:backgroundHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+ });
+
+ context(@"from mixed to disallowed", ^{
+ beforeEach(^{
+ // Set an observer that should be called immediately for the preexisting data, then called again when new data is sent
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameAllDisallowed] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ [changeDicts addObject:change];
+ [testStatuses addObject:@(status)];
+ }];
+
+ // Create a permission update disallowing our current HMI level for the observed permission
+ SDLParameterPermissions *testParameterPermissions = [[SDLParameterPermissions alloc] init];
+ SDLHMIPermissions *testHMIPermissionsUpdated = [[SDLHMIPermissions alloc] init];
+ testHMIPermissionsUpdated.allowed = [NSMutableArray arrayWithArray:@[]];
+ testHMIPermissionsUpdated.userDisallowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel BACKGROUND], [SDLHMILevel FULL], [SDLHMILevel LIMITED], [SDLHMILevel NONE]]];
+
+ testPermissionUpdated = [[SDLPermissionItem alloc] init];
+ testPermissionUpdated.rpcName = testRPCNameAllAllowed;
+ testPermissionUpdated.hmiPermissions = testHMIPermissionsUpdated;
+ testPermissionUpdated.parameterPermissions = testParameterPermissions;
+
+ testPermissionChangeUpdate = [[SDLOnPermissionsChange alloc] init];
+ testPermissionChangeUpdate.permissionItem = [NSMutableArray arrayWithObject:testPermissionUpdated];
+
+ // Send the permission update
+ NSNotification *updatedNotification = [NSNotification notificationWithName:SDLDidChangePermissionsNotification object:nil userInfo:@{SDLNotificationUserInfoObject: testPermissionChangeUpdate}];
+ [[NSNotificationCenter defaultCenter] postNotification:updatedNotification];
+ });
+
+ it(@"should call the observer with a mixed status", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@1));
+ expect(testStatuses[0]).to(equal(@(SDLPermissionGroupStatusMixed)));
+ });
+ });
+
+ context(@"from disallowed to mixed", ^{
+ beforeEach(^{
+ // Set an observer that should be called immediately for the preexisting data, then called again when new data is sent
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameFullLimitedAllowed, testRPCNameAllDisallowed] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ [changeDicts addObject:change];
+ [testStatuses addObject:@(status)];
+ }];
+
+ // Create a permission update disallowing our current HMI level for the observed permission
+ SDLParameterPermissions *testParameterPermissions = [[SDLParameterPermissions alloc] init];
+ SDLHMIPermissions *testHMIPermissionsUpdated = [[SDLHMIPermissions alloc] init];
+ testHMIPermissionsUpdated.allowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel LIMITED], [SDLHMILevel BACKGROUND]]];
+ testHMIPermissionsUpdated.userDisallowed = [NSMutableArray arrayWithArray:@[[SDLHMILevel FULL], [SDLHMILevel NONE]]];
+
+ testPermissionUpdated = [[SDLPermissionItem alloc] init];
+ testPermissionUpdated.rpcName = testRPCNameAllAllowed;
+ testPermissionUpdated.hmiPermissions = testHMIPermissionsUpdated;
+ testPermissionUpdated.parameterPermissions = testParameterPermissions;
+
+ testPermissionChangeUpdate = [[SDLOnPermissionsChange alloc] init];
+ testPermissionChangeUpdate.permissionItem = [NSMutableArray arrayWithObject:testPermissionUpdated];
+
+ // Send the permission update
+ NSNotification *updatedNotification = [NSNotification notificationWithName:SDLDidChangePermissionsNotification object:nil userInfo:@{SDLNotificationUserInfoObject: testPermissionChangeUpdate}];
+ [[NSNotificationCenter defaultCenter] postNotification:updatedNotification];
+ });
+
+ it(@"should call the observer", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@1));
+ expect(testStatuses[0]).to(equal(@(SDLPermissionGroupStatusDisallowed)));
+ });
+ });
+ });
+ });
+
+ context(@"updating an observer with a new HMI level", ^{
+ __block NSInteger numberOfTimesObserverCalled = 0;
+ __block NSMutableArray<NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> *> *changeDicts = nil;
+ __block NSMutableArray<NSNumber<SDLUInt> *> *testStatuses = nil;
+
+ context(@"to match an ANY observer", ^{
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+ changeDicts = [NSMutableArray array];
+ testStatuses = [NSMutableArray array];
+
+ // Post the notification before setting the observer to make sure data is already present
+ // HMI Full & Limited allowed, hmi level BACKGROUND
+ [[NSNotificationCenter defaultCenter] postNotification:backgroundHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+
+ // Set an observer that should be called immediately for the preexisting data, then called again when new data is sent
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameFullLimitedAllowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ [changeDicts addObject:changedDict];
+ [testStatuses addObject:@(status)];
+ }];
+
+ // Upgrade the HMI level to LIMITED
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ });
+
+ it(@"should call the observer twice", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@2));
+ });
+
+ it(@"should have proper data in the first change dict", ^{
+ NSNumber<SDLBool> *allAllowed = changeDicts[0][testRPCNameAllAllowed];
+ expect(allAllowed).to(equal(@YES));
+
+ NSNumber<SDLBool> *fullLimitedAllowed = changeDicts[0][testRPCNameFullLimitedAllowed];
+ expect(fullLimitedAllowed).to(equal(@NO));
+
+ expect(testStatuses[0]).to(equal(@(SDLPermissionGroupStatusMixed)));
+ });
+
+ it(@"should have the proper data in the second change dict", ^{
+ NSNumber<SDLBool> *allAllowed = changeDicts[1][testRPCNameAllAllowed];
+ expect(allAllowed).to(equal(@YES));
+
+ NSNumber<SDLBool> *fullLimitedAllowed = changeDicts[1][testRPCNameFullLimitedAllowed];
+ expect(fullLimitedAllowed).to(equal(@YES));
+
+ expect(testStatuses[1]).to(equal(@(SDLPermissionGroupStatusAllowed)));
+ });
+ });
+
+ context(@"to match an all allowed observer", ^{
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+ changeDicts = [NSMutableArray array];
+ testStatuses = [NSMutableArray array];
+
+ // Post the notification before setting the observer to make sure data is already present
+ // HMI Full & Limited allowed, hmi level BACKGROUND
+ [[NSNotificationCenter defaultCenter] postNotification:backgroundHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+ });
+
+ context(@"so that it becomes All Allowed", ^{
+ beforeEach(^{
+ // Set an observer that should be called immediately for the preexisting data, then called again when new data is sent
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameFullLimitedAllowed] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ [changeDicts addObject:changedDict];
+ [testStatuses addObject:@(status)];
+ }];
+
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ });
+
+ it(@"should call the observer", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@2));
+
+ expect(testStatuses[0]).to(equal(@(SDLPermissionGroupStatusDisallowed)));
+ expect(testStatuses[1]).to(equal(@(SDLPermissionGroupStatusAllowed)));
+ });
+ });
+
+ context(@"so that it goes from All Allowed to at least some disallowed", ^{
+ beforeEach(^{
+ // Set an observer that should be called immediately for the preexisting data, then called again when new data is sent
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameFullLimitedBackgroundAllowed] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ [changeDicts addObject:changedDict];
+ [testStatuses addObject:@(status)];
+ }];
+
+ [[NSNotificationCenter defaultCenter] postNotification:noneHMINotification];
+ });
+
+ it(@"should call the observer twice", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@2));
+ });
+
+ it(@"should have proper data in the first change dict", ^{
+ expect(changeDicts[0].allKeys).to(contain(testRPCNameFullLimitedBackgroundAllowed));
+
+ NSNumber<SDLBool> *isAllowed = changeDicts[0][testRPCNameFullLimitedBackgroundAllowed];
+ expect(isAllowed).to(equal(@YES));
+
+ expect(testStatuses[0]).to(equal(@(SDLPermissionGroupStatusAllowed)));
+ });
+
+ it(@"should have the proper data in the second change dict", ^{
+ expect(changeDicts[1].allKeys).to(contain(testRPCNameFullLimitedBackgroundAllowed));
+
+ NSNumber<SDLBool> *isAllowed = changeDicts[1][testRPCNameFullLimitedBackgroundAllowed];
+ expect(isAllowed).to(equal(@NO));
+
+ expect(testStatuses[1]).to(equal(@(SDLPermissionGroupStatusDisallowed)));
+ });
+ });
+ });
+
+ context(@"to not match an all allowed observer", ^{
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+ changeDicts = [NSMutableArray array];
+ testStatuses = [NSMutableArray array];
+
+ // Post the notification before setting the observer to make sure data is already present
+ // HMI Full & Limited allowed, hmi level BACKGROUND
+ [[NSNotificationCenter defaultCenter] postNotification:backgroundHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+ });
+
+ context(@"that goes from disallowed to mixed", ^{
+ beforeEach(^{
+ // Set an observer that should be called immediately for the preexisting data, then called again when new data is sent
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameFullLimitedAllowed, testRPCNameAllDisallowed] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ [changeDicts addObject:changedDict];
+ [testStatuses addObject:@(status)];
+ }];
+
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ });
+
+ it(@"should call the observer", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@1));
+
+ expect(testStatuses[0]).to(equal(@(SDLPermissionGroupStatusDisallowed)));
+ });
+ });
+
+ context(@"that goes from mixed to disallowed", ^{
+ beforeEach(^{
+ // Set an observer that should be called immediately for the preexisting data, then called again when new data is sent
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameFullLimitedAllowed, testRPCNameFullLimitedBackgroundAllowed] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ [changeDicts addObject:changedDict];
+ [testStatuses addObject:@(status)];
+ }];
+
+ [[NSNotificationCenter defaultCenter] postNotification:noneHMINotification];
+ });
+
+ it(@"should call the observer", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@1));
+ expect(testStatuses[0]).to(equal(@(SDLPermissionGroupStatusMixed)));
+ });
+ });
+ });
+ });
+ });
+
+ describe(@"removing observers", ^{
+ context(@"removing the only observer", ^{
+ __block NSInteger numberOfTimesObserverCalled = 0;
+
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+
+ // Add two observers
+ NSUUID *observerId = [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameFullLimitedAllowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ }];
+
+ // Remove one observer
+ [testPermissionsManager removeObserverForIdentifier:observerId];
+
+ // Post a notification
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+ });
+
+ it(@"should only call the observer once", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@1));
+ });
+ });
+
+ context(@"removing a single observer and leaving one remaining", ^{
+ __block NSUInteger numberOfTimesObserverCalled = 0;
+
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+
+ // Add two observers
+ NSUUID *testRemovedObserverId = [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameFullLimitedAllowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ }];
+
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameFullLimitedAllowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ }];
+
+ // Remove one observer
+ [testPermissionsManager removeObserverForIdentifier:testRemovedObserverId];
+
+ // Post a notification
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+ });
+
+ it(@"should call three observers", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@3));
+ });
+ });
+
+ context(@"removing all observers", ^{
+ __block NSInteger numberOfTimesObserverCalled = 0;
+
+ beforeEach(^{
+ // Reset vars
+ numberOfTimesObserverCalled = 0;
+
+ // Add two observers
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameAllDisallowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ }];
+
+ [testPermissionsManager addObserverForRPCs:@[testRPCNameAllAllowed, testRPCNameAllDisallowed] groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName *,NSNumber<SDLBool> *> * _Nonnull changedDict, SDLPermissionGroupStatus status) {
+ numberOfTimesObserverCalled++;
+ }];
+
+ // Remove all observers
+ [testPermissionsManager removeAllObservers];
+
+ // Add some permissions
+ [[NSNotificationCenter defaultCenter] postNotification:limitedHMINotification];
+ [[NSNotificationCenter defaultCenter] postNotification:testPermissionsNotification];
+ });
+
+ it(@"should not call the observer", ^{
+ expect(@(numberOfTimesObserverCalled)).to(equal(@2));
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLResponseDispatcherSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLResponseDispatcherSpec.m
new file mode 100644
index 000000000..47059877d
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLResponseDispatcherSpec.m
@@ -0,0 +1,647 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLAddCommand.h"
+#import "SDLAlert.h"
+#import "SDLButtonName.h"
+#import "SDLDeleteCommand.h"
+#import "SDLDeleteCommandResponse.h"
+#import "SDLNotificationConstants.h"
+#import "SDLOnButtonEvent.h"
+#import "SDLOnButtonPress.h"
+#import "SDLOnCommand.h"
+#import "SDLReadDID.h"
+#import "SDLReadDIDResponse.h"
+#import "SDLResponseDispatcher.h"
+#import "SDLScrollableMessage.h"
+#import "SDLShow.h"
+#import "SDLSoftButton.h"
+#import "SDLSoftButtonType.h"
+#import "SDLSubscribeButton.h"
+#import "SDLSystemAction.h"
+#import "SDLTextAlignment.h"
+#import "SDLUnsubscribeButton.h"
+#import "SDLUnsubscribeButtonResponse.h"
+
+
+QuickSpecBegin(SDLResponseDispatcherSpec)
+
+describe(@"a response dispatcher", ^{
+ __block SDLResponseDispatcher *testDispatcher = nil;
+
+ beforeEach(^{
+ testDispatcher = [[SDLResponseDispatcher alloc] init];
+ });
+
+ it(@"should initialize the NSMapTable properties", ^{
+ expect(testDispatcher.rpcResponseHandlerMap).toNot(beNil());
+ expect(testDispatcher.rpcRequestDictionary).toNot(beNil());
+ expect(testDispatcher.commandHandlerMap).toNot(beNil());
+ expect(testDispatcher.buttonHandlerMap).toNot(beNil());
+ expect(testDispatcher.customButtonHandlerMap).toNot(beNil());
+
+ expect(testDispatcher.rpcResponseHandlerMap).to(haveCount(@0));
+ expect(testDispatcher.rpcRequestDictionary).to(haveCount(@0));
+ expect(testDispatcher.commandHandlerMap).to(haveCount(@0));
+ expect(testDispatcher.buttonHandlerMap).to(haveCount(@0));
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@0));
+ });
+
+ context(@"storing a request without a handler", ^{
+ __block SDLReadDID *testRPC = nil;
+ __block NSNumber *testCorrelationId = nil;
+
+ beforeEach(^{
+ testRPC = [[SDLReadDID alloc] init];
+ testCorrelationId = @111;
+ testRPC.correlationID = testCorrelationId;
+ });
+
+ it(@"should not store the request", ^{
+ [testDispatcher storeRequest:testRPC handler:nil];
+
+ expect(testDispatcher.rpcResponseHandlerMap).to(haveCount(@0));
+ expect(testDispatcher.rpcRequestDictionary).to(haveCount(@1));
+ expect(testDispatcher.commandHandlerMap).to(haveCount(@0));
+ expect(testDispatcher.buttonHandlerMap).to(haveCount(@0));
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@0));
+ });
+ });
+
+ context(@"storing a request with a handler", ^{
+ __block SDLRPCRequest *testRequest = nil;
+ __block NSNumber *testCorrelationId = nil;
+ __block BOOL handlerCalled = NO;
+
+ beforeEach(^{
+ testRequest = [[SDLReadDID alloc] init];
+ testCorrelationId = @42;
+
+ testRequest.correlationID = testCorrelationId;
+ [testDispatcher storeRequest:testRequest handler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ handlerCalled = YES;
+ }];
+ });
+
+ it(@"should store the request and response", ^{
+ expect(testDispatcher.rpcRequestDictionary[testCorrelationId]).toNot(beNil());
+ expect(testDispatcher.rpcRequestDictionary).to(haveCount(@1));
+
+ expect(testDispatcher.rpcResponseHandlerMap[testCorrelationId]).toNot(beNil());
+ expect(testDispatcher.rpcResponseHandlerMap).to(haveCount(@1));
+ });
+
+ describe(@"when a response arrives", ^{
+ __block SDLRPCResponse *testResponse = nil;
+
+ beforeEach(^{
+ testResponse = [[SDLReadDIDResponse alloc] init];
+ testResponse.correlationID = testCorrelationId;
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveReadDIDResponse object:nil userInfo:@{ SDLNotificationUserInfoObject: testResponse }];
+ });
+
+ it(@"should run the handler", ^{
+ expect(@(handlerCalled)).to(beTruthy());
+ expect(testDispatcher.rpcRequestDictionary).to(haveCount(@0));
+ expect(testDispatcher.rpcResponseHandlerMap).to(haveCount(@0));
+ });
+ });
+ });
+
+ context(@"storing a show request", ^{
+ __block SDLShow *testShow = nil;
+ __block SDLSoftButton *testSoftButton1 = nil;
+ __block NSUInteger numTimesHandlerCalled = 0;
+
+ beforeEach(^{
+ testShow = [[SDLShow alloc] initWithMainField1:@"Test Show" mainField2:nil alignment:[SDLTextAlignment CENTERED]];
+ testShow.correlationID = @1;
+ });
+
+ context(@"with a correct soft button and handler", ^{
+ beforeEach(^{
+ numTimesHandlerCalled = 0;
+
+ testSoftButton1 = [[SDLSoftButton alloc] initWithType:[SDLSoftButtonType TEXT] text:@"test" image:nil highlighted:NO buttonId:1 systemAction:[SDLSystemAction DEFAULT_ACTION] handler:^(__kindof SDLRPCNotification * _Nonnull notification) {
+ numTimesHandlerCalled++;
+ }];
+ testShow.softButtons = [@[testSoftButton1] mutableCopy];
+ testShow.correlationID = @1;
+ [testDispatcher storeRequest:testShow handler:nil];
+ });
+
+ it(@"should add the soft button to the map", ^{
+ expect(testDispatcher.customButtonHandlerMap[testSoftButton1.softButtonID]).toNot(beNil());
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@1));
+ });
+
+ describe(@"when button press and button event notifications arrive", ^{
+ __block SDLOnButtonEvent *testButtonEvent = nil;
+ __block SDLOnButtonPress *testButtonPress = nil;
+
+ context(@"that correspond to the created button", ^{
+ beforeEach(^{
+ testButtonEvent = [[SDLOnButtonEvent alloc] init];
+ testButtonEvent.customButtonID = testSoftButton1.softButtonID;
+ testButtonEvent.buttonName = [SDLButtonName CUSTOM_BUTTON];
+
+ testButtonPress = [[SDLOnButtonPress alloc] init];
+ testButtonPress.customButtonID = testSoftButton1.softButtonID;
+ testButtonPress.buttonName = [SDLButtonName CUSTOM_BUTTON];
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonEventNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonEvent }];
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonPressNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonPress }];
+ });
+
+ it(@"should run the handler for each", ^{
+ expect(@(numTimesHandlerCalled)).to(equal(@2));
+ });
+ });
+
+ context(@"that do not correspond to the created button", ^{
+ beforeEach(^{
+ testButtonEvent = [[SDLOnButtonEvent alloc] init];
+ testButtonEvent.buttonName = [SDLButtonName OK];
+
+ testButtonPress = [[SDLOnButtonPress alloc] init];
+ testButtonPress.buttonName = [SDLButtonName OK];
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonEventNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonEvent }];
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonPressNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonPress }];
+ });
+
+ it(@"should not run the handler", ^{
+ expect(@(numTimesHandlerCalled)).to(equal(@0));
+ });
+ });
+ });
+ });
+
+ context(@"with a correct soft button but no handler", ^{
+ beforeEach(^{
+ testSoftButton1 = [[SDLSoftButton alloc] initWithType:[SDLSoftButtonType TEXT] text:@"test" image:nil highlighted:NO buttonId:1 systemAction:[SDLSystemAction DEFAULT_ACTION] handler:nil];
+ });
+
+ it(@"should not add the soft button", ^{
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@0));
+ });
+ });
+
+ context(@"with a malformed soft button", ^{
+ beforeEach(^{
+ testSoftButton1 = [[SDLSoftButton alloc] initWithType:[SDLSoftButtonType TEXT] text:@"test" image:nil highlighted:NO buttonId:1 systemAction:[SDLSystemAction DEFAULT_ACTION] handler:^(__kindof SDLRPCNotification * _Nonnull notification) {}];
+ });
+
+ it(@"should throw an exception if there's no button id", ^{
+ testSoftButton1.softButtonID = nil;
+ testShow.softButtons = [@[testSoftButton1] mutableCopy];
+
+ expectAction(^{ [testDispatcher storeRequest:testShow handler:nil]; }).to(raiseException().named(@"MissingIdException"));
+ });
+ });
+
+ context(@"without soft buttons", ^{
+ it(@"should not store the request", ^{
+ [testDispatcher storeRequest:testShow handler:nil];
+
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@0));
+ });
+ });
+ });
+
+ context(@"storing a command request", ^{
+ __block SDLAddCommand *testAddCommand = nil;
+ __block UInt32 testCommandId = 0;
+ __block NSUInteger numTimesHandlerCalled = 0;
+
+ __block NSNumber *testAddCommandCorrelationId = nil;
+ __block NSNumber *testDeleteCommandCorrelationId = nil;
+
+ context(@"with a handler", ^{
+ beforeEach(^{
+ testCommandId = 1;
+ testAddCommandCorrelationId = @42;
+ numTimesHandlerCalled = 0;
+
+ testAddCommand = [[SDLAddCommand alloc] initWithId:testCommandId vrCommands:nil handler:^(__kindof SDLRPCNotification * _Nonnull notification) {
+ numTimesHandlerCalled++;
+ }];
+ testAddCommand.correlationID = testAddCommandCorrelationId;
+ });
+
+ it(@"should add the command to the map", ^{
+ [testDispatcher storeRequest:testAddCommand handler:nil];
+
+ expect(testDispatcher.commandHandlerMap[testAddCommand.cmdID]).toNot(beNil());
+ expect(testDispatcher.commandHandlerMap).to(haveCount(@1));
+ });
+
+ it(@"should throw an exception if there's no command id", ^{
+ testAddCommand.cmdID = nil;
+
+ expectAction(^{ [testDispatcher storeRequest:testAddCommand handler:nil]; }).to(raiseException().named(@"MissingIdException"));
+ });
+
+ describe(@"when button press and button event notifications arrive", ^{
+ __block SDLOnCommand *testOnCommand = nil;
+
+ beforeEach(^{
+ [testDispatcher storeRequest:testAddCommand handler:nil];
+ });
+
+ context(@"that correspond to the created button", ^{
+ beforeEach(^{
+ testOnCommand = [[SDLOnCommand alloc] init];
+ testOnCommand.cmdID = @(testCommandId);
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveCommandNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testOnCommand }];
+ });
+
+ it(@"should run the handler for each", ^{
+ expect(@(numTimesHandlerCalled)).to(equal(@1));
+ });
+ });
+
+ context(@"that do not correspond to the created button", ^{
+ beforeEach(^{
+ testOnCommand = [[SDLOnCommand alloc] init];
+ testOnCommand.cmdID = @999;
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveCommandNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testOnCommand }];
+ });
+
+ it(@"should not run the handler", ^{
+ expect(@(numTimesHandlerCalled)).to(equal(@0));
+ });
+ });
+ });
+
+ describe(@"then deleting the command", ^{
+ __block SDLDeleteCommand *testDeleteCommand = nil;
+ __block SDLDeleteCommandResponse *testDeleteResponse = nil;
+
+ beforeEach(^{
+ [testDispatcher storeRequest:testAddCommand handler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {}];
+
+ // We need both the delete command and the response for this to work
+ testDeleteCommandCorrelationId = @43;
+
+ testDeleteCommand = [[SDLDeleteCommand alloc] init];
+ testDeleteCommand.correlationID = testDeleteCommandCorrelationId;
+ testDeleteCommand.cmdID = @(testCommandId);
+
+ [testDispatcher storeRequest:testDeleteCommand handler:nil];
+
+ testDeleteResponse = [[SDLDeleteCommandResponse alloc] init];
+ testDeleteResponse.correlationID = testDeleteCommandCorrelationId;
+ testDeleteResponse.success = @YES;
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveDeleteCommandResponse object:nil userInfo:@{ SDLNotificationUserInfoObject: testDeleteResponse }];
+ });
+
+ it(@"should have removed all the handlers", ^{
+ // There should still be the add command request & handler in the dictionaries since we never responded
+ expect(testDispatcher.commandHandlerMap).to(haveCount(@0));
+ expect(testDispatcher.rpcRequestDictionary).to(haveCount(@1));
+ expect(testDispatcher.rpcResponseHandlerMap).to(haveCount(@1));
+ });
+ });
+ });
+
+ context(@"without a handler", ^{
+ beforeEach(^{
+ testAddCommand = [[SDLAddCommand alloc] initWithId:1 vrCommands:nil handler:nil];
+ });
+
+ it(@"should not add the command", ^{
+ expect(testDispatcher.commandHandlerMap).to(haveCount(@0));
+ });
+ });
+ });
+
+ context(@"storing a subscribe button request", ^{
+ __block SDLSubscribeButton *testSubscribeButton = nil;
+ __block SDLButtonName *testButtonName = nil;
+ __block NSUInteger numTimesHandlerCalled = 0;
+
+ __block NSNumber *testSubscribeCorrelationId = nil;
+ __block NSNumber *testUnsubscribeCorrelationId = nil;
+
+ context(@"with a handler", ^{
+ beforeEach(^{
+ testButtonName = [SDLButtonName OK];
+ testSubscribeCorrelationId = @42;
+ numTimesHandlerCalled = 0;
+
+ testSubscribeButton = [[SDLSubscribeButton alloc] initWithButtonName:testButtonName handler:^(__kindof SDLRPCNotification * _Nonnull notification) {
+ numTimesHandlerCalled++;
+ }];
+ testSubscribeButton.correlationID = testSubscribeCorrelationId;
+ });
+
+ it(@"should add the subscription to the map", ^{
+ [testDispatcher storeRequest:testSubscribeButton handler:nil];
+
+ expect(testDispatcher.buttonHandlerMap[testSubscribeButton.buttonName.value]).toNot(beNil());
+ expect(testDispatcher.buttonHandlerMap).to(haveCount(@1));
+ });
+
+ it(@"should throw an exception if there's no button name", ^{
+ testSubscribeButton.buttonName = nil;
+
+ expectAction(^{ [testDispatcher storeRequest:testSubscribeButton handler:nil]; }).to(raiseException().named(@"MissingIdException"));
+ });
+
+ describe(@"when button press and button event notifications arrive", ^{
+ __block SDLOnButtonEvent *testButtonEvent = nil;
+ __block SDLOnButtonPress *testButtonPress = nil;
+
+ beforeEach(^{
+ [testDispatcher storeRequest:testSubscribeButton handler:nil];
+ });
+
+ context(@"that correspond to the created button", ^{
+ beforeEach(^{
+ testButtonEvent = [[SDLOnButtonEvent alloc] init];
+ testButtonEvent.buttonName = testButtonName;
+
+ testButtonPress = [[SDLOnButtonPress alloc] init];
+ testButtonPress.buttonName = testButtonName;
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonEventNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonEvent }];
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonPressNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonPress }];
+ });
+
+ it(@"should run the handler for each", ^{
+ expect(@(numTimesHandlerCalled)).to(equal(@2));
+ });
+ });
+
+ context(@"that do not correspond to the created button", ^{
+ beforeEach(^{
+ testButtonEvent = [[SDLOnButtonEvent alloc] init];
+ testButtonEvent.buttonName = [SDLButtonName PRESET_0];
+
+ testButtonPress = [[SDLOnButtonPress alloc] init];
+ testButtonPress.buttonName = [SDLButtonName PRESET_0];
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonEventNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonEvent }];
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonPressNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonPress }];
+ });
+
+ it(@"should not run the handler", ^{
+ expect(@(numTimesHandlerCalled)).to(equal(@0));
+ });
+ });
+ });
+
+ describe(@"then unsubscribing", ^{
+ __block SDLUnsubscribeButton *testUnsubscribe = nil;
+ __block SDLUnsubscribeButtonResponse *testUnsubscribeResponse = nil;
+
+ beforeEach(^{
+ [testDispatcher storeRequest:testSubscribeButton handler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {}];
+
+ // We need both the delete command and the response for this to work
+ testUnsubscribeCorrelationId = @43;
+
+ testUnsubscribe = [[SDLUnsubscribeButton alloc] init];
+ testUnsubscribe.correlationID = testUnsubscribeCorrelationId;
+ testUnsubscribe.buttonName = testButtonName;
+
+ [testDispatcher storeRequest:testUnsubscribe handler:nil];
+
+ testUnsubscribeResponse = [[SDLUnsubscribeButtonResponse alloc] init];
+ testUnsubscribeResponse.correlationID = testUnsubscribeCorrelationId;
+ testUnsubscribeResponse.success = @YES;
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveUnsubscribeButtonResponse object:nil userInfo:@{ SDLNotificationUserInfoObject: testUnsubscribeResponse }];
+ });
+
+ it(@"should have removed all the handlers", ^{
+ // There should still be the add command request & handler in the dictionaries since we never responded
+ expect(testDispatcher.commandHandlerMap).to(haveCount(@0));
+ expect(testDispatcher.rpcRequestDictionary).to(haveCount(@1));
+ expect(testDispatcher.rpcResponseHandlerMap).to(haveCount(@1));
+ });
+ });
+ });
+
+ context(@"without a handler", ^{
+ beforeEach(^{
+ testSubscribeButton = [[SDLSubscribeButton alloc] initWithButtonName:[SDLButtonName OK] handler:nil];
+ });
+
+ it(@"should not add the subscription", ^{
+ expect(testDispatcher.buttonHandlerMap).to(haveCount(@0));
+ });
+ });
+ });
+
+ context(@"storing an alert request", ^{
+ __block SDLAlert *testAlert = nil;
+ __block SDLSoftButton *testSoftButton1 = nil;
+
+ beforeEach(^{
+ testAlert = [[SDLAlert alloc] initWithAlertText1:@"test 1" alertText2:@"test 1" alertText3:nil duration:1 softButtons:nil];
+ testAlert.correlationID = @1;
+ });
+
+ context(@"with a correct soft button and handler", ^{
+ __block NSUInteger numTimesHandlerCalled = 0;
+
+ beforeEach(^{
+ numTimesHandlerCalled = 0;
+
+ testSoftButton1 = [[SDLSoftButton alloc] initWithType:[SDLSoftButtonType TEXT] text:@"test" image:nil highlighted:NO buttonId:1 systemAction:[SDLSystemAction DEFAULT_ACTION] handler:^(__kindof SDLRPCNotification * _Nonnull notification) {
+ numTimesHandlerCalled++;
+ }];
+
+ testAlert.softButtons = [@[testSoftButton1] mutableCopy];
+ [testDispatcher storeRequest:testAlert handler:nil];
+ });
+
+ it(@"should add the soft button to the map", ^{
+ expect(testDispatcher.customButtonHandlerMap[testSoftButton1.softButtonID]).toNot(beNil());
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@1));
+ });
+
+ describe(@"when button press and button event notifications arrive", ^{
+ __block SDLOnButtonEvent *testButtonEvent = nil;
+ __block SDLOnButtonPress *testButtonPress = nil;
+
+ context(@"that correspond to the created button", ^{
+ beforeEach(^{
+ testButtonEvent = [[SDLOnButtonEvent alloc] init];
+ testButtonEvent.buttonName = [SDLButtonName CUSTOM_BUTTON];
+ testButtonEvent.customButtonID = testSoftButton1.softButtonID;
+
+ testButtonPress = [[SDLOnButtonPress alloc] init];
+ testButtonPress.buttonName = [SDLButtonName CUSTOM_BUTTON];
+ testButtonPress.customButtonID = testSoftButton1.softButtonID;
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonEventNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonEvent }];
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonPressNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonPress }];
+ });
+
+ it(@"should run the handler for each", ^{
+ expect(@(numTimesHandlerCalled)).to(equal(@2));
+ });
+ });
+
+ context(@"that do not correspond to the created button", ^{
+ beforeEach(^{
+ testButtonEvent = [[SDLOnButtonEvent alloc] init];
+ testButtonEvent.buttonName = [SDLButtonName OK];
+
+ testButtonPress = [[SDLOnButtonPress alloc] init];
+ testButtonPress.buttonName = [SDLButtonName OK];
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonEventNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonEvent }];
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonPressNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonPress }];
+ });
+
+ it(@"should not run the handler", ^{
+ expect(@(numTimesHandlerCalled)).to(equal(@0));
+ });
+ });
+ });
+ });
+
+ context(@"with a correct soft button but no handler", ^{
+ beforeEach(^{
+ testSoftButton1 = [[SDLSoftButton alloc] initWithType:[SDLSoftButtonType TEXT] text:@"test" image:nil highlighted:NO buttonId:1 systemAction:[SDLSystemAction DEFAULT_ACTION] handler:nil];
+ });
+
+ it(@"should not add the soft button", ^{
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@0));
+ });
+ });
+
+ context(@"with a malformed soft button", ^{
+ beforeEach(^{
+ testSoftButton1 = [[SDLSoftButton alloc] initWithType:[SDLSoftButtonType TEXT] text:@"test" image:nil highlighted:NO buttonId:1 systemAction:[SDLSystemAction DEFAULT_ACTION] handler:^(__kindof SDLRPCNotification * _Nonnull notification) {}];
+ });
+
+ it(@"should throw an exception if there's no button id", ^{
+ testSoftButton1.softButtonID = nil;
+ testAlert.softButtons = [@[testSoftButton1] mutableCopy];
+
+ expectAction(^{ [testDispatcher storeRequest:testAlert handler:nil]; }).to(raiseException().named(@"MissingIdException"));
+ });
+ });
+
+ context(@"without soft buttons", ^{
+ it(@"should not store the request", ^{
+ [testDispatcher storeRequest:testAlert handler:nil];
+
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@0));
+ });
+ });
+ });
+
+ context(@"storing a scrollable message request", ^{
+ __block SDLScrollableMessage *testScrollableMessage = nil;
+ __block SDLSoftButton *testSoftButton1 = nil;
+
+ beforeEach(^{
+ testScrollableMessage = [[SDLScrollableMessage alloc] initWithMessage:@"test" timeout:1 softButtons:nil];
+ testScrollableMessage.correlationID = @1;
+ });
+
+ context(@"with a correct soft button and handler", ^{
+ __block NSUInteger numTimesHandlerCalled = 0;
+
+ beforeEach(^{
+ numTimesHandlerCalled = 0;
+
+ testSoftButton1 = [[SDLSoftButton alloc] initWithType:[SDLSoftButtonType TEXT] text:@"test" image:nil highlighted:NO buttonId:1 systemAction:[SDLSystemAction DEFAULT_ACTION] handler:^(__kindof SDLRPCNotification * _Nonnull notification) {
+ numTimesHandlerCalled++;
+ }];
+
+ testScrollableMessage.softButtons = [@[testSoftButton1] mutableCopy];
+ [testDispatcher storeRequest:testScrollableMessage handler:nil];
+ });
+
+ it(@"should add the soft button to the map", ^{
+ expect(testDispatcher.customButtonHandlerMap[testSoftButton1.softButtonID]).toNot(beNil());
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@1));
+ });
+
+ describe(@"when button press and button event notifications arrive", ^{
+ __block SDLOnButtonEvent *testButtonEvent = nil;
+ __block SDLOnButtonPress *testButtonPress = nil;
+
+ context(@"that correspond to the created button", ^{
+ beforeEach(^{
+ testButtonEvent = [[SDLOnButtonEvent alloc] init];
+ testButtonEvent.buttonName = [SDLButtonName CUSTOM_BUTTON];
+ testButtonEvent.customButtonID = testSoftButton1.softButtonID;
+
+ testButtonPress = [[SDLOnButtonPress alloc] init];
+ testButtonPress.buttonName = [SDLButtonName CUSTOM_BUTTON];
+ testButtonPress.customButtonID = testSoftButton1.softButtonID;
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonEventNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonEvent }];
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonPressNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonPress }];
+ });
+
+ it(@"should run the handler for each", ^{
+ expect(@(numTimesHandlerCalled)).to(equal(@2));
+ });
+ });
+
+ context(@"that do not correspond to the created button", ^{
+ beforeEach(^{
+ testButtonEvent = [[SDLOnButtonEvent alloc] init];
+ testButtonEvent.buttonName = [SDLButtonName OK];
+
+ testButtonPress = [[SDLOnButtonPress alloc] init];
+ testButtonPress.buttonName = [SDLButtonName OK];
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonEventNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonEvent }];
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDLDidReceiveButtonPressNotification object:nil userInfo:@{ SDLNotificationUserInfoObject: testButtonPress }];
+ });
+
+ it(@"should not run the handler", ^{
+ expect(@(numTimesHandlerCalled)).to(equal(@0));
+ });
+ });
+ });
+ });
+
+ context(@"with a correct soft button but no handler", ^{
+ beforeEach(^{
+ testSoftButton1 = [[SDLSoftButton alloc] initWithType:[SDLSoftButtonType TEXT] text:@"test" image:nil highlighted:NO buttonId:1 systemAction:[SDLSystemAction DEFAULT_ACTION] handler:nil];
+ });
+
+ it(@"should not add the soft button", ^{
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@0));
+ });
+ });
+
+ context(@"with a malformed soft button", ^{
+ beforeEach(^{
+ testSoftButton1 = [[SDLSoftButton alloc] initWithType:[SDLSoftButtonType TEXT] text:@"test" image:nil highlighted:NO buttonId:1 systemAction:[SDLSystemAction DEFAULT_ACTION] handler:^(__kindof SDLRPCNotification * _Nonnull notification) {}];
+ });
+
+ it(@"should throw an exception if there's no button id", ^{
+ testSoftButton1.softButtonID = nil;
+ testScrollableMessage.softButtons = [@[testSoftButton1] mutableCopy];
+
+ expectAction(^{ [testDispatcher storeRequest:testScrollableMessage handler:nil]; }).to(raiseException().named(@"MissingIdException"));
+ });
+ });
+
+ context(@"without soft buttons", ^{
+ it(@"should not store the request", ^{
+ [testDispatcher storeRequest:testScrollableMessage handler:nil];
+
+ expect(testDispatcher.customButtonHandlerMap).to(haveCount(@0));
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLStateMachineSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLStateMachineSpec.m
new file mode 100644
index 000000000..d657586e5
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLStateMachineSpec.m
@@ -0,0 +1,144 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLStateMachine.h"
+#import "TestStateMachineTarget.h"
+
+QuickSpecBegin(SDLStateMachineSpec)
+
+describe(@"A state machine", ^{
+ __block SDLStateMachine *testStateMachine = nil;
+ __block TestStateMachineTarget *testTarget = nil;
+
+ __block SDLState *initialState = @"Initial";
+ __block SDLState *secondState = @"Second";
+ __block SDLState *thirdState = @"Third";
+
+ __block NSDictionary *allowableStateTransitions = @{
+ initialState: @[secondState],
+ secondState: @[thirdState],
+ thirdState: @[initialState]
+ };
+
+ beforeEach(^{
+ testTarget = [[TestStateMachineTarget alloc] init];
+
+ testStateMachine = [[SDLStateMachine alloc] initWithTarget:testTarget initialState:initialState states:allowableStateTransitions];
+ });
+
+ describe(@"when the state machine initializes", ^{
+ __block BOOL isInitialState = NO;
+
+ beforeEach(^{
+ isInitialState = [testStateMachine isCurrentState:initialState];
+ });
+
+ it(@"should be in a correct initial state", ^{
+ expect(@(isInitialState)).to(equal(@YES));
+ expect(testStateMachine.states).to(equal(allowableStateTransitions));
+ expect(testStateMachine.target).to(equal(testTarget));
+ });
+
+ describe(@"when transitioning correctly", ^{
+ __block BOOL didTransitionNotificationCalled = NO;
+
+ __block NSDictionary<NSString *, NSString *> *willLeaveMethodInfo = nil;
+ __block NSDictionary<NSString *, NSString *> *willTransitionMethodInfo = nil;
+ __block NSDictionary<NSString *, NSString *> *didTransitionMethodInfo = nil;
+ __block NSDictionary<NSString *, NSString *> *didEnterMethodInfo = nil;
+
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] addObserverForName:testStateMachine.transitionNotificationName object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
+ didTransitionNotificationCalled = YES;
+ }];
+
+ testTarget.callback = ^(NSString * _Nonnull type, NSString * _Nullable oldState, NSString * _Nullable newState) {
+ if ([type isEqualToString:SDLStateMachineTransitionTypeWillLeave]) {
+ willLeaveMethodInfo = @{ SDLStateMachineNotificationInfoKeyOldState: oldState };
+ } else if ([type isEqualToString:SDLStateMachineTransitionTypeWillTransition]) {
+ willTransitionMethodInfo = @{ SDLStateMachineNotificationInfoKeyOldState: oldState, SDLStateMachineNotificationInfoKeyNewState: newState };
+ } else if ([type isEqualToString:SDLStateMachineTransitionTypeDidTransition]) {
+ didTransitionMethodInfo = @{ SDLStateMachineNotificationInfoKeyOldState: oldState, SDLStateMachineNotificationInfoKeyNewState: newState };
+ } else if ([type isEqualToString:SDLStateMachineTransitionTypeDidEnter]) {
+ didEnterMethodInfo = @{ SDLStateMachineNotificationInfoKeyNewState: newState };
+ }
+ };
+
+ // Valid transition
+ [testStateMachine transitionToState:secondState];
+ });
+
+ it(@"should end up in the correct state", ^{
+ expect(@([testStateMachine isCurrentState:secondState])).to(equal(@YES));
+ });
+
+ it(@"should call all appropriate notifications", ^{
+ expect(@(didTransitionNotificationCalled)).to(equal(@YES));
+ });
+
+ it(@"should call all the appropriate state methods", ^{
+ expect(willLeaveMethodInfo[SDLStateMachineNotificationInfoKeyOldState]).to(match(initialState));
+ expect(willLeaveMethodInfo[SDLStateMachineNotificationInfoKeyNewState]).to(beNil());
+ expect(willTransitionMethodInfo[SDLStateMachineNotificationInfoKeyOldState]).to(match(initialState));
+ expect(willTransitionMethodInfo[SDLStateMachineNotificationInfoKeyNewState]).to(match(secondState));
+ expect(didTransitionMethodInfo[SDLStateMachineNotificationInfoKeyOldState]).to(match(initialState));
+ expect(didTransitionMethodInfo[SDLStateMachineNotificationInfoKeyNewState]).to(match(secondState));
+ expect(didEnterMethodInfo[SDLStateMachineNotificationInfoKeyOldState]).to(beNil());
+ expect(didEnterMethodInfo[SDLStateMachineNotificationInfoKeyNewState]).to(match(secondState));
+ });
+ });
+
+ describe(@"when transitioning incorrectly", ^{
+ __block BOOL willLeaveNotificationCalled = NO;
+ __block BOOL willTransitionNotificationCalled = NO;
+ __block BOOL didTransitionNotificationCalled = NO;
+ __block BOOL didEnterNotificationCalled = NO;
+
+ __block NSDictionary<NSString *, NSString *> *willLeaveMethodInfo = nil;
+ __block NSDictionary<NSString *, NSString *> *willTransitionMethodInfo = nil;
+ __block NSDictionary<NSString *, NSString *> *didTransitionMethodInfo = nil;
+ __block NSDictionary<NSString *, NSString *> *didEnterMethodInfo = nil;
+
+ beforeEach(^{
+ [[NSNotificationCenter defaultCenter] addObserverForName:testStateMachine.transitionNotificationName object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
+ if ([note.userInfo[@"type"] isEqualToString:@"willLeave"]) { willLeaveNotificationCalled = YES; }
+ else if ([note.userInfo[@"type"] isEqualToString:@"willTransition"]) { willTransitionNotificationCalled = YES; }
+ else if ([note.userInfo[@"type"] isEqualToString:@"didTransition"]) { didTransitionNotificationCalled = YES; }
+ else if ([note.userInfo[@"type"] isEqualToString:@"didEnter"]) { didEnterNotificationCalled = YES; }
+ }];
+
+ testTarget.callback = ^(NSString * _Nonnull type, NSString * _Nullable oldState, NSString * _Nullable newState) {
+ if ([type isEqualToString:SDLStateMachineTransitionTypeWillLeave]) {
+ willLeaveMethodInfo = @{ SDLStateMachineNotificationInfoKeyOldState: oldState, SDLStateMachineNotificationInfoKeyNewState: newState };
+ } else if ([type isEqualToString:SDLStateMachineTransitionTypeWillTransition]) {
+ willTransitionMethodInfo = @{ SDLStateMachineNotificationInfoKeyOldState: oldState, SDLStateMachineNotificationInfoKeyNewState: newState };
+ } else if ([type isEqualToString:SDLStateMachineTransitionTypeDidTransition]) {
+ didTransitionMethodInfo = @{ SDLStateMachineNotificationInfoKeyOldState: oldState, SDLStateMachineNotificationInfoKeyNewState: newState };
+ } else if ([type isEqualToString:SDLStateMachineTransitionTypeDidEnter]) {
+ didEnterMethodInfo = @{ SDLStateMachineNotificationInfoKeyOldState: oldState, SDLStateMachineNotificationInfoKeyNewState: newState };
+ }
+ };
+ });
+
+ it(@"should throw an exception trying to transition incorrectly and nothing should be called", ^{
+ // Side effects, but I can't think of any other way around it.
+ expectAction(^{
+ [testStateMachine transitionToState:thirdState];
+ }).to(raiseException().named(NSInternalInconsistencyException));
+
+ expect(@([testStateMachine isCurrentState:initialState])).to(equal(@YES));
+ expect(@([testStateMachine isCurrentState:thirdState])).to(equal(@NO));
+ expect(@(willLeaveNotificationCalled)).to(equal(@NO));
+ expect(@(willTransitionNotificationCalled)).to(equal(@NO));
+ expect(@(didTransitionNotificationCalled)).to(equal(@NO));
+ expect(@(didEnterNotificationCalled)).to(equal(@NO));
+ expect(willLeaveMethodInfo).to(beNil());
+ expect(willTransitionMethodInfo).to(beNil());
+ expect(didTransitionMethodInfo).to(beNil());
+ expect(didEnterMethodInfo).to(beNil());
+ });
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
new file mode 100644
index 000000000..d0a20b03c
--- /dev/null
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLUploadFileOperationSpec.m
@@ -0,0 +1,160 @@
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLError.h"
+#import "SDLFile.h"
+#import "SDLFileWrapper.h"
+#import "SDLGlobals.h"
+#import "SDLPutFile.h"
+#import "SDLPutFileResponse.h"
+#import "SDLUploadFileOperation.h"
+#import "TestConnectionManager.h"
+
+
+QuickSpecBegin(SDLUploadFileOperationSpec)
+
+describe(@"Upload File Operation", ^{
+ __block NSString *testFileName = nil;
+ __block NSData *testFileData = nil;
+ __block SDLFile *testFile = nil;
+ __block SDLFileWrapper *testFileWrapper = nil;
+
+ __block TestConnectionManager *testConnectionManager = nil;
+ __block SDLUploadFileOperation *testOperation = nil;
+
+ __block BOOL successResult = NO;
+ __block NSUInteger bytesAvailableResult = NO;
+ __block NSError *errorResult = nil;
+
+ beforeEach(^{
+ // Set the head unit size small so we have a low MTU size
+ [SDLGlobals globals].maxHeadUnitVersion = 2;
+ });
+
+ context(@"running a small file operation", ^{
+ beforeEach(^{
+ testFileName = @"test file";
+ testFileData = [@"test1234" dataUsingEncoding:NSUTF8StringEncoding];
+ testFile = [SDLFile fileWithData:testFileData name:testFileName fileExtension:@"bin"];
+ testFileWrapper = [SDLFileWrapper wrapperWithFile:testFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ successResult = success;
+ bytesAvailableResult = bytesAvailable;
+ errorResult = error;
+ }];
+
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
+
+ [testOperation start];
+ [NSThread sleepForTimeInterval:0.5];
+ });
+
+ it(@"should have a priority of 'normal'", ^{
+ expect(@(testOperation.queuePriority)).to(equal(@(NSOperationQueuePriorityNormal)));
+ });
+
+ it(@"should send putfiles", ^{
+ SDLPutFile *putFile = testConnectionManager.receivedRequests.lastObject;
+ expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLPutFile class]));
+ expect(putFile.bulkData).to(equal(testFileData));
+ expect(putFile.length).to(equal(@(testFileData.length)));
+ expect(putFile.offset).to(equal(@0));
+ expect(putFile.persistentFile).to(equal(@NO));
+ expect(putFile.syncFileName).to(equal(testFileName));
+ });
+
+ context(@"when a good response comes back", ^{
+ __block SDLPutFileResponse *goodResponse = nil;
+ __block NSNumber *responseSpaceAvailable = nil;
+ __block NSMutableArray *responseFileNames = nil;
+
+ beforeEach(^{
+ responseSpaceAvailable = @(11212512);
+ responseFileNames = [NSMutableArray arrayWithArray:@[@"test1", @"test2"]];
+
+ goodResponse = [[SDLPutFileResponse alloc] init];
+ goodResponse.success = @YES;
+ goodResponse.spaceAvailable = responseSpaceAvailable;
+
+ [testConnectionManager respondToLastRequestWithResponse:goodResponse];
+ });
+
+ it(@"should have called the completion handler with proper data", ^{
+ expect(@(successResult)).toEventually(equal(@YES));
+ expect(@(bytesAvailableResult)).toEventually(equal(responseSpaceAvailable));
+ expect(errorResult).toEventually(beNil());
+ });
+
+ it(@"should be set to finished", ^{
+ expect(@(testOperation.finished)).toEventually(equal(@YES));
+ expect(@(testOperation.executing)).toEventually(equal(@NO));
+ });
+ });
+
+ context(@"when a bad response comes back", ^{
+ __block SDLPutFileResponse *badResponse = nil;
+ __block NSNumber *responseSpaceAvailable = nil;
+
+ __block NSString *responseErrorDescription = nil;
+ __block NSString *responseErrorReason = nil;
+
+ beforeEach(^{
+ responseSpaceAvailable = @(0);
+
+ responseErrorDescription = @"some description";
+ responseErrorReason = @"some reason";
+
+ badResponse = [[SDLPutFileResponse 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).toEventually(match(responseErrorDescription));
+ expect(errorResult.localizedFailureReason).toEventually(match(responseErrorReason));
+ expect(@(successResult)).toEventually(equal(@NO));
+ expect(@(bytesAvailableResult)).toEventually(equal(@0));
+ });
+ });
+ });
+
+ context(@"sending a large file", ^{
+ beforeEach(^{
+ UIImage *testImage = [UIImage imageNamed:@"testImagePNG" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
+
+ testFileName = @"test file";
+ testFileData = UIImageJPEGRepresentation(testImage, 0.80);
+ testFile = [SDLFile fileWithData:testFileData name:testFileName fileExtension:@"bin"];
+ testFileWrapper = [SDLFileWrapper wrapperWithFile:testFile completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ successResult = success;
+ bytesAvailableResult = bytesAvailable;
+ errorResult = error;
+ }];
+
+ testConnectionManager = [[TestConnectionManager alloc] init];
+ testOperation = [[SDLUploadFileOperation alloc] initWithFile:testFileWrapper connectionManager:testConnectionManager];
+
+ [testOperation start];
+ [NSThread sleepForTimeInterval:0.5];
+ });
+
+ it(@"should send correct putfiles", ^{
+ NSArray<SDLPutFile *> *putFiles = testConnectionManager.receivedRequests;
+ SDLPutFile *firstPutFile = putFiles.firstObject;
+
+ // First putfile
+ expect(firstPutFile.bulkData).to(equal([testFileData subdataWithRange:NSMakeRange(0, [SDLGlobals globals].maxMTUSize)]));
+ expect(firstPutFile.length).to(equal(@(testFileData.length)));
+ expect(firstPutFile.offset).to(equal(@0));
+ expect(firstPutFile.persistentFile).to(equal(@NO));
+ expect(firstPutFile.syncFileName).to(equal(testFileName));
+
+ NSUInteger numberOfPutFiles = (((testFileData.length - 1) / [SDLGlobals globals].maxMTUSize) + 1);
+ expect(@(putFiles.count)).to(equal(@(numberOfPutFiles)));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m
index 10efc2554..52dd249bf 100644
--- a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m
+++ b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m
@@ -307,7 +307,7 @@ describe(@"HandleBytesFromTransport Tests", ^ {
// expect(@(messageReceived.header.serviceType)).to(equal(@(SDLServiceType_RPC)));
// expect(@(messageReceived.header.frameData)).to(equal(@(SDLFrameData_SingleFrame)));
// expect(@(messageReceived.header.bytesInPayload)).to(equal(@(payloadData.length)));
-// expect(@(((SDLV2ProtocolHeader*)messageReceived.header).messageID)).to(equal(@1));
+// expect(@(((SDLV2ProtocolHeader *)messageReceived.header).messageID)).to(equal(@1));
//
// }] handleReceivedMessage:[OCMArg any]];
// testProtocol.transport = routerMock;
diff --git a/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolReceivedMessageRouterSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolReceivedMessageRouterSpec.m
index c9edaf6a6..f88f0a192 100644
--- a/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolReceivedMessageRouterSpec.m
+++ b/SmartDeviceLinkTests/ProtocolSpecs/SDLProtocolReceivedMessageRouterSpec.m
@@ -38,7 +38,7 @@ describe(@"HandleReceivedMessage Tests", ^ {
router.delegate = delegateMock;
[router handleReceivedMessage:testMessage];
- OCMExpect([delegateMock handleProtocolStartSessionACK:testMessage.header]);
+ OCMVerify([delegateMock handleProtocolStartSessionACK:testMessage.header]);
});
});
@@ -67,7 +67,7 @@ describe(@"HandleReceivedMessage Tests", ^ {
[invocation getArgument:&message atIndex:2];
- SDLV2ProtocolMessage* messageReceived = (SDLV2ProtocolMessage*)message;
+ SDLV2ProtocolMessage* messageReceived = (SDLV2ProtocolMessage *)message;
expect(messageReceived).to(beIdenticalTo(testMessage));
}] ignoringNonObjectArgs] onProtocolMessageReceived:[OCMArg any]];
@@ -157,4 +157,4 @@ describe(@"HandleReceivedMessage Tests", ^ {
});
});
-QuickSpecEnd \ No newline at end of file
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/ProxySpecs/SDLLockScreenManagerSpec.m b/SmartDeviceLinkTests/ProxySpecs/SDLLockScreenStatusManagerSpec.m
index 76c85b9f4..546380367 100644
--- a/SmartDeviceLinkTests/ProxySpecs/SDLLockScreenManagerSpec.m
+++ b/SmartDeviceLinkTests/ProxySpecs/SDLLockScreenStatusManagerSpec.m
@@ -1,5 +1,5 @@
//
-// SDLHexUtilitySpec.m
+// SDLLockScreenStatusManagerSpec
// SmartDeviceLink-iOS
#import <Quick/Quick.h>
@@ -7,16 +7,16 @@
#import "SDLHMILevel.h"
#import "SDLOnLockScreenStatus.h"
-#import "SDLLockScreenManager.h"
+#import "SDLLockScreenStatusManager.h"
#import "SDLLockScreenStatus.h"
-QuickSpecBegin(SDLLockScreenManagerSpec)
+QuickSpecBegin(SDLLockScreenStatusManagerSpec)
-describe(@"the lockscreen manager", ^{
- __block SDLLockScreenManager *lockScreenManager;
+describe(@"the lockscreen status manager", ^{
+ __block SDLLockScreenStatusManager *lockScreenManager;
beforeEach(^{
- lockScreenManager = [[SDLLockScreenManager alloc] init];
+ lockScreenManager = [[SDLLockScreenStatusManager alloc] init];
});
it(@"should properly initialize user selected app boolean to false", ^{
diff --git a/SmartDeviceLinkTests/RPCSpecs/FactorySpecs/SDLRPCRequestFactorySpec.m b/SmartDeviceLinkTests/RPCSpecs/FactorySpecs/SDLRPCRequestFactorySpec.m
index b8dfda2ae..1f2ad1a70 100644
--- a/SmartDeviceLinkTests/RPCSpecs/FactorySpecs/SDLRPCRequestFactorySpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/FactorySpecs/SDLRPCRequestFactorySpec.m
@@ -11,13 +11,19 @@
#import "SmartDeviceLink.h"
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
QuickSpecBegin(SDLRPCRequestFactorySpec)
describe(@"BuildAddCommand Tests", ^ {
it(@"Should build correctly", ^ {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLAddCommand* message = [SDLRPCRequestFactory buildAddCommandWithID:@33 menuName:@"Menu" parentID:@4 position:@500
vrCommands:nil iconValue:@"No" iconType:[SDLImageType STATIC] correlationID:@94];
+#pragma clang diagnostic pop
+
expect([message menuParams].position).to(equal(@500));
expect([message menuParams].menuName).to(equal(@"Menu"));
expect([message menuParams].parentID).to(equal(@4));
@@ -29,7 +35,10 @@ describe(@"BuildAddCommand Tests", ^ {
NSArray* aliases = @[@"Joe1", @"Joe2", @"Joe3",
@"--------------------------------ASLONGOFASTRINGASICANPOSSIBLYMAKEINASINGLELINE---------------------------------"];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
message = [SDLRPCRequestFactory buildAddCommandWithID:@276 menuName:@"Arbitrary" vrCommands:aliases correlationID:@200];
+#pragma clang diagnostic pop
expect([message menuParams].position).to(beNil());
expect([message menuParams].menuName).to(equal(@"Arbitrary"));
@@ -38,8 +47,11 @@ describe(@"BuildAddCommand Tests", ^ {
expect(message.cmdIcon).to(beNil());
expect(message.cmdID).to(equal(@276));
expect(message.correlationID).to(equal(@200));
-
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
message = [SDLRPCRequestFactory buildAddCommandWithID:@9001 vrCommands:@[@" ", @" ", @" ", @""] correlationID:@27];
+#pragma clang diagnostic pop
expect(message.menuParams).to(beNil());
expect(message.vrCommands).to(equal(@[@" ", @" ", @" ", @""]));
@@ -51,7 +63,10 @@ describe(@"BuildAddCommand Tests", ^ {
describe(@"BuildAddSubMenu Tests", ^ {
it(@"Should build correctly", ^ {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLAddSubMenu* message = [SDLRPCRequestFactory buildAddSubMenuWithID:@234234 menuName:@"QWERTY" position:@3 correlationID:@13];
+#pragma clang diagnostic pop
expect(message.menuName).to(equal(@"QWERTY"));
expect(message.position).to(equal(@3));
@@ -866,7 +881,10 @@ describe(@"BuildSpeak Tests", ^ {
describe(@"BuildSubscribeButton Tests", ^ {
it(@"Should build correctly", ^ {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
SDLSubscribeButton* message = [SDLRPCRequestFactory buildSubscribeButtonWithName:[SDLButtonName SEARCH] correlationID:@5555555];
+#pragma clang diagnostic pop
expect(message.buttonName).to(equal([SDLButtonName SEARCH]));
expect(message.correlationID).to(equal(@5555555));
@@ -1001,4 +1019,4 @@ describe(@"SDLUpdateTurnList Tests", ^ {
QuickSpecEnd
-
+#pragma clang diagnostic pop
diff --git a/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testAppAndVehicleIcons@2x.png b/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testAppAndVehicleIcons@2x.png
new file mode 100644
index 000000000..30daef6ff
--- /dev/null
+++ b/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testAppAndVehicleIcons@2x.png
Binary files differ
diff --git a/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testLightBackgroundNoAppNoVehicleIcons@2x.png b/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testLightBackgroundNoAppNoVehicleIcons@2x.png
new file mode 100644
index 000000000..401793f2c
--- /dev/null
+++ b/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testLightBackgroundNoAppNoVehicleIcons@2x.png
Binary files differ
diff --git a/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testNoAppNoVehicleIcons@2x.png b/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testNoAppNoVehicleIcons@2x.png
new file mode 100644
index 000000000..c5eb09c13
--- /dev/null
+++ b/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testNoAppNoVehicleIcons@2x.png
Binary files differ
diff --git a/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testOnlyAppIcon@2x.png b/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testOnlyAppIcon@2x.png
new file mode 100644
index 000000000..b2c95cc82
--- /dev/null
+++ b/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testOnlyAppIcon@2x.png
Binary files differ
diff --git a/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testOnlyVehicleIcon@2x.png b/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testOnlyVehicleIcon@2x.png
new file mode 100644
index 000000000..b963922af
--- /dev/null
+++ b/SmartDeviceLinkTests/ReferenceImages_64/SDLLockScreenViewControllerSnapshotTests/testOnlyVehicleIcon@2x.png
Binary files differ
diff --git a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h
new file mode 100644
index 000000000..8d240335e
--- /dev/null
+++ b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h
@@ -0,0 +1,51 @@
+//
+// TestConnectionManager.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 11/6/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SDLConnectionManagerType.h"
+#import "SDLNotificationConstants.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TestConnectionManager : NSObject <SDLConnectionManagerType>
+
+/**
+ * All received requests. Chronological order. The 0th element will be the first request received; the nth request will be the n+1th request received.
+ */
+@property (copy, nonatomic, readonly) NSMutableArray<__kindof SDLRPCRequest *> *receivedRequests;
+
+/**
+ * The block passed for the last request send with sendRequest:withCompletionHandler:
+ */
+@property (copy, nonatomic, nullable) SDLResponseHandler lastRequestBlock;
+
+/**
+ * Call the last request's block with a specific response.
+ *
+ * @param response The RPC Response to pass into the last request's block.
+ */
+- (void)respondToLastRequestWithResponse:(__kindof SDLRPCResponse *)response;
+
+/**
+ * Call the last request's block with a specific response and error.
+ *
+ * @param response The response to pass into the last request's block.
+ * @param error The error to pass into the last request's block.
+ */
+- (void)respondToLastRequestWithResponse:(__kindof SDLRPCResponse *_Nullable)response error:( NSError *_Nullable)error;
+
+/**
+ * Remove all received requests.
+ */
+- (void)reset;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
new file mode 100644
index 000000000..9bc410ced
--- /dev/null
+++ b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m
@@ -0,0 +1,64 @@
+//
+// TestConnectionManager.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 11/6/15.
+// Copyright © 2015 smartdevicelink. All rights reserved.
+//
+
+#import "TestConnectionManager.h"
+
+#import "SDLRPCRequest.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation TestConnectionManager
+
+- (instancetype)init {
+ self = [super init];
+ if (!self) {
+ return nil;
+ }
+
+ _receivedRequests = [NSMutableArray<__kindof SDLRPCRequest *> array];
+
+ return self;
+}
+
+- (void)sendManagerRequest:(__kindof SDLRPCRequest *)request withResponseHandler:(nullable SDLResponseHandler)handler {
+ self.lastRequestBlock = handler;
+ request.correlationID = [self test_nextCorrelationID];
+
+ [self.receivedRequests addObject:request];
+}
+
+- (void)respondToLastRequestWithResponse:(__kindof SDLRPCResponse *)response {
+ [self respondToLastRequestWithResponse:response error:nil];
+}
+
+- (void)respondToLastRequestWithResponse:(__kindof SDLRPCResponse *_Nullable)response error:(NSError *_Nullable)error {
+ if (self.lastRequestBlock != nil) {
+ self.lastRequestBlock(self.receivedRequests.lastObject, response, error);
+ } else {
+ @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Attempted to respond to last request, but there was no last request block" userInfo:nil];
+ }
+}
+
+- (void)reset {
+ _receivedRequests = [NSMutableArray<__kindof SDLRPCRequest *> array];
+ _lastRequestBlock = nil;
+}
+
+
+#pragma mark Private helpers
+
+- (NSNumber *)test_nextCorrelationID {
+ static NSUInteger correlationID = 0;
+
+ return @(correlationID++);
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLinkTests/TestUtilities/TestStateMachineTarget.h b/SmartDeviceLinkTests/TestUtilities/TestStateMachineTarget.h
new file mode 100644
index 000000000..b316e7671
--- /dev/null
+++ b/SmartDeviceLinkTests/TestUtilities/TestStateMachineTarget.h
@@ -0,0 +1,34 @@
+//
+// TestStateMachineTarget.h
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 6/29/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NSString TestStateMachineTransitionType;
+extern TestStateMachineTransitionType *const SDLStateMachineTransitionTypeWillLeave;
+extern TestStateMachineTransitionType *const SDLStateMachineTransitionTypeWillTransition;
+extern TestStateMachineTransitionType *const SDLStateMachineTransitionTypeDidTransition;
+extern TestStateMachineTransitionType *const SDLStateMachineTransitionTypeDidEnter;
+
+/**
+ * Callback block that fires whenever one of the TestStateMachineTarget class' state transition methods is called.
+ *
+ * @param type The type of the transition. One of 'willLeave', 'willTransition', 'didTransition', or 'didEnter'
+ * @param oldState The old state, if available
+ * @param newState The new state, if available
+ */
+typedef void (^TestStateMachineCallback)(NSString *type, NSString *__nullable oldState, NSString *__nullable newState);
+
+@interface TestStateMachineTarget : NSObject
+
+@property (copy, nonatomic) TestStateMachineCallback callback;
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLinkTests/TestUtilities/TestStateMachineTarget.m b/SmartDeviceLinkTests/TestUtilities/TestStateMachineTarget.m
new file mode 100644
index 000000000..0b9c9024e
--- /dev/null
+++ b/SmartDeviceLinkTests/TestUtilities/TestStateMachineTarget.m
@@ -0,0 +1,41 @@
+//
+// TestStateMachineTarget.m
+// SmartDeviceLink-iOS
+//
+// Created by Joel Fischer on 6/29/16.
+// Copyright © 2016 smartdevicelink. All rights reserved.
+//
+
+#import "TestStateMachineTarget.h"
+
+#import "SDLStateMachine.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+TestStateMachineTransitionType *const SDLStateMachineTransitionTypeWillLeave = @"willLeave";
+TestStateMachineTransitionType *const SDLStateMachineTransitionTypeWillTransition = @"willTransition";
+TestStateMachineTransitionType *const SDLStateMachineTransitionTypeDidTransition = @"didTransition";
+TestStateMachineTransitionType *const SDLStateMachineTransitionTypeDidEnter = @"didEnter";
+
+@implementation TestStateMachineTarget
+
+- (void)willLeaveStateInitial {
+ self.callback(SDLStateMachineTransitionTypeWillLeave, @"Initial", nil);
+}
+
+- (void)willTransitionFromStateInitialToStateSecond {
+ self.callback(SDLStateMachineTransitionTypeWillTransition, @"Initial", @"Second");
+}
+
+- (void)didTransitionFromStateInitialToStateSecond {
+ self.callback(SDLStateMachineTransitionTypeDidTransition, @"Initial", @"Second");
+}
+
+- (void)didEnterStateSecond {
+ self.callback(SDLStateMachineTransitionTypeDidEnter, nil, @"Second");
+}
+
+@end
+
+NS_ASSUME_NONNULL_END \ No newline at end of file
diff --git a/SmartDeviceLinkTests/UtilitiesSpecs/Touches/SDLTouchManagerSpec.m b/SmartDeviceLinkTests/UtilitiesSpecs/Touches/SDLTouchManagerSpec.m
index 9ce6e50e8..50303e2a0 100644
--- a/SmartDeviceLinkTests/UtilitiesSpecs/Touches/SDLTouchManagerSpec.m
+++ b/SmartDeviceLinkTests/UtilitiesSpecs/Touches/SDLTouchManagerSpec.m
@@ -63,7 +63,7 @@ describe(@"SDLTouchManager Tests", ^{
__block void (^performTouchEvent)(SDLTouchManager* touchManager, SDLOnTouchEvent* onTouchEvent) = ^(SDLTouchManager* touchManager, SDLOnTouchEvent* onTouchEvent) {
SEL onOnTouchEvent = NSSelectorFromString(@"onOnTouchEvent:");
- ((void (*)(id, SEL, id))[touchManager methodForSelector:onOnTouchEvent])(touchManager, onOnTouchEvent, onTouchEvent);
+ ((void ( *)(id, SEL, id))[touchManager methodForSelector:onOnTouchEvent])(touchManager, onOnTouchEvent, onTouchEvent);
};
beforeEach(^{
diff --git a/SmartDeviceLink_Example/Base.lproj/LaunchScreen.xib b/SmartDeviceLink_Example/Base.lproj/LaunchScreen.xib
index 833c7dfd7..22193a99b 100644
--- a/SmartDeviceLink_Example/Base.lproj/LaunchScreen.xib
+++ b/SmartDeviceLink_Example/Base.lproj/LaunchScreen.xib
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
<dependencies>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
- <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
@@ -11,22 +11,25 @@
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
- <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SmartDeviceLink-iOS" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
- <rect key="frame" x="20" y="140" width="441" height="43"/>
- <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
- <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
- <nil key="highlightedColor"/>
- </label>
+ <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="sdl_logo_green" translatesAutoresizingMaskIntoConstraints="NO" id="poo-xI-0Ul">
+ <rect key="frame" x="180" y="180" width="120" height="120"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="120" id="Qxy-D7-W5Q"/>
+ <constraint firstAttribute="width" constant="120" id="cGG-br-MY0"/>
+ </constraints>
+ </imageView>
</subviews>
- <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <color key="backgroundColor" red="0.22352941176470587" green="0.30588235294117649" blue="0.37647058823529411" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
- <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
- <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
- <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
+ <constraint firstItem="poo-xI-0Ul" firstAttribute="centerX" secondItem="iN0-l3-epB" secondAttribute="centerX" id="KOL-c5-JSi"/>
+ <constraint firstItem="poo-xI-0Ul" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="nBn-xL-3N7"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="548" y="455"/>
</view>
</objects>
+ <resources>
+ <image name="sdl_logo_green" width="131" height="122"/>
+ </resources>
</document>
diff --git a/SmartDeviceLink_Example/Base.lproj/Main.storyboard b/SmartDeviceLink_Example/Base.lproj/Main.storyboard
index e0fd6eec5..e7cf57e32 100644
--- a/SmartDeviceLink_Example/Base.lproj/Main.storyboard
+++ b/SmartDeviceLink_Example/Base.lproj/Main.storyboard
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="mM3-m6-I5t">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="mM3-m6-I5t">
<dependencies>
<deployment identifier="iOS"/>
- <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
diff --git a/SmartDeviceLink_Example/Classes/AppDelegate.m b/SmartDeviceLink_Example/Classes/AppDelegate.m
index 23e5c54be..ac583c9cc 100644
--- a/SmartDeviceLink_Example/Classes/AppDelegate.m
+++ b/SmartDeviceLink_Example/Classes/AppDelegate.m
@@ -5,6 +5,7 @@
#import "AppDelegate.h"
#import "ProxyManager.h"
+#import "SDLManager.h"
@interface AppDelegate ()
diff --git a/SmartDeviceLink_Example/Classes/ConnectionIAPTableViewController.m b/SmartDeviceLink_Example/Classes/ConnectionIAPTableViewController.m
index 456f68cf2..0b0a785cc 100644
--- a/SmartDeviceLink_Example/Classes/ConnectionIAPTableViewController.m
+++ b/SmartDeviceLink_Example/Classes/ConnectionIAPTableViewController.m
@@ -45,13 +45,13 @@
ProxyState state = [ProxyManager sharedManager].state;
switch (state) {
case ProxyStateStopped: {
- [[ProxyManager sharedManager] startProxyWithTransportType:ProxyTransportTypeIAP];
+ [[ProxyManager sharedManager] startIAP];
} break;
case ProxyStateSearchingForConnection: {
- [[ProxyManager sharedManager] stopProxy];
+ [[ProxyManager sharedManager] reset];
} break;
case ProxyStateConnected: {
- [[ProxyManager sharedManager] stopProxy];
+ [[ProxyManager sharedManager] reset];
} break;
default: break;
}
@@ -71,21 +71,31 @@
#pragma mark - Private Methods
- (void)proxyManagerDidChangeState:(ProxyState)newState {
+ UIColor* newColor = nil;
+ NSString* newTitle = nil;
+
switch (newState) {
case ProxyStateStopped: {
- self.connectTableViewCell.backgroundColor = [UIColor redColor];
- self.connectButton.titleLabel.text = @"Connect";
+ newColor = [UIColor redColor];
+ newTitle = @"Connect";
} break;
case ProxyStateSearchingForConnection: {
- self.connectTableViewCell.backgroundColor = [UIColor blueColor];
- self.connectButton.titleLabel.text = @"Stop Searching";
+ newColor = [UIColor blueColor];
+ newTitle = @"Stop Searching";
} break;
case ProxyStateConnected: {
- self.connectTableViewCell.backgroundColor = [UIColor greenColor];
- self.connectButton.titleLabel.text = @"Disconnect";
+ newColor = [UIColor greenColor];
+ newTitle = @"Disconnect";
} break;
default: break;
}
+
+ if (newColor && newTitle) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ self.connectTableViewCell.backgroundColor = newColor;
+ self.connectButton.titleLabel.text = newTitle;
+ });
+ }
}
diff --git a/SmartDeviceLink_Example/Classes/ConnectionTCPTableViewController.m b/SmartDeviceLink_Example/Classes/ConnectionTCPTableViewController.m
index 9cb0110c7..330e87287 100644
--- a/SmartDeviceLink_Example/Classes/ConnectionTCPTableViewController.m
+++ b/SmartDeviceLink_Example/Classes/ConnectionTCPTableViewController.m
@@ -35,7 +35,7 @@
// Tableview setup
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.ipAddressTextField.text = [Preferences sharedPreferences].ipAddress;
- self.portTextField.text = [Preferences sharedPreferences].port;
+ self.portTextField.text = [@([Preferences sharedPreferences].port) stringValue];
// Connect Button setup
self.connectButton.tintColor = [UIColor whiteColor];
@@ -56,18 +56,18 @@
- (IBAction)connectButtonWasPressed:(UIButton *)sender {
[Preferences sharedPreferences].ipAddress = self.ipAddressTextField.text;
- [Preferences sharedPreferences].port = self.portTextField.text;
+ [Preferences sharedPreferences].port = self.portTextField.text.integerValue;
ProxyState state = [ProxyManager sharedManager].state;
switch (state) {
case ProxyStateStopped: {
- [[ProxyManager sharedManager] startProxyWithTransportType:ProxyTransportTypeTCP];
+ [[ProxyManager sharedManager] startTCP];
} break;
case ProxyStateSearchingForConnection: {
- [[ProxyManager sharedManager] stopProxy];
+ [[ProxyManager sharedManager] reset];
} break;
case ProxyStateConnected: {
- [[ProxyManager sharedManager] stopProxy];
+ [[ProxyManager sharedManager] reset];
} break;
default: break;
}
@@ -103,21 +103,31 @@
}
- (void)proxyManagerDidChangeState:(ProxyState)newState {
+ UIColor* newColor = nil;
+ NSString* newTitle = nil;
+
switch (newState) {
case ProxyStateStopped: {
- self.connectTableViewCell.backgroundColor = [UIColor redColor];
- self.connectButton.titleLabel.text = @"Connect";
+ newColor = [UIColor redColor];
+ newTitle = @"Connect";
} break;
case ProxyStateSearchingForConnection: {
- self.connectTableViewCell.backgroundColor = [UIColor blueColor];
- self.connectButton.titleLabel.text = @"Stop Searching";
+ newColor = [UIColor blueColor];
+ newTitle = @"Stop Searching";
} break;
case ProxyStateConnected: {
- self.connectTableViewCell.backgroundColor = [UIColor greenColor];
- self.connectButton.titleLabel.text = @"Disconnect";
+ newColor = [UIColor greenColor];
+ newTitle = @"Disconnect";
} break;
default: break;
}
+
+ if (newColor && newTitle) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ self.connectTableViewCell.backgroundColor = newColor;
+ self.connectButton.titleLabel.text = newTitle;
+ });
+ }
}
@end
diff --git a/SmartDeviceLink_Example/Classes/ConnectionTransitionContext.m b/SmartDeviceLink_Example/Classes/ConnectionTransitionContext.m
index ca01786c1..e46e19a10 100644
--- a/SmartDeviceLink_Example/Classes/ConnectionTransitionContext.m
+++ b/SmartDeviceLink_Example/Classes/ConnectionTransitionContext.m
@@ -51,6 +51,7 @@
return self;
}
+
#pragma mark - UIViewControllerContextTransitioning
- (CGRect)initialFrameForViewController:(UIViewController *)vc {
diff --git a/SmartDeviceLink_Example/Classes/Preferences.h b/SmartDeviceLink_Example/Classes/Preferences.h
index 5b628cf92..4a982b7fc 100644
--- a/SmartDeviceLink_Example/Classes/Preferences.h
+++ b/SmartDeviceLink_Example/Classes/Preferences.h
@@ -15,7 +15,7 @@
/***** Computed Properties *****/
// Connection
@property (strong, nonatomic) NSString *ipAddress;
-@property (strong, nonatomic) NSString *port;
+@property (assign, nonatomic) UInt16 port;
+ (instancetype)sharedPreferences;
diff --git a/SmartDeviceLink_Example/Classes/Preferences.m b/SmartDeviceLink_Example/Classes/Preferences.m
index f103998da..a3082bd4f 100644
--- a/SmartDeviceLink_Example/Classes/Preferences.m
+++ b/SmartDeviceLink_Example/Classes/Preferences.m
@@ -9,7 +9,7 @@ NSString *const IPAddressPreferencesKey = @"SDLExampleAppIPAddress";
NSString *const PortPreferencesKey = @"SDLExampleAppPort";
NSString *const DefaultIPAddressValue = @"192.168.1.1";
-NSString *const DefaultPortValue = @"12345";
+UInt16 const DefaultPortValue = 12345;
@@ -40,7 +40,7 @@ NSString *const DefaultPortValue = @"12345";
return nil;
}
- if (self.ipAddress == nil || self.port == nil) {
+ if (self.ipAddress == nil || self.port == 0) {
[self resetPreferences];
}
@@ -66,12 +66,12 @@ NSString *const DefaultPortValue = @"12345";
[self setString:ipAddress forKey:IPAddressPreferencesKey];
}
-- (NSString *)port {
- return [self stringForKey:PortPreferencesKey];
+- (UInt16)port {
+ return (UInt16)[self integerForKey:PortPreferencesKey];
}
-- (void)setPort:(NSString *)port {
- [self setString:port forKey:PortPreferencesKey];
+- (void)setPort:(UInt16)port {
+ [self setInteger:port forKey:PortPreferencesKey];
}
@@ -96,6 +96,25 @@ NSString *const DefaultPortValue = @"12345";
return retVal;
}
+- (void)setInteger:(NSInteger)aInt forKey:(NSString *)aKey {
+ NSParameterAssert(aKey != nil);
+
+ dispatch_async(self.class.preferencesQueue, ^{
+ [[NSUserDefaults standardUserDefaults] setInteger:aInt forKey:aKey];
+ });
+}
+
+- (NSInteger)integerForKey:(NSString *)aKey {
+ NSParameterAssert(aKey != nil);
+
+ __block NSInteger retVal = 0;
+ dispatch_sync(self.class.preferencesQueue, ^{
+ retVal = [[NSUserDefaults standardUserDefaults] integerForKey:aKey];
+ });
+
+ return retVal;
+}
+
#pragma mark - Class Queue
diff --git a/SmartDeviceLink_Example/Classes/ProxyManager.h b/SmartDeviceLink_Example/Classes/ProxyManager.h
index 2d82bd698..333bb6dbf 100644
--- a/SmartDeviceLink_Example/Classes/ProxyManager.h
+++ b/SmartDeviceLink_Example/Classes/ProxyManager.h
@@ -4,7 +4,7 @@
#import <Foundation/Foundation.h>
-@class SDLProxy;
+@class SDLManager;
@class SDLStreamingMediaManager;
@@ -24,13 +24,11 @@ typedef NS_ENUM(NSUInteger, ProxyState) {
@interface ProxyManager : NSObject
@property (assign, nonatomic, readonly) ProxyState state;
-@property (strong, nonatomic) SDLProxy *proxy;
+@property (strong, nonatomic) SDLManager *sdlManager;
+ (instancetype)sharedManager;
-- (void)startProxyWithTransportType:(ProxyTransportType)transportType;
-- (void)resetProxyWithTransportType:(ProxyTransportType)transportType;
-- (void)stopProxy;
-
-@property (strong, nonatomic, readonly) SDLStreamingMediaManager *mediaManager;
+- (void)startIAP;
+- (void)startTCP;
+- (void)reset;
@end
diff --git a/SmartDeviceLink_Example/Classes/ProxyManager.m b/SmartDeviceLink_Example/Classes/ProxyManager.m
index a37d5cb18..55dbe2a3a 100644
--- a/SmartDeviceLink_Example/Classes/ProxyManager.m
+++ b/SmartDeviceLink_Example/Classes/ProxyManager.m
@@ -9,15 +9,33 @@
#import "Preferences.h"
-NSString *const SDLAppName = @"SDL Test";
+NSString *const SDLAppName = @"SDL Example App";
NSString *const SDLAppId = @"9999";
+NSString *const PointingSoftButtonArtworkName = @"PointingSoftButtonIcon";
+NSString *const MainGraphicArtworkName = @"MainArtwork";
-@interface ProxyManager () <SDLProxyListener>
+typedef NS_ENUM(NSUInteger, SDLHMIFirstState) {
+ SDLHMIFirstStateNone,
+ SDLHMIFirstStateNonNone,
+ SDLHMIFirstStateFull
+};
+
+typedef NS_ENUM(NSUInteger, SDLHMIInitialShowState) {
+ SDLHMIInitialShowStateNone,
+ SDLHMIInitialShowStateDataAvailable,
+ SDLHMIInitialShowStateShown
+};
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface ProxyManager () <SDLManagerDelegate>
+
+// Describes the first time the HMI state goes non-none and full.
+@property (assign, nonatomic) SDLHMIFirstState firstTimeState;
+@property (assign, nonatomic) SDLHMIInitialShowState initialShowState;
-@property (assign, nonatomic, readwrite) ProxyState state;
-@property (assign, nonatomic) BOOL isFirstHMIFull;
-@property (assign, nonatomic) ProxyTransportType currentTransportType;
@end
@@ -41,107 +59,323 @@ NSString *const SDLAppId = @"9999";
return nil;
}
- _proxy = nil;
_state = ProxyStateStopped;
- _isFirstHMIFull = NO;
- _currentTransportType = ProxyTransportTypeUnknown;
+ _firstTimeState = SDLHMIFirstStateNone;
+ _initialShowState = SDLHMIInitialShowStateNone;
return self;
}
+- (void)startIAP {
+ [self sdlex_updateProxyState:ProxyStateSearchingForConnection];
+ SDLLifecycleConfiguration *lifecycleConfig = [self.class setLifecycleConfigurationPropertiesOnConfiguration:[SDLLifecycleConfiguration defaultConfigurationWithAppName:SDLAppName appId:SDLAppId]];
+
+ // Assume this is production and disable logging
+ lifecycleConfig.logFlags = SDLLogOutputNone;
+
+ SDLConfiguration *config = [SDLConfiguration configurationWithLifecycle:lifecycleConfig lockScreen:[SDLLockScreenConfiguration enabledConfiguration]];
+ self.sdlManager = [[SDLManager alloc] initWithConfiguration:config delegate:self];
+
+ [self startManager];
+}
-#pragma mark - Public Proxy Setup
-
-- (void)resetProxyWithTransportType:(ProxyTransportType)transportType {
- [self stopProxy];
- [self startProxyWithTransportType:transportType];
+- (void)startTCP {
+ [self sdlex_updateProxyState:ProxyStateSearchingForConnection];
+ SDLLifecycleConfiguration *lifecycleConfig = [self.class setLifecycleConfigurationPropertiesOnConfiguration:[SDLLifecycleConfiguration debugConfigurationWithAppName:SDLAppName appId:SDLAppId ipAddress:[Preferences sharedPreferences].ipAddress port:[Preferences sharedPreferences].port]];
+ SDLConfiguration *config = [SDLConfiguration configurationWithLifecycle:lifecycleConfig lockScreen:[SDLLockScreenConfiguration enabledConfiguration]];
+ self.sdlManager = [[SDLManager alloc] initWithConfiguration:config delegate:self];
+
+ [self startManager];
}
+- (void)startManager {
+ __weak typeof (self) weakSelf = self;
+ [self.sdlManager startWithReadyHandler:^(BOOL success, NSError * _Nullable error) {
+ if (!success) {
+ NSLog(@"SDL errored starting up: %@", error);
+ [weakSelf sdlex_updateProxyState:ProxyStateStopped];
+ } else {
+ [weakSelf sdlex_updateProxyState:ProxyStateConnected];
+ }
+
+ [self setupPermissionsCallbacks];
+
+ if ([weakSelf.sdlManager.hmiLevel isEqualToEnum:[SDLHMILevel FULL]]) {
+ [weakSelf showInitialData];
+ }
+ }];
+}
-#pragma mark - Private Proxy Setup
+- (void)reset {
+ [self.sdlManager stop];
+}
-- (void)startProxyWithTransportType:(ProxyTransportType)transportType {
- if (self.proxy != nil) {
+- (void)showInitialData {
+ if ((self.initialShowState != SDLHMIInitialShowStateDataAvailable) || ![self.sdlManager.hmiLevel isEqualToEnum:[SDLHMILevel FULL]]) {
return;
}
+
+ self.initialShowState = SDLHMIInitialShowStateShown;
+
+ SDLShow* show = [[SDLShow alloc] initWithMainField1:@"SDL" mainField2:@"Test App" alignment:[SDLTextAlignment CENTERED]];
+ SDLSoftButton *pointingSoftButton = [self.class pointingSoftButtonWithManager:self.sdlManager];
+ show.softButtons = [@[pointingSoftButton] mutableCopy];
+ show.graphic = [self.class mainGraphicImage];
+
+ [self.sdlManager sendRequest:show];
+}
- self.currentTransportType = transportType;
- self.isFirstHMIFull = YES;
- self.state = ProxyStateSearchingForConnection;
-
- switch (transportType) {
- case ProxyTransportTypeTCP: {
- self.proxy = [SDLProxyFactory buildSDLProxyWithListener:self tcpIPAddress:[Preferences sharedPreferences].ipAddress tcpPort:[Preferences sharedPreferences].port];
- } break;
- case ProxyTransportTypeIAP: {
- self.proxy = [SDLProxyFactory buildSDLProxyWithListener:self];
- } break;
- default: NSAssert(NO, @"Unknown transport setup: %@", @(transportType));
- }
+- (void)setupPermissionsCallbacks {
+ // This will tell you whether or not you can use the Show RPC right at this moment
+ BOOL isAvailable = [self.sdlManager.permissionManager isRPCAllowed:@"Show"];
+ NSLog(@"Show is allowed? %@", @(isAvailable));
+
+ // This will set up a block that will tell you whether or not you can use none, all, or some of the RPCs specified, and notifies you when those permissions change
+ SDLPermissionObserverIdentifier observerId = [self.sdlManager.permissionManager addObserverForRPCs:@[@"Show", @"Alert"] groupType:SDLPermissionGroupTypeAllAllowed withHandler:^(NSDictionary<SDLPermissionRPCName, NSNumber<SDLBool> *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ NSLog(@"Show changed permission to status: %@, dict: %@", @(status), change);
+ }];
+ // The above block will be called immediately, this will then remove the block from being called any more
+ [self.sdlManager.permissionManager removeObserverForIdentifier:observerId];
+
+ // This will give us the current status of the group of RPCs, as if we had set up an observer, except these are one-shot calls
+ NSArray *rpcGroup =@[@"AddCommand", @"PerformInteraction"];
+ SDLPermissionGroupStatus commandPICSStatus = [self.sdlManager.permissionManager groupStatusOfRPCs:rpcGroup];
+ NSDictionary *commandPICSStatusDict = [self.sdlManager.permissionManager statusOfRPCs:rpcGroup];
+ NSLog(@"Command / PICS status: %@, dict: %@", @(commandPICSStatus), commandPICSStatusDict);
+
+ // This will set up a long-term observer for the RPC group and will tell us when the status of any specified RPC changes (due to the `SDLPermissionGroupTypeAny`) option.
+ [self.sdlManager.permissionManager addObserverForRPCs:rpcGroup groupType:SDLPermissionGroupTypeAny withHandler:^(NSDictionary<SDLPermissionRPCName, NSNumber<SDLBool> *> * _Nonnull change, SDLPermissionGroupStatus status) {
+ NSLog(@"Command / PICS changed permission to status: %@, dict: %@", @(status), change);
+ }];
}
-- (void)stopProxy {
- self.state = ProxyStateStopped;
++ (SDLLifecycleConfiguration *)setLifecycleConfigurationPropertiesOnConfiguration:(SDLLifecycleConfiguration *)config {
+ SDLArtwork *appIconArt = [SDLArtwork persistentArtworkWithImage:[UIImage imageNamed:@"AppIcon60x60@2x"] name:@"AppIcon" asImageFormat:SDLArtworkImageFormatPNG];
- if (self.proxy != nil) {
- [self.proxy dispose];
- self.proxy = nil;
+ config.shortAppName = @"SDL Example";
+ config.appIcon = appIconArt;
+ config.voiceRecognitionCommandNames = @[@"S D L Example"];
+ config.ttsName = [SDLTTSChunk textChunksFromString:config.shortAppName];
+ return config;
+}
+
+- (void)sdlex_updateProxyState:(ProxyState)newState {
+ if (self.state != newState) {
+ [self willChangeValueForKey:@"state"];
+ _state = newState;
+ [self didChangeValueForKey:@"state"];
}
}
-- (void)showInitialData {
- SDLShow *showRPC = [SDLRPCRequestFactory buildShowWithMainField1:@"SDL" mainField2:@"Test" alignment:[SDLTextAlignment CENTERED] correlationID:[self nextCorrelationID]];
- [self.proxy sendRPC:showRPC];
+#pragma mark - RPC builders
+
++ (SDLAddCommand *)speakNameCommandWithManager:(SDLManager *)manager {
+ NSString *commandName = @"Speak App Name";
+
+ SDLMenuParams *commandMenuParams = [[SDLMenuParams alloc] init];
+ commandMenuParams.menuName = commandName;
+
+ SDLAddCommand *speakNameCommand = [[SDLAddCommand alloc] init];
+ speakNameCommand.vrCommands = [NSMutableArray arrayWithObject:commandName];
+ speakNameCommand.menuParams = commandMenuParams;
+ speakNameCommand.cmdID = @0;
+
+ speakNameCommand.handler = ^void(SDLOnCommand *notification) {
+ [manager sendRequest:[self.class appNameSpeak]];
+ };
+
+ return speakNameCommand;
}
++ (SDLAddCommand *)interactionSetCommandWithManager:(SDLManager *)manager {
+ NSString *commandName = @"Perform Interaction";
+
+ SDLMenuParams *commandMenuParams = [[SDLMenuParams alloc] init];
+ commandMenuParams.menuName = commandName;
+
+ SDLAddCommand *performInteractionCommand = [[SDLAddCommand alloc] init];
+ performInteractionCommand.vrCommands = [NSMutableArray arrayWithObject:commandName];
+ performInteractionCommand.menuParams = commandMenuParams;
+ performInteractionCommand.cmdID = @1;
+
+ // NOTE: You may want to preload your interaction sets, because they can take a while for the remote system to process. We're going to ignore our own advice here.
+ __weak typeof(self) weakSelf = self;
+ performInteractionCommand.handler = ^void(SDLOnCommand *notification) {
+ [weakSelf sendPerformOnlyChoiceInteractionWithManager:manager];
+ };
+
+ return performInteractionCommand;
+}
-#pragma mark - Private Proxy Helpers
++ (SDLSpeak *)appNameSpeak {
+ SDLSpeak *speak = [[SDLSpeak alloc] init];
+ speak.ttsChunks = [SDLTTSChunk textChunksFromString:@"S D L Example App"];
-- (NSNumber *)nextCorrelationID {
- static NSInteger _correlationID = 1;
- return @(_correlationID++);
+ return speak;
}
-- (UInt32)nextMessageNumber {
- static UInt32 _messageNumber = 1;
- return _messageNumber++;
++ (SDLSpeak *)goodJobSpeak {
+ SDLSpeak *speak = [[SDLSpeak alloc] init];
+ speak.ttsChunks = [SDLTTSChunk textChunksFromString:@"Good Job"];
+
+ return speak;
}
++ (SDLSpeak *)youMissedItSpeak {
+ SDLSpeak *speak = [[SDLSpeak alloc] init];
+ speak.ttsChunks = [SDLTTSChunk textChunksFromString:@"You missed it"];
-#pragma mark - SDLProxyListner delegate methods
+ return speak;
+}
-- (void)onProxyOpened {
- self.state = ProxyStateConnected;
++ (SDLCreateInteractionChoiceSet *)createOnlyChoiceInteractionSet {
+ SDLCreateInteractionChoiceSet *createInteractionSet = [[SDLCreateInteractionChoiceSet alloc] init];
+ createInteractionSet.interactionChoiceSetID = @0;
+
+ NSString *theOnlyChoiceName = @"The Only Choice";
+ SDLChoice *theOnlyChoice = [[SDLChoice alloc] init];
+ theOnlyChoice.choiceID = @0;
+ theOnlyChoice.menuName = theOnlyChoiceName;
+ theOnlyChoice.vrCommands = [NSMutableArray arrayWithObject:theOnlyChoiceName];
+
+ createInteractionSet.choiceSet = [NSMutableArray arrayWithArray:@[theOnlyChoice]];
- SDLRegisterAppInterface *registerRequest = [SDLRPCRequestFactory buildRegisterAppInterfaceWithAppName:SDLAppName languageDesired:[SDLLanguage EN_US] appID:SDLAppId];
- registerRequest.appHMIType = [NSMutableArray arrayWithObjects:[SDLAppHMIType MEDIA], nil];
- [self.proxy sendRPC:registerRequest];
+ return createInteractionSet;
}
-- (void)onProxyClosed {
- [self resetProxyWithTransportType:self.currentTransportType];
++ (void)sendPerformOnlyChoiceInteractionWithManager:(SDLManager *)manager {
+ SDLPerformInteraction *performOnlyChoiceInteraction = [[SDLPerformInteraction alloc] init];
+ performOnlyChoiceInteraction.initialText = @"Choose the only one! You have 5 seconds...";
+ performOnlyChoiceInteraction.initialPrompt = [SDLTTSChunk textChunksFromString:@"Choose it"];
+ performOnlyChoiceInteraction.interactionMode = [SDLInteractionMode BOTH];
+ performOnlyChoiceInteraction.interactionChoiceSetIDList = [NSMutableArray arrayWithObject:@0];
+ performOnlyChoiceInteraction.helpPrompt = [SDLTTSChunk textChunksFromString:@"Do it"];
+ performOnlyChoiceInteraction.timeoutPrompt = [SDLTTSChunk textChunksFromString:@"Too late"];
+ performOnlyChoiceInteraction.timeout = @5000;
+ performOnlyChoiceInteraction.interactionLayout = [SDLLayoutMode LIST_ONLY];
+
+ [manager sendRequest:performOnlyChoiceInteraction withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLPerformInteractionResponse * _Nullable response, NSError * _Nullable error) {
+ if ((response == nil) || (error != nil)) {
+ NSLog(@"Something went wrong, no perform interaction response: %@", error);
+ }
+
+ if ([response.choiceID isEqualToNumber:@0]) {
+ [manager sendRequest:[self goodJobSpeak]];
+ } else {
+ [manager sendRequest:[self youMissedItSpeak]];
+ }
+ }];
}
-- (void)onOnDriverDistraction:(SDLOnDriverDistraction *)notification {
++ (SDLSoftButton *)pointingSoftButtonWithManager:(SDLManager *)manager {
+ SDLSoftButton* softButton = [[SDLSoftButton alloc] initWithHandler:^(__kindof SDLRPCNotification *notification) {
+ if ([notification isKindOfClass:[SDLOnButtonPress class]]) {
+ SDLAlert* alert = [[SDLAlert alloc] init];
+ alert.alertText1 = @"You pushed the button!";
+ [manager sendRequest:alert];
+ }
+ }];
+ softButton.text = @"Press";
+ softButton.softButtonID = @100;
+ softButton.type = SDLSoftButtonType.BOTH;
+
+ SDLImage* image = [[SDLImage alloc] init];
+ image.imageType = SDLImageType.DYNAMIC;
+ image.value = PointingSoftButtonArtworkName;
+ softButton.image = image;
+ return softButton;
+}
+
++ (SDLImage *)mainGraphicImage {
+ SDLImage* image = [[SDLImage alloc] init];
+ image.imageType = SDLImageType.DYNAMIC;
+ image.value = MainGraphicArtworkName;
+
+ return image;
+}
+
+
+#pragma mark - Files / Artwork
+
++ (SDLArtwork *)pointingSoftButtonArtwork {
+ return [SDLArtwork artworkWithImage:[UIImage imageNamed:@"sdl_softbutton_icon"] name:PointingSoftButtonArtworkName asImageFormat:SDLArtworkImageFormatPNG];
+}
+
++ (SDLArtwork *)mainGraphicArtwork {
+ return [SDLArtwork artworkWithImage:[UIImage imageNamed:@"sdl_logo_green"] name:MainGraphicArtworkName asImageFormat:SDLArtworkImageFormatPNG];
}
-- (void)onOnHMIStatus:(SDLOnHMIStatus *)notification {
- if ((notification.hmiLevel == [SDLHMILevel FULL]) && self.isFirstHMIFull) {
+- (void)prepareRemoteSystem {
+ [self.sdlManager sendRequest:[self.class speakNameCommandWithManager:self.sdlManager]];
+ [self.sdlManager sendRequest:[self.class interactionSetCommandWithManager:self.sdlManager]];
+
+ dispatch_group_t dataDispatchGroup = dispatch_group_create();
+ dispatch_group_enter(dataDispatchGroup);
+
+ dispatch_group_enter(dataDispatchGroup);
+ [self.sdlManager.fileManager uploadFile:[self.class mainGraphicArtwork] completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ dispatch_group_leave(dataDispatchGroup);
+
+ if (success == NO) {
+ NSLog(@"Something went wrong, image could not upload: %@", error);
+ return;
+ }
+ }];
+
+ dispatch_group_enter(dataDispatchGroup);
+ [self.sdlManager.fileManager uploadFile:[self.class pointingSoftButtonArtwork] completionHandler:^(BOOL success, NSUInteger bytesAvailable, NSError * _Nullable error) {
+ dispatch_group_leave(dataDispatchGroup);
+
+ if (success == NO) {
+ NSLog(@"Something went wrong, image could not upload: %@", error);
+ return;
+ }
+ }];
+
+ dispatch_group_enter(dataDispatchGroup);
+ [self.sdlManager sendRequest:[self.class createOnlyChoiceInteractionSet] withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
+ // Interaction choice set ready
+ dispatch_group_leave(dataDispatchGroup);
+ }];
+
+ dispatch_group_leave(dataDispatchGroup);
+ dispatch_group_notify(dataDispatchGroup, dispatch_get_main_queue(), ^{
+ self.initialShowState = SDLHMIInitialShowStateDataAvailable;
[self showInitialData];
- self.isFirstHMIFull = NO;
- }
+ });
+}
+
+
+#pragma mark - SDLManagerDelegate
+
+- (void)managerDidDisconnect {
+ // Reset our state
+ self.firstTimeState = SDLHMIFirstStateNone;
+ self.initialShowState = SDLHMIInitialShowStateNone;
+ _state = ProxyStateStopped;
}
-- (void)onReceivedLockScreenIcon:(UIImage *)icon {
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Lock Screen Icon" message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
- UIImageView *imageView = [[UIImageView alloc] initWithImage:icon];
- if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
- [alert setValue:imageView forKey:@"accessoryView"];
- }else{
- [alert addSubview:imageView];
+- (void)hmiLevel:(SDLHMILevel *)oldLevel didChangeToLevel:(SDLHMILevel *)newLevel {
+ if (![newLevel isEqualToEnum:[SDLHMILevel NONE]] && (self.firstTimeState == SDLHMIFirstStateNone)) {
+ // This is our first time in a non-NONE state
+ self.firstTimeState = SDLHMIFirstStateNonNone;
+
+ // Send AddCommands
+ [self prepareRemoteSystem];
+ }
+
+ if ([newLevel isEqualToEnum:[SDLHMILevel FULL]] && (self.firstTimeState != SDLHMIFirstStateFull)) {
+ // This is our first time in a FULL state
+ self.firstTimeState = SDLHMIFirstStateFull;
+ }
+
+ if ([newLevel isEqualToEnum:[SDLHMILevel FULL]]) {
+ // We're always going to try to show the initial state, because if we've already shown it, it won't be shown, and we need to guard against some possible weird states
+ [self showInitialData];
}
- [alert show];
}
@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Contents.json b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Contents.json
index 118c98f74..6ca49d84c 100644
--- a/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Contents.json
+++ b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -2,32 +2,48 @@
"images" : [
{
"idiom" : "iphone",
- "size" : "29x29",
+ "size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
- "size" : "29x29",
+ "size" : "20x20",
"scale" : "3x"
},
{
+ "size" : "29x29",
"idiom" : "iphone",
- "size" : "40x40",
+ "filename" : "Icon-Small@2x.png",
"scale" : "2x"
},
{
+ "size" : "29x29",
"idiom" : "iphone",
- "size" : "40x40",
+ "filename" : "Icon-Small@3x.png",
"scale" : "3x"
},
{
+ "size" : "40x40",
"idiom" : "iphone",
- "size" : "60x60",
+ "filename" : "Icon-Small-40@2x.png",
"scale" : "2x"
},
{
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-60@2x-1.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
"idiom" : "iphone",
+ "filename" : "Icon-60@2x.png",
+ "scale" : "2x"
+ },
+ {
"size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-60@3x.png",
"scale" : "3x"
}
],
diff --git a/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@2x-1.png b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@2x-1.png
new file mode 100644
index 000000000..96eb6cf4e
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@2x-1.png
Binary files differ
diff --git a/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png
new file mode 100644
index 000000000..96eb6cf4e
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png
Binary files differ
diff --git a/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png
new file mode 100644
index 000000000..148b6b035
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png
Binary files differ
diff --git a/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png
new file mode 100644
index 000000000..96c19098b
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png
Binary files differ
diff --git a/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png
new file mode 100644
index 000000000..cb4b2fca3
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png
Binary files differ
diff --git a/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png
new file mode 100644
index 000000000..ee66223a7
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png
Binary files differ
diff --git a/SmartDeviceLink_Example/Images.xcassets/Contents.json b/SmartDeviceLink_Example/Images.xcassets/Contents.json
new file mode 100644
index 000000000..da4a164c9
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/Contents.json b/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/Contents.json
new file mode 100644
index 000000000..63b272052
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "sdl_logo_green.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "sdl_logo_green@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "sdl_logo_green@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green.png b/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green.png
new file mode 100644
index 000000000..0e0a373d1
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green.png
Binary files differ
diff --git a/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green@2x.png b/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green@2x.png
new file mode 100644
index 000000000..d79b86eb1
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green@2x.png
Binary files differ
diff --git a/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green@3x.png b/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green@3x.png
new file mode 100644
index 000000000..e1e6bd476
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/sdl_logo_green.imageset/sdl_logo_green@3x.png
Binary files differ
diff --git a/SmartDeviceLink_Example/Images.xcassets/sdl_softbutton_icon.imageset/Contents.json b/SmartDeviceLink_Example/Images.xcassets/sdl_softbutton_icon.imageset/Contents.json
new file mode 100644
index 000000000..602211b70
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/sdl_softbutton_icon.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "sdl_softbutton_icon.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/SmartDeviceLink_Example/Images.xcassets/sdl_softbutton_icon.imageset/sdl_softbutton_icon.png b/SmartDeviceLink_Example/Images.xcassets/sdl_softbutton_icon.imageset/sdl_softbutton_icon.png
new file mode 100644
index 000000000..458d83fd9
--- /dev/null
+++ b/SmartDeviceLink_Example/Images.xcassets/sdl_softbutton_icon.imageset/sdl_softbutton_icon.png
Binary files differ
diff --git a/SmartDeviceLink_Example/Info.plist b/SmartDeviceLink_Example/Info.plist
index 4754f95a8..46c664ea1 100644
--- a/SmartDeviceLink_Example/Info.plist
+++ b/SmartDeviceLink_Example/Info.plist
@@ -15,17 +15,32 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
- <string>1.0</string>
+ <string>4.3.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
+ <key>NSAppTransportSecurity</key>
+ <dict>
+ <key>NSExceptionDomains</key>
+ <dict>
+ <key>ford.com</key>
+ <dict>
+ <key>NSIncludesSubdomains</key>
+ <true/>
+ <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
+ <true/>
+ </dict>
+ </dict>
+ </dict>
<key>UIBackgroundModes</key>
<array>
<string>external-accessory</string>
</array>
+ <key>UIFileSharingEnabled</key>
+ <true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
@@ -68,21 +83,6 @@
<string>com.smartdevicelink.prot0</string>
<string>com.ford.sync.prot0</string>
</array>
- <key>NSAppTransportSecurity</key>
- <dict>
- <key>NSExceptionDomains</key>
- <dict>
- <key>ford.com</key>
- <dict>
- <!--Include to allow subdomains-->
- <key>NSIncludesSubdomains</key>
- <true/>
- <!--Include to allow HTTP requests-->
- <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
- <true/>
- </dict>
- </dict>
- </dict>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
diff --git a/docs/Categories.html b/docs/Categories.html
new file mode 100644
index 000000000..296bc401b
--- /dev/null
+++ b/docs/Categories.html
@@ -0,0 +1,26 @@
+<h1>Categories Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-NSNumber(NumberType)">NSNumber(NumberType)</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>The following categories are available globally.</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-NSNumber(NumberType)">
+ NSNumber(NumberType)
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+</section>
diff --git a/docs/Classes.html b/docs/Classes.html
index d445387f7..3b0e09e60 100644
--- a/docs/Classes.html
+++ b/docs/Classes.html
@@ -18,6 +18,7 @@
<li><a href="#section-SDLAppHMIType">SDLAppHMIType</a></li>
<li><a href="#section-SDLAppInfo">SDLAppInfo</a></li>
<li><a href="#section-SDLAppInterfaceUnregisteredReason">SDLAppInterfaceUnregisteredReason</a></li>
+ <li><a href="#section-SDLArtwork">SDLArtwork</a></li>
<li><a href="#section-SDLAudioPassThruCapabilities">SDLAudioPassThruCapabilities</a></li>
<li><a href="#section-SDLAudioStreamingState">SDLAudioStreamingState</a></li>
<li><a href="#section-SDLAudioType">SDLAudioType</a></li>
@@ -36,6 +37,7 @@
<li><a href="#section-SDLClusterModeStatus">SDLClusterModeStatus</a></li>
<li><a href="#section-SDLCompassDirection">SDLCompassDirection</a></li>
<li><a href="#section-SDLComponentVolumeStatus">SDLComponentVolumeStatus</a></li>
+ <li><a href="#section-SDLConfiguration">SDLConfiguration</a></li>
<li><a href="#section-SDLConsoleController">SDLConsoleController</a></li>
<li><a href="#section-SDLCreateInteractionChoiceSet">SDLCreateInteractionChoiceSet</a></li>
<li><a href="#section-SDLCreateInteractionChoiceSetResponse">SDLCreateInteractionChoiceSetResponse</a></li>
@@ -69,6 +71,8 @@
<li><a href="#section-SDLEndAudioPassThru">SDLEndAudioPassThru</a></li>
<li><a href="#section-SDLEndAudioPassThruResponse">SDLEndAudioPassThruResponse</a></li>
<li><a href="#section-SDLEnum">SDLEnum</a></li>
+ <li><a href="#section-SDLFile">SDLFile</a></li>
+ <li><a href="#section-SDLFileManager">SDLFileManager</a></li>
<li><a href="#section-SDLFileType">SDLFileType</a></li>
<li><a href="#section-SDLFuelCutoffStatus">SDLFuelCutoffStatus</a></li>
<li><a href="#section-SDLGPSData">SDLGPSData</a></li>
@@ -99,13 +103,18 @@
<li><a href="#section-SDLKeypressMode">SDLKeypressMode</a></li>
<li><a href="#section-SDLLanguage">SDLLanguage</a></li>
<li><a href="#section-SDLLayoutMode">SDLLayoutMode</a></li>
+ <li><a href="#section-SDLLifecycleConfiguration">SDLLifecycleConfiguration</a></li>
<li><a href="#section-SDLListFiles">SDLListFiles</a></li>
<li><a href="#section-SDLListFilesResponse">SDLListFilesResponse</a></li>
+ <li><a href="#section-SDLLockScreenConfiguration">SDLLockScreenConfiguration</a></li>
<li><a href="#section-SDLLockScreenStatus">SDLLockScreenStatus</a></li>
+ <li><a href="#section-SDLLockScreenViewController">SDLLockScreenViewController</a></li>
<li><a href="#section-SDLMaintenanceModeStatus">SDLMaintenanceModeStatus</a></li>
+ <li><a href="#section-SDLManager">SDLManager</a></li>
<li><a href="#section-SDLMediaClockFormat">SDLMediaClockFormat</a></li>
<li><a href="#section-SDLMenuParams">SDLMenuParams</a></li>
<li><a href="#section-SDLMyKey">SDLMyKey</a></li>
+ <li><a href="#section-SDLNotificationConstants">SDLNotificationConstants</a></li>
<li><a href="#section-SDLOnAppInterfaceUnregistered">SDLOnAppInterfaceUnregistered</a></li>
<li><a href="#section-SDLOnAudioPassThru">SDLOnAudioPassThru</a></li>
<li><a href="#section-SDLOnButtonEvent">SDLOnButtonEvent</a></li>
@@ -131,6 +140,7 @@
<li><a href="#section-SDLPerformInteraction">SDLPerformInteraction</a></li>
<li><a href="#section-SDLPerformInteractionResponse">SDLPerformInteractionResponse</a></li>
<li><a href="#section-SDLPermissionItem">SDLPermissionItem</a></li>
+ <li><a href="#section-SDLPermissionManager">SDLPermissionManager</a></li>
<li><a href="#section-SDLPermissionStatus">SDLPermissionStatus</a></li>
<li><a href="#section-SDLPowerModeQualificationStatus">SDLPowerModeQualificationStatus</a></li>
<li><a href="#section-SDLPowerModeStatus">SDLPowerModeStatus</a></li>
@@ -147,9 +157,11 @@
<li><a href="#section-SDLPutFileResponse">SDLPutFileResponse</a></li>
<li><a href="#section-SDLRPCMessage">SDLRPCMessage</a></li>
<li><a href="#section-SDLRPCNotification">SDLRPCNotification</a></li>
+ <li><a href="#section-SDLRPCNotificationNotification">SDLRPCNotificationNotification</a></li>
<li><a href="#section-SDLRPCRequest">SDLRPCRequest</a></li>
<li><a href="#section-SDLRPCRequestFactory">SDLRPCRequestFactory</a></li>
<li><a href="#section-SDLRPCResponse">SDLRPCResponse</a></li>
+ <li><a href="#section-SDLRPCResponseNotification">SDLRPCResponseNotification</a></li>
<li><a href="#section-SDLRPCStruct">SDLRPCStruct</a></li>
<li><a href="#section-SDLReadDID">SDLReadDID</a></li>
<li><a href="#section-SDLReadDIDResponse">SDLReadDIDResponse</a></li>
@@ -302,11 +314,11 @@
<h4>Objective-C</h4>
- <pre class="highlight"><code><span class="k">@interface</span> <span class="nc">SDLAddCommand</span> <span class="p">:</span> <span class="nc">SDLRPCRequest</span></code></pre>
+ <pre class="highlight"><code><span class="k">@interface</span> <span class="nc">SDLAddCommand</span> <span class="p">:</span> <span class="nc">SDLRPCRequest</span> <span class="o">&lt;</span><span class="n"><a href="Protocols/SDLRequestHandler.html">SDLRequestHandler</a></span><span class="o">&gt;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight"><code><span class="kd">class</span> <span class="kt">SDLAddCommand</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCRequest.html">SDLRPCRequest</a></span></code></pre>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kt">SDLAddCommand</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCRequest.html">SDLRPCRequest</a></span><span class="p">,</span> <span class="kt"><a href="Protocols/SDLRequestHandler.html">SDLRequestHandler</a></span></code></pre>
@@ -570,6 +582,18 @@ Since <b>SmartDeviceLink 1.0</b></p>
+ <h3 id="section-SDLArtwork">
+ SDLArtwork
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLArtwork.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLAudioPassThruCapabilities">
SDLAudioPassThruCapabilities
</h3>
@@ -1007,6 +1031,18 @@ Since <b>SmartDeviceLink 2.0</b></p>
+ <h3 id="section-SDLConfiguration">
+ SDLConfiguration
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLConfiguration.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLConsoleController">
SDLConsoleController
</h3>
@@ -1749,6 +1785,37 @@ see SDLPerformAudioPassThru</p></p>
+ <h3 id="section-SDLFile">
+ SDLFile
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLFile.html" class="slightly-smaller">See more</a>
+
+
+
+
+
+ <h3 id="section-SDLFileManager">
+ SDLFileManager
+ </h3>
+
+ <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>
+
+ <a href="Classes/SDLFileManager.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@interface</span> <span class="nc">SDLFileManager</span> <span class="p">:</span> <span class="nc">NSObject</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kt">SDLFileManager</span> <span class="p">:</span> <span class="kt">NSObject</span></code></pre>
+
+
+
+
<h3 id="section-SDLFileType">
SDLFileType
</h3>
@@ -2341,6 +2408,25 @@ Function Group: ProprietaryData
+ <h3 id="section-SDLLifecycleConfiguration">
+ SDLLifecycleConfiguration
+ </h3>
+
+ <p>Configuration options for SDLManager</p>
+
+ <a href="Classes/SDLLifecycleConfiguration.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@interface</span> <span class="nc">SDLLifecycleConfiguration</span> <span class="p">:</span> <span class="nc">NSObject</span> <span class="o">&lt;</span><span class="n">NSCopying</span><span class="o">&gt;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kt">SDLLifecycleConfiguration</span> <span class="p">:</span> <span class="kt">NSObject</span><span class="p">,</span> <span class="kt">NSCopying</span></code></pre>
+
+
+
+
<h3 id="section-SDLListFiles">
SDLListFiles
</h3>
@@ -2385,6 +2471,18 @@ Function Group: ProprietaryData
+ <h3 id="section-SDLLockScreenConfiguration">
+ SDLLockScreenConfiguration
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLLockScreenConfiguration.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLLockScreenStatus">
SDLLockScreenStatus
</h3>
@@ -2397,6 +2495,18 @@ Function Group: ProprietaryData
+ <h3 id="section-SDLLockScreenViewController">
+ SDLLockScreenViewController
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLLockScreenViewController.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLMaintenanceModeStatus">
SDLMaintenanceModeStatus
</h3>
@@ -2416,6 +2526,18 @@ Function Group: ProprietaryData
+ <h3 id="section-SDLManager">
+ SDLManager
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLManager.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLMediaClockFormat">
SDLMediaClockFormat
</h3>
@@ -2475,6 +2597,18 @@ Function Group: ProprietaryData
+ <h3 id="section-SDLNotificationConstants">
+ SDLNotificationConstants
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLNotificationConstants.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLOnAppInterfaceUnregistered">
SDLOnAppInterfaceUnregistered
</h3>
@@ -3075,6 +3209,18 @@ The call back also includes details regarding the current HMI_Status level, driv
+ <h3 id="section-SDLPermissionManager">
+ SDLPermissionManager
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLPermissionManager.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLPermissionStatus">
SDLPermissionStatus
</h3>
@@ -3315,6 +3461,18 @@ The call back also includes details regarding the current HMI_Status level, driv
+ <h3 id="section-SDLRPCNotificationNotification">
+ SDLRPCNotificationNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLRPCNotificationNotification.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLRPCRequest">
SDLRPCRequest
</h3>
@@ -3351,6 +3509,18 @@ The call back also includes details regarding the current HMI_Status level, driv
+ <h3 id="section-SDLRPCResponseNotification">
+ SDLRPCResponseNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Classes/SDLRPCResponseNotification.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLRPCStruct">
SDLRPCStruct
</h3>
@@ -4296,11 +4466,11 @@ Function Group: ScrollableMessage
<h4>Objective-C</h4>
- <pre class="highlight"><code><span class="k">@interface</span> <span class="nc">SDLSubscribeButton</span> <span class="p">:</span> <span class="nc">SDLRPCRequest</span></code></pre>
+ <pre class="highlight"><code><span class="k">@interface</span> <span class="nc">SDLSubscribeButton</span> <span class="p">:</span> <span class="nc">SDLRPCRequest</span> <span class="o">&lt;</span><span class="n"><a href="Protocols/SDLRequestHandler.html">SDLRequestHandler</a></span><span class="o">&gt;</span></code></pre>
<h4>Swift</h4>
- <pre class="highlight"><code><span class="kd">class</span> <span class="kt">SDLSubscribeButton</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCRequest.html">SDLRPCRequest</a></span></code></pre>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kt">SDLSubscribeButton</span> <span class="p">:</span> <span class="kt"><a href="Classes/SDLRPCRequest.html">SDLRPCRequest</a></span><span class="p">,</span> <span class="kt"><a href="Protocols/SDLRequestHandler.html">SDLRequestHandler</a></span></code></pre>
diff --git a/docs/Classes/SDLAddCommand.html b/docs/Classes/SDLAddCommand.html
index 0e87bd6d5..ffe656370 100644
--- a/docs/Classes/SDLAddCommand.html
+++ b/docs/Classes/SDLAddCommand.html
@@ -4,7 +4,9 @@
<ul>
<li><a href="#section--init">-init</a></li>
+ <li><a href="#section--initWithHandler:">-initWithHandler:</a></li>
<li><a href="#section--initWithDictionary:">-initWithDictionary:</a></li>
+ <li><a href="#section-handler">handler</a></li>
<li><a href="#section-cmdID">cmdID</a></li>
<li><a href="#section-menuParams">menuParams</a></li>
<li><a href="#section-vrCommands">vrCommands</a></li>
@@ -60,6 +62,35 @@
+ <h3 id="section--initWithHandler:">
+ -initWithHandler:
+ </h3>
+
+ <p>Construct a SDLAddCommand with a handler callback when an event occurs.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithHandler</span><span class="p">:(</span><span class="n"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span><span class="p">)</span><span class="nv">handler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="nf">init</span><span class="o">!</span><span class="p">(</span><span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span><span class="o">!</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>handler</dt>
+ <dd><p>A callback that will be called when a button event occurs for the command</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An SDLAddCommand object</p>
+
+ </div>
+
<h3 id="section--initWithDictionary:">
-initWithDictionary:
</h3>
@@ -84,6 +115,30 @@
</dd>
</dl>
+ <h3 id="section-handler">
+ handler
+ </h3>
+
+ <p>A handler that will let you know when the button you created is subscribed.</p>
+
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ This will only work if you use SDLManager.
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span> <span class="n">handler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span><span class="o">!</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section-cmdID">
cmdID
</h3>
diff --git a/docs/Classes/SDLArtwork.html b/docs/Classes/SDLArtwork.html
new file mode 100644
index 000000000..c461ff991
--- /dev/null
+++ b/docs/Classes/SDLArtwork.html
@@ -0,0 +1,153 @@
+<h1>SDLArtwork Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-+artworkWithImage:name:asImageFormat:">+artworkWithImage:name:asImageFormat:</a></li>
+ <li><a href="#section-+persistentArtworkWithImage:name:asImageFormat:">+persistentArtworkWithImage:name:asImageFormat:</a></li>
+ <li><a href="#section--initWithImage:name:persistent:asImageFormat:">-initWithImage:name:persistent:asImageFormat:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-+artworkWithImage:name:asImageFormat:">
+ +artworkWithImage:name:asImageFormat:
+ </h3>
+
+ <p>Convenience Helper to create an ephemeral artwork from an image.</p>
+
+<p>This is an ephemeral file, it will not be persisted through sessions / ignition cycles. Any files that you do not <em>know</em> you will use in future sessions should be created through this method. For example, album / artist artwork should be ephemeral.</p>
+
+<p>Persistent files should be created using <code>persistentArtworkWithImage:name:asImageFormat:</code></p>
+
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ <p>It is strongly recommended to pass the file url using an SDLFile initializer instead of the image. If you pass the UIImage, it is loaded into memory, and will be dumped to a temporary file. This will create a duplicate file. <em>Only pass a UIImage if the image is not stored on disk</em>.</p>
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">artworkWithImage</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">UIImage</span> <span class="o">*</span><span class="p">)</span><span class="nv">image</span>
+ <span class="nf">name</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span>
+ <span class="nf">asImageFormat</span><span class="p">:(</span><span class="n"><a href="../Enums/SDLArtworkImageFormat.html">SDLArtworkImageFormat</a></span><span class="p">)</span><span class="nv">imageFormat</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="n">convenience</span> <span class="nf">init</span><span class="p">(</span><span class="nv">image</span><span class="p">:</span> <span class="kt">Any</span><span class="o">!</span><span class="p">,</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="k">as</span> <span class="nv">imageFormat</span><span class="p">:</span> <span class="kt"><a href="../Enums/SDLArtworkImageFormat.html">SDLArtworkImageFormat</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>image</dt>
+ <dd><p>The UIImage to be sent to the remote head unit</p>
+</dd>
+ <dt>name</dt>
+ <dd><p>The name of the file that will be used to reference the file in the future (for example on the remote file system).</p>
+</dd>
+ <dt>imageFormat</dt>
+ <dd><p>Whether the image should be converted to a PNG or JPG before transmission. Images with transparency or few colors should be PNGs. Images with many colors should be JPGs.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of this class to be passed to the file manager.</p>
+
+ </div>
+
+ <h3 id="section-+persistentArtworkWithImage:name:asImageFormat:">
+ +persistentArtworkWithImage:name:asImageFormat:
+ </h3>
+
+ <p>Convenience Helper to create a persistent artwork from an image.</p>
+
+<p>This is a persistent file, it will be persisted through sessions / ignition cycles. You will only have a limited space for all files, so be sure to only persist files that are required for all or most sessions. For example, menu artwork should be persistent.</p>
+
+<p>Ephemeral files should be created using <code>ephemeralArtworkWithImage:name:asImageFormat:</code></p>
+
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ <p>It is strongly recommended to pass the file url using an SDLFile initializer instead of the image. If you pass the UIImage, it is loaded into memory, and will be dumped to a temporary file. This will create a duplicate file. <em>Only pass a UIImage if the image is not stored on disk</em>.</p>
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">persistentArtworkWithImage</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">UIImage</span> <span class="o">*</span><span class="p">)</span><span class="nv">image</span>
+ <span class="nf">name</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span>
+ <span class="nf">asImageFormat</span><span class="p">:</span>
+ <span class="p">(</span><span class="n"><a href="../Enums/SDLArtworkImageFormat.html">SDLArtworkImageFormat</a></span><span class="p">)</span><span class="nv">imageFormat</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">persistentArtwork</span><span class="p">(</span><span class="n">withImage</span> <span class="nv">image</span><span class="p">:</span> <span class="kt">Any</span><span class="o">!</span><span class="p">,</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="k">as</span> <span class="nv">imageFormat</span><span class="p">:</span> <span class="kt"><a href="../Enums/SDLArtworkImageFormat.html">SDLArtworkImageFormat</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>image</dt>
+ <dd><p>The UIImage to be sent to the remote head unit</p>
+</dd>
+ <dt>name</dt>
+ <dd><p>The name of the file that will be used to reference the file in the future (for example on the remote file system).</p>
+</dd>
+ <dt>imageFormat</dt>
+ <dd><p>Whether the image should be converted to a PNG or JPG before transmission. Images with transparency or few colors should be PNGs. Images with many colors should be JPGs.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of this class to be passed to the file manager.</p>
+
+ </div>
+
+ <h3 id="section--initWithImage:name:persistent:asImageFormat:">
+ -initWithImage:name:persistent:asImageFormat:
+ </h3>
+
+ <p>Create a file for transmission to the remote system from a UIImage.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithImage</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">UIImage</span> <span class="o">*</span><span class="p">)</span><span class="nv">image</span>
+ <span class="nf">name</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span>
+ <span class="nf">persistent</span><span class="p">:(</span><span class="n">BOOL</span><span class="p">)</span><span class="nv">persistent</span>
+ <span class="nf">asImageFormat</span><span class="p">:(</span><span class="n"><a href="../Enums/SDLArtworkImageFormat.html">SDLArtworkImageFormat</a></span><span class="p">)</span><span class="nv">imageFormat</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="nf">init</span><span class="p">(</span><span class="nv">image</span><span class="p">:</span> <span class="kt">Any</span><span class="o">!</span><span class="p">,</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">persistent</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">,</span> <span class="k">as</span> <span class="nv">imageFormat</span><span class="p">:</span> <span class="kt"><a href="../Enums/SDLArtworkImageFormat.html">SDLArtworkImageFormat</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>image</dt>
+ <dd><p>The UIImage to be sent to the remote head unit</p>
+</dd>
+ <dt>name</dt>
+ <dd><p>The name of the file that will be used to reference the file in the future (for example on the remote file system).</p>
+</dd>
+ <dt>persistent</dt>
+ <dd><p>Whether or not the artwork should be persistent.</p>
+</dd>
+ <dt>imageFormat</dt>
+ <dd><p>Whether the image should be converted to a PNG or JPG before transmission. Images with transparency or few colors should be PNGs. Images with many colors should be JPGs.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of this class to be passed to the file manager.</p>
+
+ </div>
+
+</section>
diff --git a/docs/Classes/SDLConfiguration.html b/docs/Classes/SDLConfiguration.html
new file mode 100644
index 000000000..c27a5f2eb
--- /dev/null
+++ b/docs/Classes/SDLConfiguration.html
@@ -0,0 +1,122 @@
+<h1>SDLConfiguration Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-lifecycleConfig">lifecycleConfig</a></li>
+ <li><a href="#section-lockScreenConfig">lockScreenConfig</a></li>
+ <li><a href="#section--initWithLifecycle:lockScreen:">-initWithLifecycle:lockScreen:</a></li>
+ <li><a href="#section-+configurationWithLifecycle:lockScreen:">+configurationWithLifecycle:lockScreen:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-lifecycleConfig">
+ lifecycleConfig
+ </h3>
+
+ <p>The lifecycle configuration.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">lifecycleConfig</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">@NSCopying</span> <span class="k">var</span> <span class="nv">lifecycleConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-lockScreenConfig">
+ lockScreenConfig
+ </h3>
+
+ <p>The lock screen configuration.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">lockScreenConfig</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">@NSCopying</span> <span class="k">var</span> <span class="nv">lockScreenConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section--initWithLifecycle:lockScreen:">
+ -initWithLifecycle:lockScreen:
+ </h3>
+
+ <p>Create a new configuration to be passed into SDLManager.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+<span class="nf">initWithLifecycle</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
+ <span class="nf">lockScreen</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="nf">init</span><span class="p">(</span><span class="n">lifecycle</span> <span class="nv">lifecycleConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span><span class="p">,</span> <span class="n">lockScreen</span> <span class="nv">lockScreenConfig</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>lifecycleConfig</dt>
+ <dd><p>The lifecycle configuration to be used.</p>
+</dd>
+ <dt>lockScreenConfig</dt>
+ <dd><p>The lockscreen configuration to be used. If nil, this will be <code>enabledConfiguration</code>.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>The configuration</p>
+
+ </div>
+
+ <h3 id="section-+configurationWithLifecycle:lockScreen:">
+ +configurationWithLifecycle:lockScreen:
+ </h3>
+
+ <p>Create a new configuration to be passed into SDLManager.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+<span class="nf">configurationWithLifecycle</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLifecycleConfiguration.html">SDLLifecycleConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lifecycleConfig</span>
+ <span class="nf">lockScreen</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html">SDLLockScreenConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenConfig</span><span class="p">;</span></code></pre>
+
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>lifecycleConfig</dt>
+ <dd><p>The lifecycle configuration to be used.</p>
+</dd>
+ <dt>lockScreenConfig</dt>
+ <dd><p>The lockscreen configuration to be used. If nil, this will be <code>enabledConfiguration</code>.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>The configuration</p>
+
+ </div>
+
+</section>
diff --git a/docs/Classes/SDLDebugTool.html b/docs/Classes/SDLDebugTool.html
index 03ae3da84..3bbcb8fca 100644
--- a/docs/Classes/SDLDebugTool.html
+++ b/docs/Classes/SDLDebugTool.html
@@ -3,11 +3,14 @@
<h3>Section Contents</h3>
<ul>
+ <li><a href="#section-+enable">+enable</a></li>
+ <li><a href="#section-+disable">+disable</a></li>
<li><a href="#section-+addConsole:">+addConsole:</a></li>
<li><a href="#section-+addConsole:toGroup:">+addConsole:toGroup:</a></li>
<li><a href="#section-+removeConsole:">+removeConsole:</a></li>
<li><a href="#section-+removeConsole:fromGroup:">+removeConsole:fromGroup:</a></li>
<li><a href="#section-+logInfo:">+logInfo:</a></li>
+ <li><a href="#section-+logFormat:">+logFormat:</a></li>
<li><a href="#section-+logInfo:withType:">+logInfo:withType:</a></li>
<li><a href="#section-+logInfo:withType:toOutput:">+logInfo:withType:toOutput:</a></li>
<li><a href="#section-+logInfo:andBinaryData:withType:toOutput:">+logInfo:andBinaryData:withType:toOutput:</a></li>
@@ -24,6 +27,28 @@
<section class="section task-group-section">
+ <h3 id="section-+enable">
+ +enable
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-+disable">
+ +disable
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
<h3 id="section-+addConsole:">
+addConsole:
</h3>
@@ -79,6 +104,17 @@
+ <h3 id="section-+logFormat:">
+ +logFormat:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
<h3 id="section-+logInfo:withType:">
+logInfo:withType:
</h3>
diff --git a/docs/Classes/SDLFile.html b/docs/Classes/SDLFile.html
new file mode 100644
index 000000000..af15542f5
--- /dev/null
+++ b/docs/Classes/SDLFile.html
@@ -0,0 +1,388 @@
+<h1>SDLFile Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-persistent">persistent</a></li>
+ <li><a href="#section-overwrite">overwrite</a></li>
+ <li><a href="#section-name">name</a></li>
+ <li><a href="#section-fileURL">fileURL</a></li>
+ <li><a href="#section-data">data</a></li>
+ <li><a href="#section-fileType">fileType</a></li>
+ <li><a href="#section--init">-init</a></li>
+ <li><a href="#section--initWithFileURL:name:persistent:">-initWithFileURL:name:persistent:</a></li>
+ <li><a href="#section-+persistentFileAtFileURL:name:">+persistentFileAtFileURL:name:</a></li>
+ <li><a href="#section-+fileAtFileURL:name:">+fileAtFileURL:name:</a></li>
+ <li><a href="#section--initWithData:name:fileExtension:persistent:">-initWithData:name:fileExtension:persistent:</a></li>
+ <li><a href="#section-+persistentFileWithData:name:fileExtension:">+persistentFileWithData:name:fileExtension:</a></li>
+ <li><a href="#section-+fileWithData:name:fileExtension:">+fileWithData:name:fileExtension:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-persistent">
+ persistent
+ </h3>
+
+ <p>Whether or not the file should persist on disk between car ignition cycles.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</span><span class="p">,</span> <span class="n">getter</span><span class="o">=</span><span class="n">isPersistent</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">persistent</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">isPersistent</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-overwrite">
+ overwrite
+ </h3>
+
+ <p>Whether or not the file should overwrite an existing file on the remote disk with the same name.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span> <span class="n">readwrite</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">BOOL</span> <span class="n">overwrite</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">overwrite</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-name">
+ name
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">NSString</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">name</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-fileURL">
+ fileURL
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">nullable</span><span class="p">)</span> <span class="n">NSURL</span> <span class="o">*</span><span class="n">fileURL</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">fileURL</span><span class="p">:</span> <span class="kt">URL</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-data">
+ data
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">NSData</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">data</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">data</span><span class="p">:</span> <span class="kt">Data</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-fileType">
+ fileType
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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/SDLFileType.html">SDLFileType</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">fileType</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">fileType</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFileType.html">SDLFileType</a></span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section--init">
+ -init
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section--initWithFileURL:name:persistent:">
+ -initWithFileURL:name:persistent:
+ </h3>
+
+ <p>The designated initializer for an SDL File. The only major property that is not set using this is <q>overwrite</q>, which defaults to NO.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithFileURL</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSURL</span> <span class="o">*</span><span class="p">)</span><span class="nv">url</span>
+ <span class="nf">name</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span>
+ <span class="nf">persistent</span><span class="p">:(</span><span class="n">BOOL</span><span class="p">)</span><span class="nv">persistent</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="nf">init</span><span class="p">(</span><span class="n"><a href="../Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileURL">fileURL</a></span> <span class="nv">url</span><span class="p">:</span> <span class="kt">URL</span><span class="p">,</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">persistent</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>url</dt>
+ <dd><p>The file URL pointing to the local data that will be pushed to the remote system.</p>
+</dd>
+ <dt>name</dt>
+ <dd><p>The name that the file will be stored under on the remote system and how it will be referenced from the local system.</p>
+</dd>
+ <dt>persistent</dt>
+ <dd><p>Whether or not the file will persist between ignition cycles.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An SDLFile object.</p>
+
+ </div>
+
+ <h3 id="section-+persistentFileAtFileURL:name:">
+ +persistentFileAtFileURL:name:
+ </h3>
+
+ <p>Create an SDL file using a local file URL.</p>
+
+<p>This is a persistent file, it will be persisted through sessions / ignition cycles. You will only have a limited space for all files, so be sure to only persist files that are required for all or most sessions. For example, menu artwork should be persistent.</p>
+
+<p>Ephemeral files should be created using ephemeralFileAtURL:name:</p>
+
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ <p>If this is not a readable file, this will return nil</p>
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">persistentFileAtFileURL</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSURL</span> <span class="o">*</span><span class="p">)</span><span class="nv">url</span>
+ <span class="nf">name</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">persistentFile</span><span class="p">(</span><span class="n">atFileURL</span> <span class="nv">url</span><span class="p">:</span> <span class="kt">URL</span><span class="p">,</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>url</dt>
+ <dd><p>The url to the file that should be uploaded.</p>
+</dd>
+ <dt>name</dt>
+ <dd><p>The name of the file that will be used to reference the file in the future (for example on the remote file system).</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of this class, or nil if a readable file at the path could not be found.</p>
+
+ </div>
+
+ <h3 id="section-+fileAtFileURL:name:">
+ +fileAtFileURL:name:
+ </h3>
+
+ <p>Create an SDL file using a local file URL.</p>
+
+<p>This is an ephemeral file, it will not be persisted through sessions / ignition cycles. Any files that you do not <em>know</em> you will use in future sessions should be created through this method. For example, album / artist artwork should be ephemeral.</p>
+
+<p>Persistent files should be created using persistentFileAtURL:name:</p>
+
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ <p>If this is not a readable file, this will return nil</p>
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">fileAtFileURL</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSURL</span> <span class="o">*</span><span class="p">)</span><span class="nv">url</span>
+ <span class="nf">name</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="n">convenience</span> <span class="nf">init</span><span class="p">(</span><span class="n">atFileURL</span> <span class="nv">url</span><span class="p">:</span> <span class="kt">URL</span><span class="p">,</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>url</dt>
+ <dd><p>The url to the file on disk that will be uploaded</p>
+</dd>
+ <dt>name</dt>
+ <dd><p>The name of the file that will be used to reference the file in the future (for example on the remote file system).</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of this class, or nil if a readable file at the url could not be found.</p>
+
+ </div>
+
+ <h3 id="section--initWithData:name:fileExtension:persistent:">
+ -initWithData:name:fileExtension:persistent:
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithData</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSData</span> <span class="o">*</span><span class="p">)</span><span class="nv">data</span>
+ <span class="nf">name</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span>
+ <span class="nf">fileExtension</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">extension</span>
+ <span class="nf">persistent</span><span class="p">:(</span><span class="n">BOOL</span><span class="p">)</span><span class="nv">persistent</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="nf">init</span><span class="p">(</span><span class="nv">data</span><span class="p">:</span> <span class="kt">Data</span><span class="p">,</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="n">fileExtension</span> <span class="nv">extension</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">persistent</span><span class="p">:</span> <span class="kt">Bool</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>data</dt>
+ <dd><p>The raw data to be used for the file</p>
+</dd>
+ <dt>name</dt>
+ <dd><p>The name of the file that will be used to reference the file in the future (for example on the remote file system).</p>
+</dd>
+ <dt>extension</dt>
+ <dd><p>The file extension. For example <q>png</q>. Currently supported file extensions are: <q>bmp</q>, <q>jpg</q>, <q>jpeg</q>, <q>png</q>, <q>wav</q>, <q>mp3</q>, <q>aac</q>, <q>json</q>. All others will be sent as binary files.</p>
+</dd>
+ <dt>persistent</dt>
+ <dd><p>Whether or not the remote file with this data should be persistent</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of this class</p>
+
+ </div>
+
+ <h3 id="section-+persistentFileWithData:name:fileExtension:">
+ +persistentFileWithData:name:fileExtension:
+ </h3>
+
+ <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>
+
+<p>This is a persistent file, it will be persisted through sessions / ignition cycles. You will only have a limited space for all files, so be sure to only persist files that are required for all or most sessions. For example, menu artwork should be persistent.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">persistentFileWithData</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSData</span> <span class="o">*</span><span class="p">)</span><span class="nv">data</span>
+ <span class="nf">name</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span>
+ <span class="nf">fileExtension</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">extension</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">persistentFile</span><span class="p">(</span><span class="n">with</span> <span class="nv">data</span><span class="p">:</span> <span class="kt">Data</span><span class="p">,</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="n">fileExtension</span> <span class="nv">extension</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>data</dt>
+ <dd><p>The raw data to be used for the file</p>
+</dd>
+ <dt>name</dt>
+ <dd><p>The name of the file that will be used to reference the file in the future (for example on the remote file system).</p>
+</dd>
+ <dt>extension</dt>
+ <dd><p>The file extension. For example <q>png</q>. Currently supported file extensions are: <q>bmp</q>, <q>jpg</q>, <q>jpeg</q>, <q>png</q>, <q>wav</q>, <q>mp3</q>, <q>aac</q>, <q>json</q>. All others will be sent as binary files.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of this class</p>
+
+ </div>
+
+ <h3 id="section-+fileWithData:name:fileExtension:">
+ +fileWithData:name:fileExtension:
+ </h3>
+
+ <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>
+
+<p>This is an ephemeral file, it will not be persisted through sessions / ignition cycles. Any files that you do not <em>know</em> you will use in future sessions should be created through this method. For example, album / artist artwork should be ephemeral.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">fileWithData</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSData</span> <span class="o">*</span><span class="p">)</span><span class="nv">data</span>
+ <span class="nf">name</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span>
+ <span class="nf">fileExtension</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">extension</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="n">convenience</span> <span class="nf">init</span><span class="p">(</span><span class="nv">data</span><span class="p">:</span> <span class="kt">Data</span><span class="p">,</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="n">fileExtension</span> <span class="nv">extension</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>data</dt>
+ <dd><p>The raw data to be used for the file</p>
+</dd>
+ <dt>name</dt>
+ <dd><p>The name of the file that will be used to reference the file in the future (for example on the remote file system).</p>
+</dd>
+ <dt>extension</dt>
+ <dd><p>The file extension. For example <q>png</q>. Currently supported file extensions are: <q>bmp</q>, <q>jpg</q>, <q>jpeg</q>, <q>png</q>, <q>wav</q>, <q>mp3</q>, <q>aac</q>, <q>json</q>. All others will be sent as binary files.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of this class</p>
+
+ </div>
+
+</section>
diff --git a/docs/Classes/SDLFileManager.html b/docs/Classes/SDLFileManager.html
new file mode 100644
index 000000000..6d611a647
--- /dev/null
+++ b/docs/Classes/SDLFileManager.html
@@ -0,0 +1,291 @@
+<h1>SDLFileManager Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-remoteFileNames">remoteFileNames</a></li>
+ <li><a href="#section-bytesAvailable">bytesAvailable</a></li>
+ <li><a href="#section-currentState">currentState</a></li>
+ <li><a href="#section-pendingTransactions">pendingTransactions</a></li>
+ <li><a href="#section-suspended">suspended</a></li>
+ <li><a href="#section--init">-init</a></li>
+ <li><a href="#section--initWithConnectionManager:">-initWithConnectionManager:</a></li>
+ <li><a href="#section--startWithCompletionHandler:">-startWithCompletionHandler:</a></li>
+ <li><a href="#section--stop">-stop</a></li>
+ <li><a href="#section--deleteRemoteFileWithName:completionHandler:">-deleteRemoteFileWithName:completionHandler:</a></li>
+ <li><a href="#section--uploadFile:completionHandler:">-uploadFile:completionHandler:</a></li>
+ <li><a href="#section-+temporaryFileDirectory">+temporaryFileDirectory</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<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>
+
+
+<section class="section task-group-section">
+ <h3 id="section-remoteFileNames">
+ remoteFileNames
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">NSSet</span><span class="o">&lt;</span><span class="n"><a href="../Type Definitions.html#/c:SDLFileManager.h@T@SDLFileName">SDLFileName</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">remoteFileNames</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">remoteFileNames</span><span class="p">:</span> <span class="kt">Set</span></code></pre>
+
+
+
+
+ <h3 id="section-bytesAvailable">
+ bytesAvailable
+ </h3>
+
+ <p>The number of bytes still available for files for this app.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">NSUInteger</span> <span class="n">bytesAvailable</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">bytesAvailable</span><span class="p">:</span> <span class="kt">UInt</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-currentState">
+ currentState
+ </h3>
+
+ <p>The state of the file manager.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">NSString</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">currentState</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">currentState</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-pendingTransactions">
+ pendingTransactions
+ </h3>
+
+ <p>The currently pending transactions (Upload, Delete, and List Files) in the file manager</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">__kindof</span> <span class="n">NSOperation</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">pendingTransactions</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">pendingTransactions</span><span class="p">:</span> <span class="p">[</span><span class="kt">Operation</span><span class="p">]</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-suspended">
+ suspended
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span> <span class="n">readwrite</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">BOOL</span> <span class="n">suspended</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">suspended</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section--init">
+ -init
+ </h3>
+
+ <p>Initialize the class&hellip;or not, since this method is unavailable. Dependencies must be injected using initWithConnectionManager:</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><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>
+
+
+
+
+ <div>
+ <h4>Return Value</h4>
+ <p>nil</p>
+
+ </div>
+
+ <h3 id="section--initWithConnectionManager:">
+ -initWithConnectionManager:
+ </h3>
+
+ <p>Creates a new file manager with a specified connection manager</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithConnectionManager</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n">id</span><span class="o">&lt;</span><span class="n">SDLConnectionManagerType</span><span class="o">&gt;</span><span class="p">)</span><span class="nv">manager</span><span class="p">;</span></code></pre>
+
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>manager</dt>
+ <dd><p>A connection manager to use to forward on RPCs</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of SDLFileManager</p>
+
+ </div>
+
+ <h3 id="section--startWithCompletionHandler:">
+ -startWithCompletionHandler:
+ </h3>
+
+ <p>The manager stars up and attempts to fetch its initial list and transfer initial files.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">startWithCompletionHandler</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type Definitions.html#/c:SDLFileManager.h@T@SDLFileManagerStartupCompletionHandler">SDLFileManagerStartupCompletionHandler</a></span><span class="p">)</span><span class="nv">completionHandler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><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 Definitions.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>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>completionHandler</dt>
+ <dd><p>The handler called when the manager is set up or failed to set up with an error. Use weak self when accessing self from the completion handler.</p>
+</dd>
+ </dl>
+
+ <h3 id="section--stop">
+ -stop
+ </h3>
+
+ <p>Cancels all file manager operations and deletes all associated data.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">stop</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">stop</span><span class="p">()</span></code></pre>
+
+
+
+
+ <h3 id="section--deleteRemoteFileWithName:completionHandler:">
+ -deleteRemoteFileWithName:completionHandler:
+ </h3>
+
+ <p>Delete a file stored on the remote system</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">deleteRemoteFileWithName</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type Definitions.html#/c:SDLFileManager.h@T@SDLFileName">SDLFileName</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">name</span>
+ <span class="nf">completionHandler</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerDeleteCompletionHandler">SDLFileManagerDeleteCompletionHandler</a></span><span class="p">)</span><span class="nv">completion</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">deleteRemoteFile</span><span class="p">(</span><span class="n">withName</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 Definitions.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>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>name</dt>
+ <dd><p>The name of the remote file. It should be a name currently stored in remoteFileNames</p>
+</dd>
+ <dt>completion</dt>
+ <dd><p>An optional completion handler that sends an error should one occur.</p>
+</dd>
+ </dl>
+
+ <h3 id="section--uploadFile:completionHandler:">
+ -uploadFile:completionHandler:
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">uploadFile</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLFile.html">SDLFile</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">file</span>
+ <span class="nf">completionHandler</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nullable</span> <span class="n"><a href="../Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadCompletionHandler">SDLFileManagerUploadCompletionHandler</a></span><span class="p">)</span><span class="nv">completion</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">uploadFile</span><span class="p">(</span><span class="n">_</span> <span class="nv">file</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">,</span> <span class="n">completionHandler</span> <span class="nv">completion</span><span class="p">:</span> <span class="kt"><a href="../Type Definitions.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>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>file</dt>
+ <dd><p>An SDLFile that contains metadata about the file to be sent</p>
+</dd>
+ <dt>completion</dt>
+ <dd><p>An optional completion handler that sends an error should one occur.</p>
+</dd>
+ </dl>
+
+ <h3 id="section-+temporaryFileDirectory">
+ +temporaryFileDirectory
+ </h3>
+
+ <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>
+
+<p>The SDL library manages the creation and deletion of these files and you should not have to touch this directory at all.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">NSURL</span> <span class="o">*</span><span class="p">)</span><span class="n">temporaryFileDirectory</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">temporaryFileDirectory</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">URL</span></code></pre>
+
+
+
+ <div>
+ <h4>Return Value</h4>
+ <p>An NSURL pointing to the location on disk where SDL&rsquo;s temporary files are stored.</p>
+
+ </div>
+
+</section>
diff --git a/docs/Classes/SDLLifecycleConfiguration.html b/docs/Classes/SDLLifecycleConfiguration.html
new file mode 100644
index 000000000..7024465ec
--- /dev/null
+++ b/docs/Classes/SDLLifecycleConfiguration.html
@@ -0,0 +1,413 @@
+<h1>SDLLifecycleConfiguration Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--init">-init</a></li>
+ <li><a href="#section-+defaultConfigurationWithAppName:appId:">+defaultConfigurationWithAppName:appId:</a></li>
+ <li><a href="#section-+debugConfigurationWithAppName:appId:ipAddress:port:">+debugConfigurationWithAppName:appId:ipAddress:port:</a></li>
+ <li><a href="#section-tcpDebugMode">tcpDebugMode</a></li>
+ <li><a href="#section-tcpDebugIPAddress">tcpDebugIPAddress</a></li>
+ <li><a href="#section-tcpDebugPort">tcpDebugPort</a></li>
+ <li><a href="#section-appName">appName</a></li>
+ <li><a href="#section-appId">appId</a></li>
+ <li><a href="#section-resumeHash">resumeHash</a></li>
+ <li><a href="#section-isMedia">isMedia</a></li>
+ <li><a href="#section-appType">appType</a></li>
+ <li><a href="#section-language">language</a></li>
+ <li><a href="#section-languagesSupported">languagesSupported</a></li>
+ <li><a href="#section-appIcon">appIcon</a></li>
+ <li><a href="#section-shortAppName">shortAppName</a></li>
+ <li><a href="#section-ttsName">ttsName</a></li>
+ <li><a href="#section-voiceRecognitionCommandNames">voiceRecognitionCommandNames</a></li>
+ <li><a href="#section-securityManagers">securityManagers</a></li>
+ <li><a href="#section-logFlags">logFlags</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Configuration options for SDLManager</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--init">
+ -init
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@interface</span> <span class="nc">SDLLifecycleConfiguration</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>
+
+
+
+
+
+ <h3 id="section-+defaultConfigurationWithAppName:appId:">
+ +defaultConfigurationWithAppName:appId:
+ </h3>
+
+ <p>A production configuration that runs using IAP. Additional functionality should be customized on the properties.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">SDLLifecycleConfiguration</span> <span class="o">*</span><span class="p">)</span>
+<span class="nf">defaultConfigurationWithAppName</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">appName</span>
+ <span class="nf">appId</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">appId</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">defaultConfiguration</span><span class="p">(</span><span class="n">withAppName</span> <span class="nv">appName</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">appId</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">SDLLifecycleConfiguration</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>appName</dt>
+ <dd><p>The name of the app.</p>
+</dd>
+ <dt>appId</dt>
+ <dd><p>The appId to be used. This should be registered with the radio&rsquo;s manufacturer.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>The lifecycle configuration</p>
+
+ </div>
+
+ <h3 id="section-+debugConfigurationWithAppName:appId:ipAddress:port:">
+ +debugConfigurationWithAppName:appId:ipAddress:port:
+ </h3>
+
+ <p>A debug configuration that runs using TCP. Additional functionality should be customized on the properties.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">SDLLifecycleConfiguration</span> <span class="o">*</span><span class="p">)</span>
+<span class="nf">debugConfigurationWithAppName</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">appName</span>
+ <span class="nf">appId</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">appId</span>
+ <span class="nf">ipAddress</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">ipAddress</span>
+ <span class="nf">port</span><span class="p">:(</span><span class="n">UInt16</span><span class="p">)</span><span class="nv">port</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">debugConfiguration</span><span class="p">(</span><span class="n">withAppName</span> <span class="nv">appName</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">appId</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">ipAddress</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="nv">port</span><span class="p">:</span> <span class="kt">UInt16</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">SDLLifecycleConfiguration</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>appName</dt>
+ <dd><p>The name of the app.</p>
+</dd>
+ <dt>appId</dt>
+ <dd><p>The appId to be used. This should be registered with the radio&rsquo;s manufacturer.</p>
+</dd>
+ <dt>ipAddress</dt>
+ <dd><p>The ip address of the server to connect to</p>
+</dd>
+ <dt>port</dt>
+ <dd><p>The port of the server to connect to</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>The lifecycle configuration</p>
+
+ </div>
+
+ <h3 id="section-tcpDebugMode">
+ tcpDebugMode
+ </h3>
+
+ <p>Whether or not debug mode is enabled</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">tcpDebugMode</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">tcpDebugMode</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-tcpDebugIPAddress">
+ tcpDebugIPAddress
+ </h3>
+
+ <p>The ip address at which the library will look for a server</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">null_resettable</span><span class="p">)</span>
+ <span class="n">NSString</span> <span class="o">*</span><span class="n">tcpDebugIPAddress</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">tcpDebugIPAddress</span><span class="p">:</span> <span class="kt">String</span><span class="o">!</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-tcpDebugPort">
+ tcpDebugPort
+ </h3>
+
+ <p>The port at which the library will look for a server</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">UInt16</span> <span class="n">tcpDebugPort</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">tcpDebugPort</span><span class="p">:</span> <span class="kt">UInt16</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-appName">
+ appName
+ </h3>
+
+ <p>The full name of the app</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">NSString</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">appName</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">appName</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-appId">
+ appId
+ </h3>
+
+ <p>The app id. This must be the same as the app id received from the SDL developer portal or OEM.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">NSString</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">appId</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">appId</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-resumeHash">
+ resumeHash
+ </h3>
+
+ <p>A hash id which should be passed to the remote system in the RegisterAppInterface</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">resumeHash</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">resumeHash</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-isMedia">
+ isMedia
+ </h3>
+
+ <p>This is an automatically set based on the app type</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">isMedia</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">isMedia</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-appType">
+ appType
+ </h3>
+
+ <p>The application type</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">null_resettable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLAppHMIType.html">SDLAppHMIType</a></span> <span class="o">*</span><span class="n">appType</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">appType</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLAppHMIType.html">SDLAppHMIType</a></span><span class="o">!</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-language">
+ language
+ </h3>
+
+ <p>The default language to use</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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/SDLLanguage.html">SDLLanguage</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">language</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">language</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLLanguage.html">SDLLanguage</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-languagesSupported">
+ languagesSupported
+ </h3>
+
+ <p>An array of all the supported languages</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLLanguage.html">SDLLanguage</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">languagesSupported</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">languagesSupported</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLLanguage.html">SDLLanguage</a></span><span class="p">]</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-appIcon">
+ appIcon
+ </h3>
+
+ <p>The application icon to be used on an app launching screen</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">nullable</span><span class="p">)</span> <span class="n"><a href="../Classes/SDLFile.html">SDLFile</a></span> <span class="o">*</span><span class="n">appIcon</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">appIcon</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFile.html">SDLFile</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-shortAppName">
+ shortAppName
+ </h3>
+
+ <p>An abbrevited application name that will be used on the app launching screen if the full one would be truncated</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">nullable</span><span class="p">)</span> <span class="n">NSString</span> <span class="o">*</span><span class="n">shortAppName</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">shortAppName</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-ttsName">
+ ttsName
+ </h3>
+
+ <p>A Text to Speech String for voice recognition of the mobile application name.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">nullable</span><span class="p">)</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Classes/SDLTTSChunk.html">SDLTTSChunk</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">ttsName</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">ttsName</span><span class="p">:</span> <span class="p">[</span><span class="kt"><a href="../Classes/SDLTTSChunk.html">SDLTTSChunk</a></span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-voiceRecognitionCommandNames">
+ voiceRecognitionCommandNames
+ </h3>
+
+ <p>Additional voice recognition commands. May not interfere with any other app name or global commands.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">nullable</span><span class="p">)</span>
+ <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">NSString</span> <span class="o">*&gt;</span> <span class="o">*</span><span class="n">voiceRecognitionCommandNames</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">voiceRecognitionCommandNames</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">]?</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-securityManagers">
+ securityManagers
+ </h3>
+
+ <p>Set security managers which could be used. This is primarily used with video streaming applications to authenticate and perhaps encrypt traffic data.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">nullable</span><span class="p">)</span>
+ <span class="n">NSArray</span><span class="o">&lt;</span><span class="n">Class</span><span class="o">&lt;</span><span class="n"><a href="../Protocols/SDLSecurityType.html">SDLSecurityType</a></span><span class="o">&gt;&gt;</span> <span class="o">*</span><span class="n">securityManagers</span><span class="p">;</span></code></pre>
+
+
+
+
+
+ <h3 id="section-logFlags">
+ logFlags
+ </h3>
+
+ <p>Which logging capabilities are currently enabled. The default is Console logging only.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span> <span class="n">readwrite</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n"><a href="../Enums/SDLLogOutput.html">SDLLogOutput</a></span> <span class="n">logFlags</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">logFlags</span><span class="p">:</span> <span class="kt"><a href="../Enums/SDLLogOutput.html">SDLLogOutput</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLLockScreenConfiguration.html b/docs/Classes/SDLLockScreenConfiguration.html
new file mode 100644
index 000000000..13c3bd48b
--- /dev/null
+++ b/docs/Classes/SDLLockScreenConfiguration.html
@@ -0,0 +1,230 @@
+<h1>SDLLockScreenConfiguration Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-showInOptionalState">showInOptionalState</a></li>
+ <li><a href="#section-enableAutomaticLockScreen">enableAutomaticLockScreen</a></li>
+ <li><a href="#section-backgroundColor">backgroundColor</a></li>
+ <li><a href="#section-appIcon">appIcon</a></li>
+ <li><a href="#section-customViewController">customViewController</a></li>
+ <li><a href="#section--init">-init</a></li>
+ <li><a href="#section-+disabledConfiguration">+disabledConfiguration</a></li>
+ <li><a href="#section-+enabledConfiguration">+enabledConfiguration</a></li>
+ <li><a href="#section-+enabledConfigurationWithAppIcon:backgroundColor:">+enabledConfigurationWithAppIcon:backgroundColor:</a></li>
+ <li><a href="#section-+enabledConfigurationWithViewController:">+enabledConfigurationWithViewController:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-showInOptionalState">
+ showInOptionalState
+ </h3>
+
+ <p>Whether or not the lock screen should be shown in the <q>lock screen optional</q> state. Defaults to &lsquo;NO&rsquo;.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">assign</span><span class="p">,</span> <span class="n">readwrite</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">)</span> <span class="n">BOOL</span> <span class="n">showInOptionalState</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">showInOptionalState</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-enableAutomaticLockScreen">
+ enableAutomaticLockScreen
+ </h3>
+
+ <p>If YES, the lock screen should be managed by SDL and automatically engage when necessary. If NO, then the lock screen will never be engaged.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">enableAutomaticLockScreen</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">enableAutomaticLockScreen</span><span class="p">:</span> <span class="kt">Bool</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-backgroundColor">
+ backgroundColor
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">UIColor</span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">backgroundColor</span><span class="p">;</span></code></pre>
+
+
+
+
+
+ <h3 id="section-appIcon">
+ appIcon
+ </h3>
+
+ <p>Your app icon as it will appear on the lock screen.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">nullable</span><span class="p">)</span> <span class="n">UIImage</span> <span class="o">*</span><span class="n">appIcon</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">@NSCopying</span> <span class="k">var</span> <span class="nv">appIcon</span><span class="p">:</span> <span class="kt">NSImage</span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-customViewController">
+ customViewController
+ </h3>
+
+ <p>A custom view controller that the lock screen will manage the presentation of.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">nullable</span><span class="p">)</span>
+ <span class="n">UIViewController</span> <span class="o">*</span><span class="n">customViewController</span><span class="p">;</span></code></pre>
+
+
+
+
+
+ <h3 id="section--init">
+ -init
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-+disabledConfiguration">
+ +disabledConfiguration
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><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">disabledConfiguration</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">disabled</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <div>
+ <h4>Return Value</h4>
+ <p>The configuration</p>
+
+ </div>
+
+ <h3 id="section-+enabledConfiguration">
+ +enabledConfiguration
+ </h3>
+
+ <p>Use this configuration for the basic default lock screen. A custom app icon will not be used.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><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">enabledConfiguration</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">enabled</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <div>
+ <h4>Return Value</h4>
+ <p>The configuration</p>
+
+ </div>
+
+ <h3 id="section-+enabledConfigurationWithAppIcon:backgroundColor:">
+ +enabledConfigurationWithAppIcon:backgroundColor:
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+<span class="nf">enabledConfigurationWithAppIcon</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">UIImage</span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenAppIcon</span>
+ <span class="nf">backgroundColor</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">UIColor</span> <span class="o">*</span><span class="p">)</span><span class="nv">lockScreenBackgroundColor</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">enabledConfiguration</span><span class="p">(</span><span class="n">withAppIcon</span> <span class="nv">lockScreenAppIcon</span><span class="p">:</span> <span class="kt">Any</span><span class="o">!</span><span class="p">,</span> <span class="n"><a href="../Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)backgroundColor">backgroundColor</a></span> <span class="nv">lockScreenBackgroundColor</span><span class="p">:</span> <span class="kt">Any</span><span class="o">!</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>lockScreenAppIcon</dt>
+ <dd><p>The app icon to be shown on the lock screen</p>
+</dd>
+ <dt>lockScreenBackgroundColor</dt>
+ <dd><p>The color of the lock screen background</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>The configuration</p>
+
+ </div>
+
+ <h3 id="section-+enabledConfigurationWithViewController:">
+ +enabledConfigurationWithViewController:
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">+</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">enabledConfigurationWithViewController</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n">UIViewController</span> <span class="o">*</span><span class="p">)</span><span class="nv">viewController</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">class</span> <span class="kd">func</span> <span class="nf">enabledConfiguration</span><span class="p">(</span><span class="n">withViewController</span> <span class="nv">viewController</span><span class="p">:</span> <span class="kt">Any</span><span class="o">!</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">Self</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>viewController</dt>
+ <dd><p>The view controller to be managed</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>The configuration</p>
+
+ </div>
+
+</section>
diff --git a/docs/Classes/SDLLockScreenViewController.html b/docs/Classes/SDLLockScreenViewController.html
new file mode 100644
index 000000000..fac5b3e94
--- /dev/null
+++ b/docs/Classes/SDLLockScreenViewController.html
@@ -0,0 +1,62 @@
+<h1>SDLLockScreenViewController Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-appIcon">appIcon</a></li>
+ <li><a href="#section-vehicleIcon">vehicleIcon</a></li>
+ <li><a href="#section-backgroundColor">backgroundColor</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-appIcon">
+ appIcon
+ </h3>
+
+ <p>The app&rsquo;s icon. This will be set by the lock screen configuration.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">nullable</span><span class="p">)</span> <span class="n">UIImage</span> <span class="o">*</span><span class="n">appIcon</span><span class="p">;</span></code></pre>
+
+
+
+
+
+ <h3 id="section-vehicleIcon">
+ vehicleIcon
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">nullable</span><span class="p">)</span> <span class="n">UIImage</span> <span class="o">*</span><span class="n">vehicleIcon</span><span class="p">;</span></code></pre>
+
+
+
+
+
+ <h3 id="section-backgroundColor">
+ backgroundColor
+ </h3>
+
+ <p>The designated background color set in the lock screen configuration, or the default SDL gray-blue.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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">nullable</span><span class="p">)</span> <span class="n">UIColor</span> <span class="o">*</span><span class="n">backgroundColor</span><span class="p">;</span></code></pre>
+
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLManager.html b/docs/Classes/SDLManager.html
new file mode 100644
index 000000000..c04bb70f3
--- /dev/null
+++ b/docs/Classes/SDLManager.html
@@ -0,0 +1,277 @@
+<h1>SDLManager Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-configuration">configuration</a></li>
+ <li><a href="#section-hmiLevel">hmiLevel</a></li>
+ <li><a href="#section-fileManager">fileManager</a></li>
+ <li><a href="#section-permissionManager">permissionManager</a></li>
+ <li><a href="#section-streamManager">streamManager</a></li>
+ <li><a href="#section-registerResponse">registerResponse</a></li>
+ <li><a href="#section-delegate">delegate</a></li>
+ <li><a href="#section--initWithConfiguration:delegate:">-initWithConfiguration:delegate:</a></li>
+ <li><a href="#section--startWithReadyHandler:">-startWithReadyHandler:</a></li>
+ <li><a href="#section--stop">-stop</a></li>
+ <li><a href="#section--sendRequest:">-sendRequest:</a></li>
+ <li><a href="#section--sendRequest:withResponseHandler:">-sendRequest:withResponseHandler:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-configuration">
+ configuration
+ </h3>
+
+ <p>The configuration the manager was set up with.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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/SDLConfiguration.html">SDLConfiguration</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">configuration</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">@NSCopying</span> <span class="k">var</span> <span class="nv">configuration</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLConfiguration.html">SDLConfiguration</a></span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-hmiLevel">
+ hmiLevel
+ </h3>
+
+ <p>The current HMI level of the running app.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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/SDLHMILevel.html">SDLHMILevel</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">hmiLevel</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">@NSCopying</span> <span class="k">var</span> <span class="nv">hmiLevel</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLHMILevel.html">SDLHMILevel</a></span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-fileManager">
+ fileManager
+ </h3>
+
+ <p>The file manager to be used by the running app.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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/SDLFileManager.html">SDLFileManager</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">fileManager</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">fileManager</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLFileManager.html">SDLFileManager</a></span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-permissionManager">
+ permissionManager
+ </h3>
+
+ <p>The permission manager monitoring RPC permissions.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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/SDLPermissionManager.html">SDLPermissionManager</a></span> <span class="o">*</span><span class="n">_Nonnull</span> <span class="n">permissionManager</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">permissionManager</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLPermissionManager.html">SDLPermissionManager</a></span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-streamManager">
+ streamManager
+ </h3>
+
+ <p>The streaming media manager to be used for starting video sessions.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">nullable</span><span class="p">)</span>
+ <span class="n"><a href="../Classes/SDLStreamingMediaManager.html">SDLStreamingMediaManager</a></span> <span class="o">*</span><span class="n">streamManager</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">streamManager</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLStreamingMediaManager.html">SDLStreamingMediaManager</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-registerResponse">
+ registerResponse
+ </h3>
+
+ <p>The response of a register call after it has been received.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readonly</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">nullable</span><span class="p">)</span>
+ <span class="n"><a href="../Classes/SDLRegisterAppInterfaceResponse.html">SDLRegisterAppInterfaceResponse</a></span> <span class="o">*</span><span class="n">registerResponse</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">registerResponse</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLRegisterAppInterfaceResponse.html">SDLRegisterAppInterfaceResponse</a></span><span class="p">?</span> <span class="p">{</span> <span class="k">get</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section-delegate">
+ delegate
+ </h3>
+
+ <p>The manager&rsquo;s delegate.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</span><span class="p">,</span> <span class="n">nonatomic</span><span class="p">,</span> <span class="n">nullable</span><span class="p">)</span> <span class="n">id</span><span class="o">&lt;</span><span class="n"><a href="../Protocols/SDLManagerDelegate.html">SDLManagerDelegate</a></span><span class="o">&gt;</span> <span class="n">delegate</span><span class="p">;</span></code></pre>
+
+
+
+
+
+ <h3 id="section--initWithConfiguration:delegate:">
+ -initWithConfiguration:delegate:
+ </h3>
+
+ <p>Initialize the manager with a configuration. Call <code>startWithHandler</code> to begin waiting for a connection.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span>
+<span class="nf">initWithConfiguration</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLConfiguration.html">SDLConfiguration</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">configuration</span>
+ <span class="nf">delegate</span><span class="p">:(</span><span class="n">nullable</span> <span class="n">id</span><span class="o">&lt;</span><span class="n"><a href="../Protocols/SDLManagerDelegate.html">SDLManagerDelegate</a></span><span class="o">&gt;</span><span class="p">)</span><span class="nv">delegate</span><span class="p">;</span></code></pre>
+
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>configuration</dt>
+ <dd><p>Your app&rsquo;s unique configuration for setup.</p>
+</dd>
+ <dt>delegate</dt>
+ <dd><p>An optional delegate to be notified of hmi level changes and startup and shutdown. It is recommended that you implement this.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of SDLManager</p>
+
+ </div>
+
+ <h3 id="section--startWithReadyHandler:">
+ -startWithReadyHandler:
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">startWithReadyHandler</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type Definitions.html#/c:SDLManager.h@T@SDLManagerReadyBlock">SDLManagerReadyBlock</a></span><span class="p">)</span><span class="nv">readyHandler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">start</span><span class="p">(</span><span class="nv">readyHandler</span><span class="p">:</span> <span class="kt"><a href="../Type Definitions.html#/c:SDLManager.h@T@SDLManagerReadyBlock">SDLManagerReadyBlock</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>readyHandler</dt>
+ <dd><p>The block called when the manager is ready to be used or an error occurs while attempting to become ready.</p>
+</dd>
+ </dl>
+
+ <h3 id="section--stop">
+ -stop
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">stop</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">stop</span><span class="p">()</span></code></pre>
+
+
+
+
+ <h3 id="section--sendRequest:">
+ -sendRequest:
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">sendRequest</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLRPCRequest.html">SDLRPCRequest</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">request</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">send</span><span class="p">(</span><span class="n">_</span> <span class="nv">request</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLRPCRequest.html">SDLRPCRequest</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>request</dt>
+ <dd><p>The RPC request to send</p>
+</dd>
+ </dl>
+
+ <h3 id="section--sendRequest:withResponseHandler:">
+ -sendRequest:withResponseHandler:
+ </h3>
+
+ <p>Send an RPC request and set a completion handler that will be called with the response when the response returns.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">sendRequest</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLRPCRequest.html">SDLRPCRequest</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">request</span>
+ <span class="nf">withResponseHandler</span><span class="p">:(</span><span class="n">nullable</span> <span class="n"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLResponseHandler">SDLResponseHandler</a></span><span class="p">)</span><span class="nv">handler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">send</span><span class="p">(</span><span class="n">_</span> <span class="nv">request</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLRPCRequest.html">SDLRPCRequest</a></span><span class="p">,</span> <span class="n">withResponseHandler</span> <span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLResponseHandler">SDLResponseHandler</a></span><span class="p">?</span> <span class="o">=</span> <span class="kc">nil</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>request</dt>
+ <dd><p>The RPC request to send</p>
+</dd>
+ <dt>handler</dt>
+ <dd><p>The handler that will be called when the response returns</p>
+</dd>
+ </dl>
+
+</section>
diff --git a/docs/Classes/SDLNotificationConstants.html b/docs/Classes/SDLNotificationConstants.html
new file mode 100644
index 000000000..a9775207d
--- /dev/null
+++ b/docs/Classes/SDLNotificationConstants.html
@@ -0,0 +1,38 @@
+<h1>SDLNotificationConstants Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-+allResponseNames">+allResponseNames</a></li>
+ <li><a href="#section-+allButtonEventNotifications">+allButtonEventNotifications</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-+allResponseNames">
+ +allResponseNames
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-+allButtonEventNotifications">
+ +allButtonEventNotifications
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLPermissionManager.html b/docs/Classes/SDLPermissionManager.html
new file mode 100644
index 000000000..955928b79
--- /dev/null
+++ b/docs/Classes/SDLPermissionManager.html
@@ -0,0 +1,247 @@
+<h1>SDLPermissionManager Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--startWithCompletionHandler:">-startWithCompletionHandler:</a></li>
+ <li><a href="#section--stop">-stop</a></li>
+ <li><a href="#section--isRPCAllowed:">-isRPCAllowed:</a></li>
+ <li><a href="#section--groupStatusOfRPCs:">-groupStatusOfRPCs:</a></li>
+ <li><a href="#section--statusOfRPCs:">-statusOfRPCs:</a></li>
+ <li><a href="#section--addObserverForRPCs:groupType:withHandler:">-addObserverForRPCs:groupType:withHandler:</a></li>
+ <li><a href="#section--removeAllObservers">-removeAllObservers</a></li>
+ <li><a href="#section--removeObserverForIdentifier:">-removeObserverForIdentifier:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--startWithCompletionHandler:">
+ -startWithCompletionHandler:
+ </h3>
+
+ <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="../Classes/SDLManager.html">SDLManager</a></code>.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">startWithCompletionHandler</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="kt">void</span> <span class="p">(</span><span class="o">^</span><span class="p">)(</span><span class="n">BOOL</span><span class="p">,</span> <span class="n">NSError</span> <span class="o">*</span><span class="n">_Nullable</span><span class="p">))</span><span class="nv">completionHandler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><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>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>completionHandler</dt>
+ <dd><p>The block to be called when the manager&rsquo;s setup is complete.</p>
+</dd>
+ </dl>
+
+ <h3 id="section--stop">
+ -stop
+ </h3>
+
+ <p>Stop the manager. This method is used internally.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">stop</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">stop</span><span class="p">()</span></code></pre>
+
+
+
+
+ <h3 id="section--isRPCAllowed:">
+ -isRPCAllowed:
+ </h3>
+
+ <p>Determine if an individual RPC is allowed for the current HMI level</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">BOOL</span><span class="p">)</span><span class="nf">isRPCAllowed</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName">SDLPermissionRPCName</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">rpcName</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">isRPCAllowed</span><span class="p">(</span><span class="n">_</span> <span class="nv">rpcName</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Bool</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>rpcName</dt>
+ <dd><p>The name of the RPC to be tested, for example, SDLShow</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>YES if the RPC is allowed at the current HMI level, NO if not</p>
+
+ </div>
+
+ <h3 id="section--groupStatusOfRPCs:">
+ -groupStatusOfRPCs:
+ </h3>
+
+ <p>Determine if all RPCs are allowed for the current HMI level</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n"><a href="../Enums/SDLPermissionGroupStatus.html">SDLPermissionGroupStatus</a></span><span class="p">)</span><span class="nf">groupStatusOfRPCs</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName">SDLPermissionRPCName</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">rpcNames</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">groupStatus</span><span class="p">(</span><span class="n">ofRPCs</span> <span class="nv">rpcNames</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="kt"><a href="../Enums/SDLPermissionGroupStatus.html">SDLPermissionGroupStatus</a></span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>rpcNames</dt>
+ <dd><p>The RPCs to check</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>AllAllowed if all of the permissions are allowed, AllDisallowed if all the permissions are disallowed, Any if some are allowed, and some are disallowed</p>
+
+ </div>
+
+ <h3 id="section--statusOfRPCs:">
+ -statusOfRPCs:
+ </h3>
+
+ <p>Retrieve a dictionary with keys that are the passed in RPC names, and objects of an NSNumber<BOOL> specifying if that RPC is currently allowed</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">NSDictionary</span><span class="o">&lt;</span><span class="n"><a href="../Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName">SDLPermissionRPCName</a></span> <span class="o">*</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">*&gt;</span> <span class="o">*</span><span class="p">)</span>
+<span class="nf">statusOfRPCs</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName">SDLPermissionRPCName</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">rpcNames</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">status</span><span class="p">(</span><span class="n">ofRPCs</span> <span class="nv">rpcNames</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="p">[</span><span class="kt">String</span> <span class="p">:</span> <span class="kt">NSNumber</span><span class="p">]</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>rpcNames</dt>
+ <dd><p>An array of RPC names to check</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>A dictionary specifying if the passed in RPC names are currently allowed or not</p>
+
+ </div>
+
+ <h3 id="section--addObserverForRPCs:groupType:withHandler:">
+ -addObserverForRPCs:groupType:withHandler:
+ </h3>
+
+ <p>Add an observer for specified RPC names, with a callback that will be called whenever the value changes, as well as immediately with the current status.</p>
+
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ <p>This block will be captured by the SDLPermissionsManager, be sure to use <a href="http://www.logicsector.com/ios/avoiding-objc-retain-cycles-with-weakself-and-strongself-the-easy-way/">weakself/strongself</a> if you are referencing self within your observer block.</p>
+
+</div>
+
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ <p>The observer may be called before this method returns, do not attempt to remove the observer from within the observer. That could send <code>nil</code> to removeObserverForIdentifier:. If you want functionality like that, call groupStatusOfRPCs: instead.</p>
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionObserverIdentifier">SDLPermissionObserverIdentifier</a></span> <span class="o">*</span><span class="p">)</span>
+<span class="nf">addObserverForRPCs</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n">NSArray</span><span class="o">&lt;</span><span class="n"><a href="../Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName">SDLPermissionRPCName</a></span> <span class="o">*&gt;</span> <span class="o">*</span><span class="p">)</span><span class="nv">rpcNames</span>
+ <span class="nf">groupType</span><span class="p">:(</span><span class="n"><a href="../Enums/SDLPermissionGroupType.html">SDLPermissionGroupType</a></span><span class="p">)</span><span class="nv">groupType</span>
+ <span class="nf">withHandler</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionsChangedHandler">SDLPermissionsChangedHandler</a></span><span class="p">)</span><span class="nv">handler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">addObserver</span><span class="p">(</span><span class="n">forRPCs</span> <span class="nv">rpcNames</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">],</span> <span class="nv">groupType</span><span class="p">:</span> <span class="kt"><a href="../Enums/SDLPermissionGroupType.html">SDLPermissionGroupType</a></span><span class="p">,</span> <span class="n">withHandler</span> <span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionsChangedHandler">SDLPermissionsChangedHandler</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">UUID</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>rpcNames</dt>
+ <dd><p>The RPCs to be observed</p>
+</dd>
+ <dt>groupType</dt>
+ <dd><p>Affects the times that the observer block will be called. If Any, any change to any RPC in rpcNames will cause the observer block to be called. If AllAllowed, the block will be called when: 1. Every RPC in rpcNames becomes allowed 2. The group of rpcNames goes from all being allowed to some or all being disallowed.</p>
+</dd>
+ <dt>handler</dt>
+ <dd><p>The block that will be called whenever permissions change.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An identifier that can be passed to removeObserverForIdentifer: to remove the observer</p>
+
+ </div>
+
+ <h3 id="section--removeAllObservers">
+ -removeAllObservers
+ </h3>
+
+ <p>Remove every current observer</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">removeAllObservers</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">removeAllObservers</span><span class="p">()</span></code></pre>
+
+
+
+
+ <h3 id="section--removeObserverForIdentifier:">
+ -removeObserverForIdentifier:
+ </h3>
+
+ <p>Remove block observers for the specified RPC</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">removeObserverForIdentifier</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionObserverIdentifier">SDLPermissionObserverIdentifier</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">identifier</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">removeObserver</span><span class="p">(</span><span class="n">forIdentifier</span> <span class="nv">identifier</span><span class="p">:</span> <span class="kt">UUID</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>identifier</dt>
+ <dd><p>The identifier specifying which observer to remove</p>
+</dd>
+ </dl>
+
+</section>
diff --git a/docs/Classes/SDLRPCNotificationNotification.html b/docs/Classes/SDLRPCNotificationNotification.html
new file mode 100644
index 000000000..5d2589ae7
--- /dev/null
+++ b/docs/Classes/SDLRPCNotificationNotification.html
@@ -0,0 +1,38 @@
+<h1>SDLRPCNotificationNotification Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-notification">notification</a></li>
+ <li><a href="#section--initWithName:object:rpcNotification:">-initWithName:object:rpcNotification:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-notification">
+ notification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section--initWithName:object:rpcNotification:">
+ -initWithName:object:rpcNotification:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLRPCRequestFactory.html b/docs/Classes/SDLRPCRequestFactory.html
index 398f15e3a..b5282e7d0 100644
--- a/docs/Classes/SDLRPCRequestFactory.html
+++ b/docs/Classes/SDLRPCRequestFactory.html
@@ -6,6 +6,9 @@
<li><a href="#section-+buildAddCommandWithID:menuName:parentID:position:vrCommands:iconValue:iconType:correlationID:">+buildAddCommandWithID:menuName:parentID:position:vrCommands:iconValue:iconType:correlationID:</a></li>
<li><a href="#section-+buildAddCommandWithID:menuName:vrCommands:correlationID:">+buildAddCommandWithID:menuName:vrCommands:correlationID:</a></li>
<li><a href="#section-+buildAddCommandWithID:vrCommands:correlationID:">+buildAddCommandWithID:vrCommands:correlationID:</a></li>
+ <li><a href="#section-+buildAddCommandWithID:menuName:parentID:position:vrCommands:iconValue:iconType:handler:">+buildAddCommandWithID:menuName:parentID:position:vrCommands:iconValue:iconType:handler:</a></li>
+ <li><a href="#section-+buildAddCommandWithID:menuName:vrCommands:handler:">+buildAddCommandWithID:menuName:vrCommands:handler:</a></li>
+ <li><a href="#section-+buildAddCommandWithID:vrCommands:handler:">+buildAddCommandWithID:vrCommands:handler:</a></li>
<li><a href="#section-+buildAddSubMenuWithID:menuName:position:correlationID:">+buildAddSubMenuWithID:menuName:position:correlationID:</a></li>
<li><a href="#section-+buildAddSubMenuWithID:menuName:correlationID:">+buildAddSubMenuWithID:menuName:correlationID:</a></li>
<li><a href="#section-+buildAlertWithTTS:alertText1:alertText2:alertText3:playTone:duration:correlationID:">+buildAlertWithTTS:alertText1:alertText2:alertText3:playTone:duration:correlationID:</a></li>
@@ -54,9 +57,11 @@
<li><a href="#section-+buildShowWithMainField1:mainField2:alignment:correlationID:">+buildShowWithMainField1:mainField2:alignment:correlationID:</a></li>
<li><a href="#section-+buildSliderDynamicFooterWithNumTicks:position:sliderHeader:sliderFooter:timeout:correlationID:">+buildSliderDynamicFooterWithNumTicks:position:sliderHeader:sliderFooter:timeout:correlationID:</a></li>
<li><a href="#section-+buildSliderStaticFooterWithNumTicks:position:sliderHeader:sliderFooter:timeout:correlationID:">+buildSliderStaticFooterWithNumTicks:position:sliderHeader:sliderFooter:timeout:correlationID:</a></li>
+ <li><a href="#section-+buildSoftButtonWithType:text:image:highlighted:buttonID:systemAction:handler:">+buildSoftButtonWithType:text:image:highlighted:buttonID:systemAction:handler:</a></li>
<li><a href="#section-+buildSpeakWithTTSChunks:correlationID:">+buildSpeakWithTTSChunks:correlationID:</a></li>
<li><a href="#section-+buildSpeakWithTTS:correlationID:">+buildSpeakWithTTS:correlationID:</a></li>
<li><a href="#section-+buildSubscribeButtonWithName:correlationID:">+buildSubscribeButtonWithName:correlationID:</a></li>
+ <li><a href="#section-+buildSubscribeButtonWithName:handler:">+buildSubscribeButtonWithName:handler:</a></li>
<li><a href="#section-+buildSubscribeVehicleDataWithGPS:speed:rpm:fuelLevel:fuelLevelState:instantFuelConsumption:externalTemperature:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:correlationID:">+buildSubscribeVehicleDataWithGPS:speed:rpm:fuelLevel:fuelLevelState:instantFuelConsumption:externalTemperature:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:correlationID:</a></li>
<li><a href="#section-+buildShowConstantTBTWithString:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:correlationID:">+buildShowConstantTBTWithString:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:correlationID:</a></li>
<li><a href="#section-+buildUnregisterAppInterfaceWithCorrelationID:">+buildUnregisterAppInterfaceWithCorrelationID:</a></li>
@@ -104,6 +109,39 @@
+ <h3 id="section-+buildAddCommandWithID:menuName:parentID:position:vrCommands:iconValue:iconType:handler:">
+ +buildAddCommandWithID:menuName:parentID:position:vrCommands:iconValue:iconType:handler:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-+buildAddCommandWithID:menuName:vrCommands:handler:">
+ +buildAddCommandWithID:menuName:vrCommands:handler:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-+buildAddCommandWithID:vrCommands:handler:">
+ +buildAddCommandWithID:vrCommands:handler:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
<h3 id="section-+buildAddSubMenuWithID:menuName:position:correlationID:">
+buildAddSubMenuWithID:menuName:position:correlationID:
</h3>
@@ -632,6 +670,17 @@
+ <h3 id="section-+buildSoftButtonWithType:text:image:highlighted:buttonID:systemAction:handler:">
+ +buildSoftButtonWithType:text:image:highlighted:buttonID:systemAction:handler:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
<h3 id="section-+buildSpeakWithTTSChunks:correlationID:">
+buildSpeakWithTTSChunks:correlationID:
</h3>
@@ -665,6 +714,17 @@
+ <h3 id="section-+buildSubscribeButtonWithName:handler:">
+ +buildSubscribeButtonWithName:handler:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
<h3 id="section-+buildSubscribeVehicleDataWithGPS:speed:rpm:fuelLevel:fuelLevelState:instantFuelConsumption:externalTemperature:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:correlationID:">
+buildSubscribeVehicleDataWithGPS:speed:rpm:fuelLevel:fuelLevelState:instantFuelConsumption:externalTemperature:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:correlationID:
</h3>
diff --git a/docs/Classes/SDLRPCResponseNotification.html b/docs/Classes/SDLRPCResponseNotification.html
new file mode 100644
index 000000000..c8125934f
--- /dev/null
+++ b/docs/Classes/SDLRPCResponseNotification.html
@@ -0,0 +1,38 @@
+<h1>SDLRPCResponseNotification Class Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-response">response</a></li>
+ <li><a href="#section--initWithName:object:rpcResponse:">-initWithName:object:rpcResponse:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-response">
+ response
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section--initWithName:object:rpcResponse:">
+ -initWithName:object:rpcResponse:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+</section>
diff --git a/docs/Classes/SDLSoftButton.html b/docs/Classes/SDLSoftButton.html
index bf8dd2986..ea3983948 100644
--- a/docs/Classes/SDLSoftButton.html
+++ b/docs/Classes/SDLSoftButton.html
@@ -4,7 +4,9 @@
<ul>
<li><a href="#section--init">-init</a></li>
+ <li><a href="#section--initWithHandler:">-initWithHandler:</a></li>
<li><a href="#section--initWithDictionary:">-initWithDictionary:</a></li>
+ <li><a href="#section-handler">handler</a></li>
<li><a href="#section-type">type</a></li>
<li><a href="#section-text">text</a></li>
<li><a href="#section-image">image</a></li>
@@ -30,6 +32,17 @@
+ <h3 id="section--initWithHandler:">
+ -initWithHandler:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
<h3 id="section--initWithDictionary:">
-initWithDictionary:
</h3>
@@ -41,6 +54,17 @@
+ <h3 id="section-handler">
+ handler
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
<h3 id="section-type">
type
</h3>
diff --git a/docs/Classes/SDLSubscribeButton.html b/docs/Classes/SDLSubscribeButton.html
index 0b970fe37..91f8a746f 100644
--- a/docs/Classes/SDLSubscribeButton.html
+++ b/docs/Classes/SDLSubscribeButton.html
@@ -4,7 +4,9 @@
<ul>
<li><a href="#section--init">-init</a></li>
+ <li><a href="#section--initWithHandler:">-initWithHandler:</a></li>
<li><a href="#section--initWithDictionary:">-initWithDictionary:</a></li>
+ <li><a href="#section-handler">handler</a></li>
<li><a href="#section-buttonName">buttonName</a></li>
</ul>
@@ -65,7 +67,7 @@
-init
</h3>
- <p>@abstract Constructs a new SDLSubscribeButton object</p>
+ <p>Construct an SDLSubscribeButton</p>
@@ -78,6 +80,40 @@
+ <div>
+ <h4>Return Value</h4>
+ <p>An SDLSubscribeButton object</p>
+
+ </div>
+
+ <h3 id="section--initWithHandler:">
+ -initWithHandler:
+ </h3>
+
+ <p>Construct a SDLSubscribeButton with a handler callback when an event occurs.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithHandler</span><span class="p">:(</span><span class="n"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span><span class="p">)</span><span class="nv">handler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="nf">init</span><span class="o">!</span><span class="p">(</span><span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span><span class="o">!</span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>handler</dt>
+ <dd><p>A callback that will be called when a button event occurs for the subscribed button.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An SDLSubscribeButton object</p>
+
+ </div>
<h3 id="section--initWithDictionary:">
-initWithDictionary:
@@ -105,6 +141,30 @@ parameter
</dd>
</dl>
+ <h3 id="section-handler">
+ handler
+ </h3>
+
+ <p>A handler that will let you know when the button you subscribed to is selected.</p>
+
+<div class="aside aside-warning">
+ <p class="aside-title">Warning</p>
+ This will only work if you use SDLManager.
+
+</div>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span> <span class="n">handler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span><span class="o">!</span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
<h3 id="section-buttonName">
buttonName
</h3>
diff --git a/docs/Constants.html b/docs/Constants.html
index 58c3d95f4..d1563e76e 100644
--- a/docs/Constants.html
+++ b/docs/Constants.html
@@ -3,6 +3,71 @@
<h3>Section Contents</h3>
<ul>
+ <li><a href="#section-SDLNotificationUserInfoObject">SDLNotificationUserInfoObject</a></li>
+ <li><a href="#section-SDLTransportDidDisconnect">SDLTransportDidDisconnect</a></li>
+ <li><a href="#section-SDLTransportDidConnect">SDLTransportDidConnect</a></li>
+ <li><a href="#section-SDLDidReceiveError">SDLDidReceiveError</a></li>
+ <li><a href="#section-SDLDidReceiveLockScreenIcon">SDLDidReceiveLockScreenIcon</a></li>
+ <li><a href="#section-SDLDidBecomeReady">SDLDidBecomeReady</a></li>
+ <li><a href="#section-SDLDidReceiveAddCommandResponse">SDLDidReceiveAddCommandResponse</a></li>
+ <li><a href="#section-SDLDidReceiveAddSubMenuResponse">SDLDidReceiveAddSubMenuResponse</a></li>
+ <li><a href="#section-SDLDidReceiveAlertResponse">SDLDidReceiveAlertResponse</a></li>
+ <li><a href="#section-SDLDidReceiveAlertManeuverResponse">SDLDidReceiveAlertManeuverResponse</a></li>
+ <li><a href="#section-SDLDidReceiveChangeRegistrationResponse">SDLDidReceiveChangeRegistrationResponse</a></li>
+ <li><a href="#section-SDLDidReceiveCreateInteractionChoiceSetResponse">SDLDidReceiveCreateInteractionChoiceSetResponse</a></li>
+ <li><a href="#section-SDLDidReceiveDeleteCommandResponse">SDLDidReceiveDeleteCommandResponse</a></li>
+ <li><a href="#section-SDLDidReceiveDeleteFileResponse">SDLDidReceiveDeleteFileResponse</a></li>
+ <li><a href="#section-SDLDidReceiveDeleteInteractionChoiceSetResponse">SDLDidReceiveDeleteInteractionChoiceSetResponse</a></li>
+ <li><a href="#section-SDLDidReceiveDeleteSubmenuResponse">SDLDidReceiveDeleteSubmenuResponse</a></li>
+ <li><a href="#section-SDLDidReceiveDiagnosticMessageResponse">SDLDidReceiveDiagnosticMessageResponse</a></li>
+ <li><a href="#section-SDLDidReceiveDialNumberResponse">SDLDidReceiveDialNumberResponse</a></li>
+ <li><a href="#section-SDLDidReceiveEncodedSyncPDataResponse">SDLDidReceiveEncodedSyncPDataResponse</a></li>
+ <li><a href="#section-SDLDidReceiveEndAudioPassThruResponse">SDLDidReceiveEndAudioPassThruResponse</a></li>
+ <li><a href="#section-SDLDidReceiveGenericResponse">SDLDidReceiveGenericResponse</a></li>
+ <li><a href="#section-SDLDidReceiveGetDTCsResponse">SDLDidReceiveGetDTCsResponse</a></li>
+ <li><a href="#section-SDLDidReceiveGetVehicleDataResponse">SDLDidReceiveGetVehicleDataResponse</a></li>
+ <li><a href="#section-SDLDidReceiveListFilesResponse">SDLDidReceiveListFilesResponse</a></li>
+ <li><a href="#section-SDLDidReceivePerformAudioPassThruResponse">SDLDidReceivePerformAudioPassThruResponse</a></li>
+ <li><a href="#section-SDLDidReceivePerformInteractionResponse">SDLDidReceivePerformInteractionResponse</a></li>
+ <li><a href="#section-SDLDidReceivePutFileResponse">SDLDidReceivePutFileResponse</a></li>
+ <li><a href="#section-SDLDidReceiveReadDIDResponse">SDLDidReceiveReadDIDResponse</a></li>
+ <li><a href="#section-SDLDidReceiveRegisterAppInterfaceResponse">SDLDidReceiveRegisterAppInterfaceResponse</a></li>
+ <li><a href="#section-SDLDidReceiveResetGlobalPropertiesResponse">SDLDidReceiveResetGlobalPropertiesResponse</a></li>
+ <li><a href="#section-SDLDidReceiveScrollableMessageResponse">SDLDidReceiveScrollableMessageResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSendLocationResponse">SDLDidReceiveSendLocationResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSetAppIconResponse">SDLDidReceiveSetAppIconResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSetDisplayLayoutResponse">SDLDidReceiveSetDisplayLayoutResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSetGlobalPropertiesResponse">SDLDidReceiveSetGlobalPropertiesResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSetMediaClockTimerResponse">SDLDidReceiveSetMediaClockTimerResponse</a></li>
+ <li><a href="#section-SDLDidReceiveShowConstantTBTResponse">SDLDidReceiveShowConstantTBTResponse</a></li>
+ <li><a href="#section-SDLDidReceiveShowResponse">SDLDidReceiveShowResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSliderResponse">SDLDidReceiveSliderResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSpeakResponse">SDLDidReceiveSpeakResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSubscribeButtonResponse">SDLDidReceiveSubscribeButtonResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSubscribeVehicleDataResponse">SDLDidReceiveSubscribeVehicleDataResponse</a></li>
+ <li><a href="#section-SDLDidReceiveSyncPDataResponse">SDLDidReceiveSyncPDataResponse</a></li>
+ <li><a href="#section-SDLDidReceiveUpdateTurnListResponse">SDLDidReceiveUpdateTurnListResponse</a></li>
+ <li><a href="#section-SDLDidReceiveUnregisterAppInterfaceResponse">SDLDidReceiveUnregisterAppInterfaceResponse</a></li>
+ <li><a href="#section-SDLDidReceiveUnsubscribeButtonResponse">SDLDidReceiveUnsubscribeButtonResponse</a></li>
+ <li><a href="#section-SDLDidReceiveUnsubscribeVehicleDataResponse">SDLDidReceiveUnsubscribeVehicleDataResponse</a></li>
+ <li><a href="#section-SDLDidChangeDriverDistractionStateNotification">SDLDidChangeDriverDistractionStateNotification</a></li>
+ <li><a href="#section-SDLDidChangeHMIStatusNotification">SDLDidChangeHMIStatusNotification</a></li>
+ <li><a href="#section-SDLDidReceiveAudioPassThruNotification">SDLDidReceiveAudioPassThruNotification</a></li>
+ <li><a href="#section-SDLDidReceiveAppUnregisteredNotification">SDLDidReceiveAppUnregisteredNotification</a></li>
+ <li><a href="#section-SDLDidReceiveButtonEventNotification">SDLDidReceiveButtonEventNotification</a></li>
+ <li><a href="#section-SDLDidReceiveButtonPressNotification">SDLDidReceiveButtonPressNotification</a></li>
+ <li><a href="#section-SDLDidReceiveCommandNotification">SDLDidReceiveCommandNotification</a></li>
+ <li><a href="#section-SDLDidReceiveEncodedDataNotification">SDLDidReceiveEncodedDataNotification</a></li>
+ <li><a href="#section-SDLDidReceiveKeyboardInputNotification">SDLDidReceiveKeyboardInputNotification</a></li>
+ <li><a href="#section-SDLDidChangeLanguageNotification">SDLDidChangeLanguageNotification</a></li>
+ <li><a href="#section-SDLDidChangeLockScreenStatusNotification">SDLDidChangeLockScreenStatusNotification</a></li>
+ <li><a href="#section-SDLDidReceiveNewHashNotification">SDLDidReceiveNewHashNotification</a></li>
+ <li><a href="#section-SDLDidReceiveVehicleIconNotification">SDLDidReceiveVehicleIconNotification</a></li>
+ <li><a href="#section-SDLDidChangePermissionsNotification">SDLDidChangePermissionsNotification</a></li>
+ <li><a href="#section-SDLDidReceiveSystemRequestNotification">SDLDidReceiveSystemRequestNotification</a></li>
+ <li><a href="#section-SDLDidChangeTurnByTurnStateNotification">SDLDidChangeTurnByTurnStateNotification</a></li>
+ <li><a href="#section-SDLDidReceiveTouchEventNotification">SDLDidReceiveTouchEventNotification</a></li>
+ <li><a href="#section-SDLDidReceiveVehicleDataNotification">SDLDidReceiveVehicleDataNotification</a></li>
<li><a href="#section-SDLProtocolSecurityErrorDomain">SDLProtocolSecurityErrorDomain</a></li>
<li><a href="#section-SDLErrorDomainStreamingMediaVideo">SDLErrorDomainStreamingMediaVideo</a></li>
<li><a href="#section-SDLErrorDomainStreamingMediaAudio">SDLErrorDomainStreamingMediaAudio</a></li>
@@ -17,6 +82,721 @@
<section class="section task-group-section">
+ <h3 id="section-SDLNotificationUserInfoObject">
+ SDLNotificationUserInfoObject
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLTransportDidDisconnect">
+ SDLTransportDidDisconnect
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLTransportDidConnect">
+ SDLTransportDidConnect
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveError">
+ SDLDidReceiveError
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveLockScreenIcon">
+ SDLDidReceiveLockScreenIcon
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidBecomeReady">
+ SDLDidBecomeReady
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveAddCommandResponse">
+ SDLDidReceiveAddCommandResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveAddSubMenuResponse">
+ SDLDidReceiveAddSubMenuResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveAlertResponse">
+ SDLDidReceiveAlertResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveAlertManeuverResponse">
+ SDLDidReceiveAlertManeuverResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveChangeRegistrationResponse">
+ SDLDidReceiveChangeRegistrationResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveCreateInteractionChoiceSetResponse">
+ SDLDidReceiveCreateInteractionChoiceSetResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveDeleteCommandResponse">
+ SDLDidReceiveDeleteCommandResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveDeleteFileResponse">
+ SDLDidReceiveDeleteFileResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveDeleteInteractionChoiceSetResponse">
+ SDLDidReceiveDeleteInteractionChoiceSetResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveDeleteSubmenuResponse">
+ SDLDidReceiveDeleteSubmenuResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveDiagnosticMessageResponse">
+ SDLDidReceiveDiagnosticMessageResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveDialNumberResponse">
+ SDLDidReceiveDialNumberResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveEncodedSyncPDataResponse">
+ SDLDidReceiveEncodedSyncPDataResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveEndAudioPassThruResponse">
+ SDLDidReceiveEndAudioPassThruResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveGenericResponse">
+ SDLDidReceiveGenericResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveGetDTCsResponse">
+ SDLDidReceiveGetDTCsResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveGetVehicleDataResponse">
+ SDLDidReceiveGetVehicleDataResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveListFilesResponse">
+ SDLDidReceiveListFilesResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceivePerformAudioPassThruResponse">
+ SDLDidReceivePerformAudioPassThruResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceivePerformInteractionResponse">
+ SDLDidReceivePerformInteractionResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceivePutFileResponse">
+ SDLDidReceivePutFileResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveReadDIDResponse">
+ SDLDidReceiveReadDIDResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveRegisterAppInterfaceResponse">
+ SDLDidReceiveRegisterAppInterfaceResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveResetGlobalPropertiesResponse">
+ SDLDidReceiveResetGlobalPropertiesResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveScrollableMessageResponse">
+ SDLDidReceiveScrollableMessageResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSendLocationResponse">
+ SDLDidReceiveSendLocationResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSetAppIconResponse">
+ SDLDidReceiveSetAppIconResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSetDisplayLayoutResponse">
+ SDLDidReceiveSetDisplayLayoutResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSetGlobalPropertiesResponse">
+ SDLDidReceiveSetGlobalPropertiesResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSetMediaClockTimerResponse">
+ SDLDidReceiveSetMediaClockTimerResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveShowConstantTBTResponse">
+ SDLDidReceiveShowConstantTBTResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveShowResponse">
+ SDLDidReceiveShowResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSliderResponse">
+ SDLDidReceiveSliderResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSpeakResponse">
+ SDLDidReceiveSpeakResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSubscribeButtonResponse">
+ SDLDidReceiveSubscribeButtonResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSubscribeVehicleDataResponse">
+ SDLDidReceiveSubscribeVehicleDataResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSyncPDataResponse">
+ SDLDidReceiveSyncPDataResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveUpdateTurnListResponse">
+ SDLDidReceiveUpdateTurnListResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveUnregisterAppInterfaceResponse">
+ SDLDidReceiveUnregisterAppInterfaceResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveUnsubscribeButtonResponse">
+ SDLDidReceiveUnsubscribeButtonResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveUnsubscribeVehicleDataResponse">
+ SDLDidReceiveUnsubscribeVehicleDataResponse
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidChangeDriverDistractionStateNotification">
+ SDLDidChangeDriverDistractionStateNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidChangeHMIStatusNotification">
+ SDLDidChangeHMIStatusNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveAudioPassThruNotification">
+ SDLDidReceiveAudioPassThruNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveAppUnregisteredNotification">
+ SDLDidReceiveAppUnregisteredNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveButtonEventNotification">
+ SDLDidReceiveButtonEventNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveButtonPressNotification">
+ SDLDidReceiveButtonPressNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveCommandNotification">
+ SDLDidReceiveCommandNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveEncodedDataNotification">
+ SDLDidReceiveEncodedDataNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveKeyboardInputNotification">
+ SDLDidReceiveKeyboardInputNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidChangeLanguageNotification">
+ SDLDidChangeLanguageNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidChangeLockScreenStatusNotification">
+ SDLDidChangeLockScreenStatusNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveNewHashNotification">
+ SDLDidReceiveNewHashNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveVehicleIconNotification">
+ SDLDidReceiveVehicleIconNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidChangePermissionsNotification">
+ SDLDidChangePermissionsNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveSystemRequestNotification">
+ SDLDidReceiveSystemRequestNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidChangeTurnByTurnStateNotification">
+ SDLDidChangeTurnByTurnStateNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveTouchEventNotification">
+ SDLDidReceiveTouchEventNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLDidReceiveVehicleDataNotification">
+ SDLDidReceiveVehicleDataNotification
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
<h3 id="section-SDLProtocolSecurityErrorDomain">
SDLProtocolSecurityErrorDomain
</h3>
diff --git a/docs/Enums.html b/docs/Enums.html
index 83dc68147..840e35685 100644
--- a/docs/Enums.html
+++ b/docs/Enums.html
@@ -3,8 +3,14 @@
<h3>Section Contents</h3>
<ul>
+ <li><a href="#section-SDLArtworkImageFormat">SDLArtworkImageFormat</a></li>
<li><a href="#section-SDLDebugType">SDLDebugType</a></li>
<li><a href="#section-SDLDebugOutput">SDLDebugOutput</a></li>
+ <li><a href="#section-SDLManagerError">SDLManagerError</a></li>
+ <li><a href="#section-SDLFileManagerError">SDLFileManagerError</a></li>
+ <li><a href="#section-SDLLogOutput">SDLLogOutput</a></li>
+ <li><a href="#section-SDLPermissionGroupType">SDLPermissionGroupType</a></li>
+ <li><a href="#section-SDLPermissionGroupStatus">SDLPermissionGroupStatus</a></li>
<li><a href="#section-SDLProtocolError">SDLProtocolError</a></li>
<li><a href="#section-SDLFrameType">SDLFrameType</a></li>
<li><a href="#section-SDLServiceType">SDLServiceType</a></li>
@@ -21,6 +27,18 @@
<section class="section task-group-section">
+ <h3 id="section-SDLArtworkImageFormat">
+ SDLArtworkImageFormat
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Enums/SDLArtworkImageFormat.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLDebugType">
SDLDebugType
</h3>
@@ -45,6 +63,94 @@
+ <h3 id="section-SDLManagerError">
+ SDLManagerError
+ </h3>
+
+ <p>Errors associated with the SDLManager class.</p>
+
+ <a href="Enums/SDLManagerError.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">enum</span> <span class="n">SDLManagerError</span> <span class="o">:</span> <span class="n">NSInteger</span> <span class="p">{}</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">enum</span> <span class="kt">SDLManagerError</span> <span class="p">:</span> <span class="kt">Int</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLFileManagerError">
+ SDLFileManagerError
+ </h3>
+
+ <p>Errors associated with the SDLFileManager class.</p>
+
+ <a href="Enums/SDLFileManagerError.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">enum</span> <span class="n">SDLFileManagerError</span> <span class="o">:</span> <span class="n">NSInteger</span> <span class="p">{}</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">enum</span> <span class="kt">SDLFileManagerError</span> <span class="p">:</span> <span class="kt">Int</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLLogOutput">
+ SDLLogOutput
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Enums/SDLLogOutput.html" class="slightly-smaller">See more</a>
+
+
+
+
+
+ <h3 id="section-SDLPermissionGroupType">
+ SDLPermissionGroupType
+ </h3>
+
+ <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>
+
+ <a href="Enums/SDLPermissionGroupType.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">enum</span> <span class="n">SDLPermissionGroupType</span> <span class="o">:</span> <span class="n">NSUInteger</span> <span class="p">{}</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">enum</span> <span class="kt">SDLPermissionGroupType</span> <span class="p">:</span> <span class="kt">UInt</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLPermissionGroupStatus">
+ SDLPermissionGroupStatus
+ </h3>
+
+ <p>The status of the group of RPCs permissions.</p>
+
+ <a href="Enums/SDLPermissionGroupStatus.html" class="slightly-smaller">See more</a>
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">enum</span> <span class="n">SDLPermissionGroupStatus</span> <span class="o">:</span> <span class="n">NSUInteger</span> <span class="p">{}</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">enum</span> <span class="kt">SDLPermissionGroupStatus</span> <span class="p">:</span> <span class="kt">UInt</span></code></pre>
+
+
+
+
<h3 id="section-SDLProtocolError">
SDLProtocolError
</h3>
diff --git a/docs/Enums/SDLArtworkImageFormat.html b/docs/Enums/SDLArtworkImageFormat.html
new file mode 100644
index 000000000..dde3cee85
--- /dev/null
+++ b/docs/Enums/SDLArtworkImageFormat.html
@@ -0,0 +1,38 @@
+<h1>SDLArtworkImageFormat Enum Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-SDLArtworkImageFormatPNG">SDLArtworkImageFormatPNG</a></li>
+ <li><a href="#section-SDLArtworkImageFormatJPG">SDLArtworkImageFormatJPG</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-SDLArtworkImageFormatPNG">
+ SDLArtworkImageFormatPNG
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLArtworkImageFormatJPG">
+ SDLArtworkImageFormatJPG
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+</section>
diff --git a/docs/Enums/SDLFileManagerError.html b/docs/Enums/SDLFileManagerError.html
new file mode 100644
index 000000000..19abfbb42
--- /dev/null
+++ b/docs/Enums/SDLFileManagerError.html
@@ -0,0 +1,52 @@
+<h1>SDLFileManagerError Enum Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-SDLFileManagerErrorCannotOverwrite">SDLFileManagerErrorCannotOverwrite</a></li>
+ <li><a href="#section-SDLFileManagerErrorNoKnownFile">SDLFileManagerErrorNoKnownFile</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Errors associated with the SDLFileManager class.</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-SDLFileManagerErrorCannotOverwrite">
+ SDLFileManagerErrorCannotOverwrite
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLFileManagerErrorCannotOverwrite</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">cannotOverwrite</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLFileManagerErrorNoKnownFile">
+ SDLFileManagerErrorNoKnownFile
+ </h3>
+
+ <p>A file was attempted to be accessed but it does not exist.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLFileManagerErrorNoKnownFile</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">noKnownFile</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Enums/SDLLogOutput.html b/docs/Enums/SDLLogOutput.html
new file mode 100644
index 000000000..c55694c7f
--- /dev/null
+++ b/docs/Enums/SDLLogOutput.html
@@ -0,0 +1,62 @@
+<h1>SDLLogOutput Enum Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-SDLLogOutputNone">SDLLogOutputNone</a></li>
+ <li><a href="#section-SDLLogOutputConsole">SDLLogOutputConsole</a></li>
+ <li><a href="#section-SDLLogOutputFile">SDLLogOutputFile</a></li>
+ <li><a href="#section-SDLLogOutputSiphon">SDLLogOutputSiphon</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-SDLLogOutputNone">
+ SDLLogOutputNone
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLLogOutputConsole">
+ SDLLogOutputConsole
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLLogOutputFile">
+ SDLLogOutputFile
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLLogOutputSiphon">
+ SDLLogOutputSiphon
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+</section>
diff --git a/docs/Enums/SDLManagerError.html b/docs/Enums/SDLManagerError.html
new file mode 100644
index 000000000..5528ca643
--- /dev/null
+++ b/docs/Enums/SDLManagerError.html
@@ -0,0 +1,128 @@
+<h1>SDLManagerError Enum Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-SDLManagerErrorRPCRequestFailed">SDLManagerErrorRPCRequestFailed</a></li>
+ <li><a href="#section-SDLManagerErrorNotConnected">SDLManagerErrorNotConnected</a></li>
+ <li><a href="#section-SDLManagerErrorNotReady">SDLManagerErrorNotReady</a></li>
+ <li><a href="#section-SDLManagerErrorUnknownRemoteError">SDLManagerErrorUnknownRemoteError</a></li>
+ <li><a href="#section-SDLManagerErrorManagersFailedToStart">SDLManagerErrorManagersFailedToStart</a></li>
+ <li><a href="#section-SDLManagerErrorRegistrationFailed">SDLManagerErrorRegistrationFailed</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Errors associated with the SDLManager class.</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-SDLManagerErrorRPCRequestFailed">
+ SDLManagerErrorRPCRequestFailed
+ </h3>
+
+ <p>An RPC request failed to send.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLManagerErrorRPCRequestFailed</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">rpcRequestFailed</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLManagerErrorNotConnected">
+ SDLManagerErrorNotConnected
+ </h3>
+
+ <p>Some action was attempted that requires a connection to the remote head unit.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLManagerErrorNotConnected</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">notConnected</span> <span class="o">=</span> <span class="o">-</span><span class="mi">2</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLManagerErrorNotReady">
+ SDLManagerErrorNotReady
+ </h3>
+
+ <p>Some action was attempted before the ready state was reached.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLManagerErrorNotReady</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">notReady</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLManagerErrorUnknownRemoteError">
+ SDLManagerErrorUnknownRemoteError
+ </h3>
+
+ <p>The remote system encountered an unknown error.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLManagerErrorUnknownRemoteError</span> <span class="o">=</span> <span class="o">-</span><span class="mi">4</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">unknownRemoteError</span> <span class="o">=</span> <span class="o">-</span><span class="mi">4</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLManagerErrorManagersFailedToStart">
+ SDLManagerErrorManagersFailedToStart
+ </h3>
+
+ <p>One or more of the sub-managers failed to start.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLManagerErrorManagersFailedToStart</span> <span class="o">=</span> <span class="o">-</span><span class="mi">5</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">managersFailedToStart</span> <span class="o">=</span> <span class="o">-</span><span class="mi">5</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLManagerErrorRegistrationFailed">
+ SDLManagerErrorRegistrationFailed
+ </h3>
+
+ <p>Registering with the remote system failed.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLManagerErrorRegistrationFailed</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">registrationFailed</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Enums/SDLPermissionGroupStatus.html b/docs/Enums/SDLPermissionGroupStatus.html
new file mode 100644
index 000000000..45faaaadf
--- /dev/null
+++ b/docs/Enums/SDLPermissionGroupStatus.html
@@ -0,0 +1,90 @@
+<h1>SDLPermissionGroupStatus Enum Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-SDLPermissionGroupStatusAllowed">SDLPermissionGroupStatusAllowed</a></li>
+ <li><a href="#section-SDLPermissionGroupStatusDisallowed">SDLPermissionGroupStatusDisallowed</a></li>
+ <li><a href="#section-SDLPermissionGroupStatusMixed">SDLPermissionGroupStatusMixed</a></li>
+ <li><a href="#section-SDLPermissionGroupStatusUnknown">SDLPermissionGroupStatusUnknown</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>The status of the group of RPCs permissions.</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-SDLPermissionGroupStatusAllowed">
+ SDLPermissionGroupStatusAllowed
+ </h3>
+
+ <p>Every RPC in the group is currently allowed.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLPermissionGroupStatusAllowed</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">allowed</span> <span class="o">=</span> <span class="mi">0</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLPermissionGroupStatusDisallowed">
+ SDLPermissionGroupStatusDisallowed
+ </h3>
+
+ <p>Every RPC in the group is currently disallowed.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLPermissionGroupStatusDisallowed</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">disallowed</span> <span class="o">=</span> <span class="mi">1</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLPermissionGroupStatusMixed">
+ SDLPermissionGroupStatusMixed
+ </h3>
+
+ <p>Some RPCs in the group are allowed and some disallowed.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLPermissionGroupStatusMixed</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">mixed</span> <span class="o">=</span> <span class="mi">2</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLPermissionGroupStatusUnknown">
+ SDLPermissionGroupStatusUnknown
+ </h3>
+
+ <p>The current status of the group is unknown.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLPermissionGroupStatusUnknown</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">unknown</span> <span class="o">=</span> <span class="mi">3</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Enums/SDLPermissionGroupType.html b/docs/Enums/SDLPermissionGroupType.html
new file mode 100644
index 000000000..f85bee64f
--- /dev/null
+++ b/docs/Enums/SDLPermissionGroupType.html
@@ -0,0 +1,52 @@
+<h1>SDLPermissionGroupType Enum Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-SDLPermissionGroupTypeAllAllowed">SDLPermissionGroupTypeAllAllowed</a></li>
+ <li><a href="#section-SDLPermissionGroupTypeAny">SDLPermissionGroupTypeAny</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<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>
+
+
+<section class="section task-group-section">
+ <h3 id="section-SDLPermissionGroupTypeAllAllowed">
+ SDLPermissionGroupTypeAllAllowed
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLPermissionGroupTypeAllAllowed</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">allAllowed</span> <span class="o">=</span> <span class="mi">0</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLPermissionGroupTypeAny">
+ SDLPermissionGroupTypeAny
+ </h3>
+
+ <p>Be notified when any change in availability occurs among the group.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="n">SDLPermissionGroupTypeAny</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">case</span> <span class="n">any</span> <span class="o">=</span> <span class="mi">1</span></code></pre>
+
+
+
+
+</section>
diff --git a/docs/Protocols.html b/docs/Protocols.html
index f56f37d0c..9bf3d00d8 100644
--- a/docs/Protocols.html
+++ b/docs/Protocols.html
@@ -3,10 +3,16 @@
<h3>Section Contents</h3>
<ul>
+ <li><a href="#section-SDLInt">SDLInt</a></li>
+ <li><a href="#section-SDLUInt">SDLUInt</a></li>
+ <li><a href="#section-SDLBool">SDLBool</a></li>
+ <li><a href="#section-SDLFloat">SDLFloat</a></li>
<li><a href="#section-SDLDebugToolConsole">SDLDebugToolConsole</a></li>
<li><a href="#section-SDLIAPSessionDelegate">SDLIAPSessionDelegate</a></li>
+ <li><a href="#section-SDLManagerDelegate">SDLManagerDelegate</a></li>
<li><a href="#section-SDLProtocolListener">SDLProtocolListener</a></li>
<li><a href="#section-SDLProxyListener">SDLProxyListener</a></li>
+ <li><a href="#section-SDLRequestHandler">SDLRequestHandler</a></li>
<li><a href="#section-SDLSecurityType">SDLSecurityType</a></li>
<li><a href="#section-SDLTouchManagerDelegate">SDLTouchManagerDelegate</a></li>
<li><a href="#section-SDLTransportDelegate">SDLTransportDelegate</a></li>
@@ -18,6 +24,78 @@
<section class="section task-group-section">
+ <h3 id="section-SDLInt">
+ SDLInt
+ </h3>
+
+ <p>A decleration that this NSNumber contains an NSInteger.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@protocol</span> <span class="nc">SDLInt</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">protocol</span> <span class="kt">SDLInt</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLUInt">
+ SDLUInt
+ </h3>
+
+ <p>A declaration that this NSNumber contains an NSUInteger.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@protocol</span> <span class="nc">SDLUInt</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">protocol</span> <span class="kt">SDLUInt</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLBool">
+ SDLBool
+ </h3>
+
+ <p>A declaration that this NSNumber contains a BOOL.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@protocol</span> <span class="nc">SDLBool</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">protocol</span> <span class="kt">SDLBool</span></code></pre>
+
+
+
+
+ <h3 id="section-SDLFloat">
+ SDLFloat
+ </h3>
+
+ <p>A declaration that this NSNumber contains a float.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@protocol</span> <span class="nc">SDLFloat</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">protocol</span> <span class="kt">SDLFloat</span></code></pre>
+
+
+
+
<h3 id="section-SDLDebugToolConsole">
SDLDebugToolConsole
</h3>
@@ -42,6 +120,18 @@
+ <h3 id="section-SDLManagerDelegate">
+ SDLManagerDelegate
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Protocols/SDLManagerDelegate.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLProtocolListener">
SDLProtocolListener
</h3>
@@ -66,6 +156,18 @@
+ <h3 id="section-SDLRequestHandler">
+ SDLRequestHandler
+ </h3>
+
+ <p>Undocumented</p>
+
+ <a href="Protocols/SDLRequestHandler.html" class="slightly-smaller">See more</a>
+
+
+
+
+
<h3 id="section-SDLSecurityType">
SDLSecurityType
</h3>
diff --git a/docs/Protocols/SDLManagerDelegate.html b/docs/Protocols/SDLManagerDelegate.html
new file mode 100644
index 000000000..76805f776
--- /dev/null
+++ b/docs/Protocols/SDLManagerDelegate.html
@@ -0,0 +1,62 @@
+<h1>SDLManagerDelegate Protocol Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section--managerDidDisconnect">-managerDidDisconnect</a></li>
+ <li><a href="#section--hmiLevel:didChangeToLevel:">-hmiLevel:didChangeToLevel:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section--managerDidDisconnect">
+ -managerDidDisconnect
+ </h3>
+
+ <p>Called upon a disconnection from the remote system.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">managerDidDisconnect</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">managerDidDisconnect</span><span class="p">()</span></code></pre>
+
+
+
+
+ <h3 id="section--hmiLevel:didChangeToLevel:">
+ -hmiLevel:didChangeToLevel:
+ </h3>
+
+ <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>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">hmiLevel</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLHMILevel.html">SDLHMILevel</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">oldLevel</span>
+ <span class="nf">didChangeToLevel</span><span class="p">:(</span><span class="n">nonnull</span> <span class="n"><a href="../Classes/SDLHMILevel.html">SDLHMILevel</a></span> <span class="o">*</span><span class="p">)</span><span class="nv">newLevel</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">func</span> <span class="nf">hmiLevel</span><span class="p">(</span><span class="n">_</span> <span class="nv">oldLevel</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLHMILevel.html">SDLHMILevel</a></span><span class="p">,</span> <span class="n">didChangeTo</span> <span class="nv">newLevel</span><span class="p">:</span> <span class="kt"><a href="../Classes/SDLHMILevel.html">SDLHMILevel</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>oldLevel</dt>
+ <dd><p>The previous level which has now been left.</p>
+</dd>
+ <dt>newLevel</dt>
+ <dd><p>The current level.</p>
+</dd>
+ </dl>
+
+</section>
diff --git a/docs/Protocols/SDLProxyListener.html b/docs/Protocols/SDLProxyListener.html
index 092e6717c..efb3a93c8 100644
--- a/docs/Protocols/SDLProxyListener.html
+++ b/docs/Protocols/SDLProxyListener.html
@@ -34,6 +34,7 @@
<li><a href="#section--onOnCommand:">-onOnCommand:</a></li>
<li><a href="#section--onOnEncodedSyncPData:">-onOnEncodedSyncPData:</a></li>
<li><a href="#section--onOnHashChange:">-onOnHashChange:</a></li>
+ <li><a href="#section--onOnKeyboardInput:">-onOnKeyboardInput:</a></li>
<li><a href="#section--onOnLanguageChange:">-onOnLanguageChange:</a></li>
<li><a href="#section--onOnLockScreenNotification:">-onOnLockScreenNotification:</a></li>
<li><a href="#section--onOnPermissionsChange:">-onOnPermissionsChange:</a></li>
@@ -414,6 +415,17 @@
+ <h3 id="section--onOnKeyboardInput:">
+ -onOnKeyboardInput:
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
<h3 id="section--onOnLanguageChange:">
-onOnLanguageChange:
</h3>
diff --git a/docs/Protocols/SDLRequestHandler.html b/docs/Protocols/SDLRequestHandler.html
new file mode 100644
index 000000000..244b69125
--- /dev/null
+++ b/docs/Protocols/SDLRequestHandler.html
@@ -0,0 +1,65 @@
+<h1>SDLRequestHandler Protocol Reference</h1>
+
+<h3>Section Contents</h3>
+
+<ul>
+ <li><a href="#section-handler">handler</a></li>
+ <li><a href="#section--initWithHandler:">-initWithHandler:</a></li>
+</ul>
+
+<h3>Overview</h3>
+
+<p>Undocumented</p>
+
+
+<section class="section task-group-section">
+ <h3 id="section-handler">
+ handler
+ </h3>
+
+ <p>The handler that is added to any RPC implementing this protocol.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">@property</span> <span class="p">(</span><span class="n">readwrite</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="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span> <span class="n">_Nonnull</span> <span class="n">handler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="k">var</span> <span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span> <span class="p">{</span> <span class="k">get</span> <span class="k">set</span> <span class="p">}</span></code></pre>
+
+
+
+
+ <h3 id="section--initWithHandler:">
+ -initWithHandler:
+ </h3>
+
+ <p>A special init function on any RPC implementing this protocol.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">-</span> <span class="p">(</span><span class="n">nonnull</span> <span class="n">instancetype</span><span class="p">)</span><span class="nf">initWithHandler</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">nonnull</span> <span class="n"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span><span class="p">)</span><span class="nv">handler</span><span class="p">;</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="nf">init</span><span class="p">(</span><span class="nv">handler</span><span class="p">:</span> <span class="kt"><a href="../Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></span><span class="p">)</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>handler</dt>
+ <dd><p>The handler to be called at specified times, such as events for buttons.</p>
+</dd>
+ </dl>
+ <div>
+ <h4>Return Value</h4>
+ <p>An instance of the class implementing this protocol.</p>
+
+ </div>
+
+</section>
diff --git a/docs/Type Definitions.html b/docs/Type Definitions.html
index 5c11ef275..e13a3e10c 100644
--- a/docs/Type Definitions.html
+++ b/docs/Type Definitions.html
@@ -3,6 +3,19 @@
<h3>Section Contents</h3>
<ul>
+ <li><a href="#section-SDLFileName">SDLFileName</a></li>
+ <li><a href="#section-SDLFileManagerStartupCompletionHandler">SDLFileManagerStartupCompletionHandler</a></li>
+ <li><a href="#section-SDLFileManagerUploadCompletionHandler">SDLFileManagerUploadCompletionHandler</a></li>
+ <li><a href="#section-SDLFileManagerDeleteCompletionHandler">SDLFileManagerDeleteCompletionHandler</a></li>
+ <li><a href="#section-SDLFileManagerListFilesCompletionHandler">SDLFileManagerListFilesCompletionHandler</a></li>
+ <li><a href="#section-SDLManagerReadyBlock">SDLManagerReadyBlock</a></li>
+ <li><a href="#section-SDLNotificationName">SDLNotificationName</a></li>
+ <li><a href="#section-SDLNotificationUserInfoKey">SDLNotificationUserInfoKey</a></li>
+ <li><a href="#section-SDLRPCNotificationHandler">SDLRPCNotificationHandler</a></li>
+ <li><a href="#section-SDLResponseHandler">SDLResponseHandler</a></li>
+ <li><a href="#section-SDLPermissionRPCName">SDLPermissionRPCName</a></li>
+ <li><a href="#section-SDLPermissionObserverIdentifier">SDLPermissionObserverIdentifier</a></li>
+ <li><a href="#section-SDLPermissionsChangedHandler">SDLPermissionsChangedHandler</a></li>
<li><a href="#section-SDLStreamingStartBlock">SDLStreamingStartBlock</a></li>
<li><a href="#section-SDLStreamingEncryptionStartBlock">SDLStreamingEncryptionStartBlock</a></li>
</ul>
@@ -13,6 +26,203 @@
<section class="section task-group-section">
+ <h3 id="section-SDLFileName">
+ SDLFileName
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLFileManagerStartupCompletionHandler">
+ SDLFileManagerStartupCompletionHandler
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLFileManagerUploadCompletionHandler">
+ SDLFileManagerUploadCompletionHandler
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLFileManagerDeleteCompletionHandler">
+ SDLFileManagerDeleteCompletionHandler
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLFileManagerListFilesCompletionHandler">
+ SDLFileManagerListFilesCompletionHandler
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLManagerReadyBlock">
+ SDLManagerReadyBlock
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLNotificationName">
+ SDLNotificationName
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLNotificationUserInfoKey">
+ SDLNotificationUserInfoKey
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLRPCNotificationHandler">
+ SDLRPCNotificationHandler
+ </h3>
+
+ <p>A handler used on certain RPCs, primarily buttons or commands, when an event occurs.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">typedef</span> <span class="kt">void</span> <span class="p">(</span><span class="o">^</span><span class="n">SDLRPCNotificationHandler</span><span class="p">)(</span><span class="n">__kindof</span> <span class="n"><a href="Classes/SDLRPCNotification.html">SDLRPCNotification</a></span> <span class="o">*</span><span class="n">_Nonnull</span><span class="p">)</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">typealias</span> <span class="kt">SDLRPCNotificationHandler</span> <span class="o">=</span> <span class="p">(</span><span class="kt"><a href="Classes/SDLRPCNotification.html">SDLRPCNotification</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Void</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>notification</dt>
+ <dd><p>The RPC Notification that was fired.</p>
+</dd>
+ </dl>
+
+ <h3 id="section-SDLResponseHandler">
+ SDLResponseHandler
+ </h3>
+
+ <p>A handler used on all RPC requests which fires when the response is received.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">typedef</span> <span class="kt">void</span> <span class="p">(</span><span class="o">^</span><span class="n">SDLResponseHandler</span><span class="p">)(</span><span class="n">__kindof</span> <span class="n"><a href="Classes/SDLRPCRequest.html">SDLRPCRequest</a></span> <span class="o">*</span><span class="n">_Nullable</span><span class="p">,</span>
+ <span class="n">__kindof</span> <span class="n"><a href="Classes/SDLRPCResponse.html">SDLRPCResponse</a></span> <span class="o">*</span><span class="n">_Nullable</span><span class="p">,</span>
+ <span class="n">NSError</span> <span class="o">*</span><span class="n">_Nullable</span><span class="p">)</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">typealias</span> <span class="kt">SDLResponseHandler</span> <span class="o">=</span> <span class="p">(</span><span class="kt"><a href="Classes/SDLRPCRequest.html">SDLRPCRequest</a></span><span class="p">?,</span> <span class="kt"><a href="Classes/SDLRPCResponse.html">SDLRPCResponse</a></span><span class="p">?,</span> <span class="kt">Error</span><span class="p">?)</span> <span class="o">-&gt;</span> <span class="kt">Void</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>request</dt>
+ <dd><p>The request which was sent.</p>
+</dd>
+ <dt>response</dt>
+ <dd><p>The response which was received.</p>
+</dd>
+ <dt>error</dt>
+ <dd><p>If sending the request encountered an error, this parameter will not be nil.</p>
+</dd>
+ </dl>
+
+ <h3 id="section-SDLPermissionRPCName">
+ SDLPermissionRPCName
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLPermissionObserverIdentifier">
+ SDLPermissionObserverIdentifier
+ </h3>
+
+ <p>Undocumented</p>
+
+
+
+
+
+
+ <h3 id="section-SDLPermissionsChangedHandler">
+ SDLPermissionsChangedHandler
+ </h3>
+
+ <p>The PermissionObserver is a block that is passed in to some methods that will be stored and called when specified permissions change.</p>
+
+
+
+ <h4>Objective-C</h4>
+ <pre class="highlight"><code><span class="k">typedef</span> <span class="kt">void</span> <span class="p">(</span><span class="o">^</span><span class="n">SDLPermissionsChangedHandler</span><span class="p">)(</span>
+ <span class="n">NSDictionary</span><span class="o">&lt;</span><span class="n"><a href="Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName">SDLPermissionRPCName</a></span> <span class="o">*</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">*&gt;</span> <span class="o">*</span><span class="n">_Nonnull</span><span class="p">,</span>
+ <span class="n"><a href="Enums/SDLPermissionGroupStatus.html">SDLPermissionGroupStatus</a></span><span class="p">)</span></code></pre>
+
+
+ <h4>Swift</h4>
+ <pre class="highlight"><code><span class="kd">typealias</span> <span class="kt">SDLPermissionsChangedHandler</span> <span class="o">=</span> <span class="p">([</span><span class="kt">String</span> <span class="p">:</span> <span class="kt">NSNumber</span><span class="p">],</span> <span class="kt"><a href="Enums/SDLPermissionGroupStatus.html">SDLPermissionGroupStatus</a></span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Void</span></code></pre>
+
+
+
+ <h4>Parameters</h4>
+ <dl>
+ <dt>change</dt>
+ <dd><p>A dictionary of permission changes containing
+<key
+(String): RPC Name, object(BOOL): YES if the RPC is allowed, NO if it is not allowed></p>
+</dd>
+ <dt>status</dt>
+ <dd><p>The change made to all of the RPCs in the changedDict. Allowed, if all RPCs are now allowed, Disallowed if all RPCs are now disallowed, or Mixed if some are allowed, and some are disallowed</p>
+</dd>
+ </dl>
+
<h3 id="section-SDLStreamingStartBlock">
SDLStreamingStartBlock
</h3>
diff --git a/docs/index.html b/docs/index.html
index c51577768..a8f826003 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1,3 +1,7 @@
+- name: Categories
+ sub_nav:
+ - name: NSNumber(NumberType)
+ url: Categories.html#/c:objc(cy)NSNumber@NumberType
- name: Classes
sub_nav:
- name: SDLAbstractProtocol
@@ -30,6 +34,8 @@
url: Classes/SDLAppInfo.html
- name: SDLAppInterfaceUnregisteredReason
url: Classes/SDLAppInterfaceUnregisteredReason.html
+ - name: SDLArtwork
+ url: Classes/SDLArtwork.html
- name: SDLAudioPassThruCapabilities
url: Classes/SDLAudioPassThruCapabilities.html
- name: SDLAudioStreamingState
@@ -66,6 +72,8 @@
url: Classes/SDLCompassDirection.html
- name: SDLComponentVolumeStatus
url: Classes/SDLComponentVolumeStatus.html
+ - name: SDLConfiguration
+ url: Classes/SDLConfiguration.html
- name: SDLConsoleController
url: Classes/SDLConsoleController.html
- name: SDLCreateInteractionChoiceSet
@@ -132,6 +140,10 @@
url: Classes/SDLEndAudioPassThruResponse.html
- name: SDLEnum
url: Classes/SDLEnum.html
+ - name: SDLFile
+ url: Classes/SDLFile.html
+ - name: SDLFileManager
+ url: Classes/SDLFileManager.html
- name: SDLFileType
url: Classes/SDLFileType.html
- name: SDLFuelCutoffStatus
@@ -192,20 +204,30 @@
url: Classes/SDLLanguage.html
- name: SDLLayoutMode
url: Classes/SDLLayoutMode.html
+ - name: SDLLifecycleConfiguration
+ url: Classes/SDLLifecycleConfiguration.html
- name: SDLListFiles
url: Classes/SDLListFiles.html
- name: SDLListFilesResponse
url: Classes/SDLListFilesResponse.html
+ - name: SDLLockScreenConfiguration
+ url: Classes/SDLLockScreenConfiguration.html
- name: SDLLockScreenStatus
url: Classes/SDLLockScreenStatus.html
+ - name: SDLLockScreenViewController
+ url: Classes/SDLLockScreenViewController.html
- name: SDLMaintenanceModeStatus
url: Classes/SDLMaintenanceModeStatus.html
+ - name: SDLManager
+ url: Classes/SDLManager.html
- name: SDLMediaClockFormat
url: Classes/SDLMediaClockFormat.html
- name: SDLMenuParams
url: Classes/SDLMenuParams.html
- name: SDLMyKey
url: Classes/SDLMyKey.html
+ - name: SDLNotificationConstants
+ url: Classes/SDLNotificationConstants.html
- name: SDLOnAppInterfaceUnregistered
url: Classes/SDLOnAppInterfaceUnregistered.html
- name: SDLOnAudioPassThru
@@ -256,6 +278,8 @@
url: Classes/SDLPerformInteractionResponse.html
- name: SDLPermissionItem
url: Classes/SDLPermissionItem.html
+ - name: SDLPermissionManager
+ url: Classes/SDLPermissionManager.html
- name: SDLPermissionStatus
url: Classes/SDLPermissionStatus.html
- name: SDLPowerModeQualificationStatus
@@ -288,12 +312,16 @@
url: Classes/SDLRPCMessage.html
- name: SDLRPCNotification
url: Classes/SDLRPCNotification.html
+ - name: SDLRPCNotificationNotification
+ url: Classes/SDLRPCNotificationNotification.html
- name: SDLRPCRequest
url: Classes/SDLRPCRequest.html
- name: SDLRPCRequestFactory
url: Classes/SDLRPCRequestFactory.html
- name: SDLRPCResponse
url: Classes/SDLRPCResponse.html
+ - name: SDLRPCResponseNotification
+ url: Classes/SDLRPCResponseNotification.html
- name: SDLRPCStruct
url: Classes/SDLRPCStruct.html
- name: SDLReadDID
@@ -468,28 +496,170 @@
sub_nav:
- name: SDLDefaultScreenSize
url: Constants.html#/c:@SDLDefaultScreenSize
+ - name: SDLDidBecomeReady
+ url: Constants.html#/c:@SDLDidBecomeReady
+ - name: SDLDidChangeDriverDistractionStateNotification
+ url: Constants.html#/c:@SDLDidChangeDriverDistractionStateNotification
+ - name: SDLDidChangeHMIStatusNotification
+ url: Constants.html#/c:@SDLDidChangeHMIStatusNotification
+ - name: SDLDidChangeLanguageNotification
+ url: Constants.html#/c:@SDLDidChangeLanguageNotification
+ - name: SDLDidChangeLockScreenStatusNotification
+ url: Constants.html#/c:@SDLDidChangeLockScreenStatusNotification
+ - name: SDLDidChangePermissionsNotification
+ url: Constants.html#/c:@SDLDidChangePermissionsNotification
+ - name: SDLDidChangeTurnByTurnStateNotification
+ url: Constants.html#/c:@SDLDidChangeTurnByTurnStateNotification
+ - name: SDLDidReceiveAddCommandResponse
+ url: Constants.html#/c:@SDLDidReceiveAddCommandResponse
+ - name: SDLDidReceiveAddSubMenuResponse
+ url: Constants.html#/c:@SDLDidReceiveAddSubMenuResponse
+ - name: SDLDidReceiveAlertManeuverResponse
+ url: Constants.html#/c:@SDLDidReceiveAlertManeuverResponse
+ - name: SDLDidReceiveAlertResponse
+ url: Constants.html#/c:@SDLDidReceiveAlertResponse
+ - name: SDLDidReceiveAppUnregisteredNotification
+ url: Constants.html#/c:@SDLDidReceiveAppUnregisteredNotification
+ - name: SDLDidReceiveAudioPassThruNotification
+ url: Constants.html#/c:@SDLDidReceiveAudioPassThruNotification
+ - name: SDLDidReceiveButtonEventNotification
+ url: Constants.html#/c:@SDLDidReceiveButtonEventNotification
+ - name: SDLDidReceiveButtonPressNotification
+ url: Constants.html#/c:@SDLDidReceiveButtonPressNotification
+ - name: SDLDidReceiveChangeRegistrationResponse
+ url: Constants.html#/c:@SDLDidReceiveChangeRegistrationResponse
+ - name: SDLDidReceiveCommandNotification
+ url: Constants.html#/c:@SDLDidReceiveCommandNotification
+ - name: SDLDidReceiveCreateInteractionChoiceSetResponse
+ url: Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetResponse
+ - name: SDLDidReceiveDeleteCommandResponse
+ url: Constants.html#/c:@SDLDidReceiveDeleteCommandResponse
+ - name: SDLDidReceiveDeleteFileResponse
+ url: Constants.html#/c:@SDLDidReceiveDeleteFileResponse
+ - name: SDLDidReceiveDeleteInteractionChoiceSetResponse
+ url: Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetResponse
+ - name: SDLDidReceiveDeleteSubmenuResponse
+ url: Constants.html#/c:@SDLDidReceiveDeleteSubmenuResponse
+ - name: SDLDidReceiveDiagnosticMessageResponse
+ url: Constants.html#/c:@SDLDidReceiveDiagnosticMessageResponse
+ - name: SDLDidReceiveDialNumberResponse
+ url: Constants.html#/c:@SDLDidReceiveDialNumberResponse
+ - name: SDLDidReceiveEncodedDataNotification
+ url: Constants.html#/c:@SDLDidReceiveEncodedDataNotification
+ - name: SDLDidReceiveEncodedSyncPDataResponse
+ url: Constants.html#/c:@SDLDidReceiveEncodedSyncPDataResponse
+ - name: SDLDidReceiveEndAudioPassThruResponse
+ url: Constants.html#/c:@SDLDidReceiveEndAudioPassThruResponse
+ - name: SDLDidReceiveError
+ url: Constants.html#/c:@SDLDidReceiveError
+ - name: SDLDidReceiveGenericResponse
+ url: Constants.html#/c:@SDLDidReceiveGenericResponse
+ - name: SDLDidReceiveGetDTCsResponse
+ url: Constants.html#/c:@SDLDidReceiveGetDTCsResponse
+ - name: SDLDidReceiveGetVehicleDataResponse
+ url: Constants.html#/c:@SDLDidReceiveGetVehicleDataResponse
+ - name: SDLDidReceiveKeyboardInputNotification
+ url: Constants.html#/c:@SDLDidReceiveKeyboardInputNotification
+ - name: SDLDidReceiveListFilesResponse
+ url: Constants.html#/c:@SDLDidReceiveListFilesResponse
+ - name: SDLDidReceiveLockScreenIcon
+ url: Constants.html#/c:@SDLDidReceiveLockScreenIcon
+ - name: SDLDidReceiveNewHashNotification
+ url: Constants.html#/c:@SDLDidReceiveNewHashNotification
+ - name: SDLDidReceivePerformAudioPassThruResponse
+ url: Constants.html#/c:@SDLDidReceivePerformAudioPassThruResponse
+ - name: SDLDidReceivePerformInteractionResponse
+ url: Constants.html#/c:@SDLDidReceivePerformInteractionResponse
+ - name: SDLDidReceivePutFileResponse
+ url: Constants.html#/c:@SDLDidReceivePutFileResponse
+ - name: SDLDidReceiveReadDIDResponse
+ url: Constants.html#/c:@SDLDidReceiveReadDIDResponse
+ - name: SDLDidReceiveRegisterAppInterfaceResponse
+ url: Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceResponse
+ - name: SDLDidReceiveResetGlobalPropertiesResponse
+ url: Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesResponse
+ - name: SDLDidReceiveScrollableMessageResponse
+ url: Constants.html#/c:@SDLDidReceiveScrollableMessageResponse
+ - name: SDLDidReceiveSendLocationResponse
+ url: Constants.html#/c:@SDLDidReceiveSendLocationResponse
+ - name: SDLDidReceiveSetAppIconResponse
+ url: Constants.html#/c:@SDLDidReceiveSetAppIconResponse
+ - name: SDLDidReceiveSetDisplayLayoutResponse
+ url: Constants.html#/c:@SDLDidReceiveSetDisplayLayoutResponse
+ - name: SDLDidReceiveSetGlobalPropertiesResponse
+ url: Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesResponse
+ - name: SDLDidReceiveSetMediaClockTimerResponse
+ url: Constants.html#/c:@SDLDidReceiveSetMediaClockTimerResponse
+ - name: SDLDidReceiveShowConstantTBTResponse
+ url: Constants.html#/c:@SDLDidReceiveShowConstantTBTResponse
+ - name: SDLDidReceiveShowResponse
+ url: Constants.html#/c:@SDLDidReceiveShowResponse
+ - name: SDLDidReceiveSliderResponse
+ url: Constants.html#/c:@SDLDidReceiveSliderResponse
+ - name: SDLDidReceiveSpeakResponse
+ url: Constants.html#/c:@SDLDidReceiveSpeakResponse
+ - name: SDLDidReceiveSubscribeButtonResponse
+ url: Constants.html#/c:@SDLDidReceiveSubscribeButtonResponse
+ - name: SDLDidReceiveSubscribeVehicleDataResponse
+ url: Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataResponse
+ - name: SDLDidReceiveSyncPDataResponse
+ url: Constants.html#/c:@SDLDidReceiveSyncPDataResponse
+ - name: SDLDidReceiveSystemRequestNotification
+ url: Constants.html#/c:@SDLDidReceiveSystemRequestNotification
+ - name: SDLDidReceiveTouchEventNotification
+ url: Constants.html#/c:@SDLDidReceiveTouchEventNotification
+ - name: SDLDidReceiveUnregisterAppInterfaceResponse
+ url: Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceResponse
+ - name: SDLDidReceiveUnsubscribeButtonResponse
+ url: Constants.html#/c:@SDLDidReceiveUnsubscribeButtonResponse
+ - name: SDLDidReceiveUnsubscribeVehicleDataResponse
+ url: Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataResponse
+ - name: SDLDidReceiveUpdateTurnListResponse
+ url: Constants.html#/c:@SDLDidReceiveUpdateTurnListResponse
+ - name: SDLDidReceiveVehicleDataNotification
+ url: Constants.html#/c:@SDLDidReceiveVehicleDataNotification
+ - name: SDLDidReceiveVehicleIconNotification
+ url: Constants.html#/c:@SDLDidReceiveVehicleIconNotification
- name: SDLErrorDomainStreamingMediaAudio
url: Constants.html#/c:@SDLErrorDomainStreamingMediaAudio
- name: SDLErrorDomainStreamingMediaVideo
url: Constants.html#/c:@SDLErrorDomainStreamingMediaVideo
+ - name: SDLNotificationUserInfoObject
+ url: Constants.html#/c:@SDLNotificationUserInfoObject
- name: SDLProtocolSecurityErrorDomain
url: Constants.html#/c:@SDLProtocolSecurityErrorDomain
+ - name: SDLTransportDidConnect
+ url: Constants.html#/c:@SDLTransportDidConnect
+ - name: SDLTransportDidDisconnect
+ url: Constants.html#/c:@SDLTransportDidDisconnect
- name: SmartDeviceLinkVersionNumber
url: Constants.html#/c:@SmartDeviceLinkVersionNumber
- name: SmartDeviceLinkVersionString
url: Constants.html#/c:@SmartDeviceLinkVersionString
- name: Enums
sub_nav:
+ - name: SDLArtworkImageFormat
+ url: Enums/SDLArtworkImageFormat.html
- name: SDLDebugOutput
url: Enums/SDLDebugOutput.html
- name: SDLDebugType
url: Enums/SDLDebugType.html
- name: SDLEncryptionFlag
url: Enums/SDLEncryptionFlag.html
+ - name: SDLFileManagerError
+ url: Enums/SDLFileManagerError.html
- name: SDLFrameData
url: Enums/SDLFrameData.html
- name: SDLFrameType
url: Enums/SDLFrameType.html
+ - name: SDLLogOutput
+ url: Enums/SDLLogOutput.html
+ - name: SDLManagerError
+ url: Enums/SDLManagerError.html
+ - name: SDLPermissionGroupStatus
+ url: Enums/SDLPermissionGroupStatus.html
+ - name: SDLPermissionGroupType
+ url: Enums/SDLPermissionGroupType.html
- name: SDLProtocolError
url: Enums/SDLProtocolError.html
- name: SDLRPCMessageType
@@ -502,22 +672,60 @@
url: Enums/SDLStreamingVideoError.html
- name: Protocols
sub_nav:
+ - name: SDLBool
+ url: Protocols.html#/c:objc(pl)SDLBool
- name: SDLDebugToolConsole
url: Protocols/SDLDebugToolConsole.html
+ - name: SDLFloat
+ url: Protocols.html#/c:objc(pl)SDLFloat
- name: SDLIAPSessionDelegate
url: Protocols/SDLIAPSessionDelegate.html
+ - name: SDLInt
+ url: Protocols.html#/c:objc(pl)SDLInt
+ - name: SDLManagerDelegate
+ url: Protocols/SDLManagerDelegate.html
- name: SDLProtocolListener
url: Protocols/SDLProtocolListener.html
- name: SDLProxyListener
url: Protocols/SDLProxyListener.html
+ - name: SDLRequestHandler
+ url: Protocols/SDLRequestHandler.html
- name: SDLSecurityType
url: Protocols/SDLSecurityType.html
- name: SDLTouchManagerDelegate
url: Protocols/SDLTouchManagerDelegate.html
- name: SDLTransportDelegate
url: Protocols/SDLTransportDelegate.html
+ - name: SDLUInt
+ url: Protocols.html#/c:objc(pl)SDLUInt
- name: Type Definitions
sub_nav:
+ - name: SDLFileManagerDeleteCompletionHandler
+ url: Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerDeleteCompletionHandler
+ - name: SDLFileManagerListFilesCompletionHandler
+ url: Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerListFilesCompletionHandler
+ - name: SDLFileManagerStartupCompletionHandler
+ url: Type Definitions.html#/c:SDLFileManager.h@T@SDLFileManagerStartupCompletionHandler
+ - name: SDLFileManagerUploadCompletionHandler
+ url: Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadCompletionHandler
+ - name: SDLFileName
+ url: Type Definitions.html#/c:SDLFileManager.h@T@SDLFileName
+ - name: SDLManagerReadyBlock
+ url: Type Definitions.html#/c:SDLManager.h@T@SDLManagerReadyBlock
+ - name: SDLNotificationName
+ url: Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationName
+ - name: SDLNotificationUserInfoKey
+ url: Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationUserInfoKey
+ - name: SDLPermissionObserverIdentifier
+ url: Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionObserverIdentifier
+ - name: SDLPermissionRPCName
+ url: Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName
+ - name: SDLPermissionsChangedHandler
+ url: Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionsChangedHandler
+ - name: SDLRPCNotificationHandler
+ url: Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCNotificationHandler
+ - name: SDLResponseHandler
+ url: Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLResponseHandler
- name: SDLStreamingEncryptionStartBlock
url: Type Definitions.html#/c:SDLStreamingMediaManager.h@T@SDLStreamingEncryptionStartBlock
- name: SDLStreamingStartBlock
diff --git a/docs/undocumented.json b/docs/undocumented.json
index 22b7fd716..3a876a484 100644
--- a/docs/undocumented.json
+++ b/docs/undocumented.json
@@ -1 +1 @@
-{"warnings":[{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":13,"symbol":"SDLAbstractProtocol","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":15,"symbol":"debugConsoleGroupName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":16,"symbol":"transport","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":17,"symbol":"protocolDelegateTable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":18,"symbol":"securityManager","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":19,"symbol":"appId","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":22,"symbol":"-sendStartSessionWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":23,"symbol":"-startServiceWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":24,"symbol":"-startSecureServiceWithType:completionHandler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":25,"symbol":"-sendEndSessionWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":26,"symbol":"-endServiceWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":27,"symbol":"-sendRPC:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":28,"symbol":"-sendRPC:encrypted:error:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":29,"symbol":"-sendRPCRequest:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":30,"symbol":"-sendRawData:withServiceType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":31,"symbol":"-sendEncryptedRawData:onService:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":33,"symbol":"-sendRawDataStream:withServiceType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":34,"symbol":"-sendHeartbeat","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":37,"symbol":"-handleBytesFromTransport:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":38,"symbol":"-dispose","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":7,"symbol":"SDLAbstractTransport","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":9,"symbol":"delegate","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":10,"symbol":"debugConsoleGroupName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":12,"symbol":"-connect","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":13,"symbol":"-disconnect","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":14,"symbol":"-sendData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":15,"symbol":"-dispose","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":16,"symbol":"-retryDelay","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAddCommandResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAddCommandResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAddSubMenuResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAddSubMenuResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":9,"symbol":"SDLAirbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":15,"symbol":"driverAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":16,"symbol":"driverSideAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":17,"symbol":"driverCurtainAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":18,"symbol":"passengerAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":19,"symbol":"passengerCurtainAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":20,"symbol":"driverKneeAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":21,"symbol":"passengerSideAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":22,"symbol":"passengerKneeAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuver.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuver.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuver.h","line":16,"symbol":"ttsChunks","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuver.h","line":17,"symbol":"softButtons","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuverResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuverResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertResponse.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertResponse.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertResponse.h","line":17,"symbol":"tryAgainTime","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":14,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":15,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":17,"symbol":"+NIGHT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":18,"symbol":"+TWILIGHT_1","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":19,"symbol":"+TWILIGHT_2","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":20,"symbol":"+TWILIGHT_3","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":21,"symbol":"+TWILIGHT_4","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":22,"symbol":"+DAY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":23,"symbol":"+UNKNOWN","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":24,"symbol":"+INVALID","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAppHMIType.h","line":80,"symbol":"+BACKGROUND_PROCESS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAppInfo.h","line":6,"symbol":"SDLAppInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAppInfo.h","line":8,"symbol":"appDisplayName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAppInfo.h","line":9,"symbol":"appBundleID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAppInfo.h","line":10,"symbol":"appVersion","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":9,"symbol":"SDLBeltStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":15,"symbol":"driverBeltDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":16,"symbol":"passengerBeltDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":17,"symbol":"passengerBuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":18,"symbol":"driverBuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":19,"symbol":"leftRow2BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":20,"symbol":"passengerChildDetected","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":21,"symbol":"rightRow2BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":22,"symbol":"middleRow2BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":23,"symbol":"middleRow3BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":24,"symbol":"leftRow3BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":25,"symbol":"rightRow3BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":26,"symbol":"leftRearInflatableBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":27,"symbol":"rightRearInflatableBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":28,"symbol":"middleRow1BeltDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":29,"symbol":"middleRow1BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLButtonName.h","line":148,"symbol":"+CUSTOM_BUTTON","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLButtonName.h","line":150,"symbol":"+SEARCH","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCarModeStatus.h","line":13,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCarModeStatus.h","line":15,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLChangeRegistrationResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLChangeRegistrationResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCharacterSet.h","line":31,"symbol":"+TYPE2SET","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCharacterSet.h","line":33,"symbol":"+TYPE5SET","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCharacterSet.h","line":35,"symbol":"+CID1SET","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCharacterSet.h","line":37,"symbol":"+CID2SET","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":11,"symbol":"SDLClusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":17,"symbol":"powerModeActive","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":18,"symbol":"powerModeQualificationStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":19,"symbol":"carModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":20,"symbol":"powerModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":10,"symbol":"SDLConsoleController","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":11,"symbol":"messageList","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":12,"symbol":"atBottom","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":13,"symbol":"dateFormatter","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":16,"symbol":"messageList","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":18,"symbol":"-initWithTableView:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCreateInteractionChoiceSetResponse.h","line":16,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCreateInteractionChoiceSetResponse.h","line":17,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":9,"symbol":"SDLDIDResult","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":15,"symbol":"resultCode","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":16,"symbol":"didLocation","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":17,"symbol":"data","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":11,"symbol":"SDLDebugType","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":12,"symbol":"SDLDebugType_Debug","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":13,"symbol":"SDLDebugType_Transport_iAP","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":14,"symbol":"SDLDebugType_Transport_TCP","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":15,"symbol":"SDLDebugType_Protocol","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":16,"symbol":"SDLDebugType_RPC","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":17,"symbol":"SDLDebugType_APP","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":11,"symbol":"SDLDebugType","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":20,"symbol":"SDLDebugOutput","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":20,"symbol":"SDLDebugOutput","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":21,"symbol":"SDLDebugOutput_All","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":22,"symbol":"SDLDebugOutput_DeviceConsole","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":23,"symbol":"SDLDebugOutput_DebugToolConsole","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":24,"symbol":"SDLDebugOutput_File","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":28,"symbol":"SDLDebugTool","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":31,"symbol":"+addConsole:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":32,"symbol":"+addConsole:toGroup:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":33,"symbol":"+removeConsole:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":34,"symbol":"+removeConsole:fromGroup:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":35,"symbol":"+logInfo:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":36,"symbol":"+logInfo:withType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":37,"symbol":"+logInfo:withType:toOutput:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":38,"symbol":"+logInfo:andBinaryData:withType:toOutput:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":39,"symbol":"+logInfo:withType:toOutput:toGroup:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":41,"symbol":"+enableDebugToLogFile","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":42,"symbol":"+disableDebugToLogFile","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":43,"symbol":"+writeToLogFile:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":45,"symbol":"+stringForDebugType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugToolConsole.h","line":7,"symbol":"SDLDebugToolConsole","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugToolConsole.h","line":10,"symbol":"-logInfo:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteCommandResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteCommandResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteFileResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteFileResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteFileResponse.h","line":18,"symbol":"spaceAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteInteractionChoiceSetResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteInteractionChoiceSetResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteSubMenuResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteSubMenuResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":7,"symbol":"SDLDeviceInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":13,"symbol":"hardware","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":14,"symbol":"firmwareRev","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":15,"symbol":"os","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":16,"symbol":"osVersion","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":17,"symbol":"carrier","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":18,"symbol":"maxNumberRFCOMMPorts","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDiagnosticMessage.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDiagnosticMessage.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDiagnosticMessageResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDiagnosticMessageResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDiagnosticMessageResponse.h","line":16,"symbol":"messageDataResult","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDialNumber.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDialNumber.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDialNumberResponse.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDialNumberResponse.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":38,"symbol":"+TYPE2","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":40,"symbol":"+TYPE5","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":49,"symbol":"+GEN2_8_DMA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":51,"symbol":"+GEN2_6_DMA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":53,"symbol":"+MFD3","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":55,"symbol":"+MFD4","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":57,"symbol":"+MFD5","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":59,"symbol":"+GEN3_8_INCH","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallConfirmationStatus.h","line":14,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallConfirmationStatus.h","line":15,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":10,"symbol":"SDLECallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":16,"symbol":"eCallNotificationStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":17,"symbol":"auxECallNotificationStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":18,"symbol":"eCallConfirmationStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":11,"symbol":"SDLEmergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":17,"symbol":"emergencyEventType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":18,"symbol":"fuelCutoffStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":19,"symbol":"rolloverEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":20,"symbol":"maximumChangeVelocity","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":21,"symbol":"multipleEvents","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEventType.h","line":15,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEventType.h","line":16,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPData.h","line":7,"symbol":"SDLEncodedSyncPData","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPData.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPData.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPData.h","line":13,"symbol":"data","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPDataResponse.h","line":7,"symbol":"SDLEncodedSyncPDataResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPDataResponse.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPDataResponse.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEndAudioPassThruResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEndAudioPassThruResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEnum.h","line":8,"symbol":"SDLEnum","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEnum.h","line":9,"symbol":"value","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEnum.h","line":12,"symbol":"-initWithValue:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEnum.h","line":14,"symbol":"-isEqualToEnum:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEnum.h","line":16,"symbol":"value","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGenericResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGenericResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetDTCsResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetDTCsResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetDTCsResponse.h","line":18,"symbol":"ecuHeader","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetDTCsResponse.h","line":19,"symbol":"dtc","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleData.h","line":134,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleData.h","line":135,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleData.h","line":136,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleData.h","line":137,"symbol":"clusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleData.h","line":138,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleDataResponse.h","line":144,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleDataResponse.h","line":145,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleDataResponse.h","line":146,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleDataResponse.h","line":147,"symbol":"clusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleDataResponse.h","line":148,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGlobalProperty.h","line":40,"symbol":"+VRHELPTITLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGlobalProperty.h","line":42,"symbol":"+VRHELPITEMS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGlobalProperty.h","line":44,"symbol":"+MENUNAME","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGlobalProperty.h","line":46,"symbol":"+MENUICON","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGlobalProperty.h","line":48,"symbol":"+KEYBOARDPROPERTIES","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLHMICapabilities.h","line":7,"symbol":"SDLHMICapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLHMICapabilities.h","line":9,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLHMICapabilities.h","line":10,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLHeadLampStatus.h","line":32,"symbol":"ambientLightSensorStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPSessionDelegate.h","line":8,"symbol":"SDLIAPSessionDelegate","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPSessionDelegate.h","line":10,"symbol":"-onSessionInitializationCompleteForSession:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPSessionDelegate.h","line":11,"symbol":"-onSessionStreamsEnded:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPTransport.h","line":10,"symbol":"SDLIAPTransport","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPTransport.h","line":12,"symbol":"controlSession","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPTransport.h","line":13,"symbol":"session","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIgnitionStableStatus.h","line":40,"symbol":"+MISSING_FROM_TRANSMITTER","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":10,"symbol":"SDLImageField","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":16,"symbol":"name","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":17,"symbol":"imageTypeSupported","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":18,"symbol":"imageResolution","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageFieldName.h","line":16,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageFieldName.h","line":17,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageResolution.h","line":7,"symbol":"SDLImageResolution","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageResolution.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageResolution.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageResolution.h","line":13,"symbol":"resolutionWidth","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageResolution.h","line":14,"symbol":"resolutionHeight","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":7,"symbol":"SDLJingle","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":10,"symbol":"+NEGATIVE_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":11,"symbol":"+POSITIVE_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":12,"symbol":"+LISTEN_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":13,"symbol":"+INITIAL_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":14,"symbol":"+HELP_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardEvent.h","line":15,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardEvent.h","line":16,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardLayout.h","line":15,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardLayout.h","line":16,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":11,"symbol":"SDLKeyboardProperties","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":17,"symbol":"language","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":18,"symbol":"keyboardLayout","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":19,"symbol":"keypressMode","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":20,"symbol":"limitedCharacterList","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":21,"symbol":"autoCompleteText","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeypressMode.h","line":17,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeypressMode.h","line":18,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLanguage.h","line":33,"symbol":"+EN_US","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLayoutMode.h","line":15,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLayoutMode.h","line":16,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLListFilesResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLListFilesResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLListFilesResponse.h","line":18,"symbol":"filenames","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLListFilesResponse.h","line":19,"symbol":"spaceAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLockScreenStatus.h","line":9,"symbol":"SDLLockScreenStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLockScreenStatus.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLockScreenStatus.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMyKey.h","line":9,"symbol":"SDLMyKey","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMyKey.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMyKey.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMyKey.h","line":15,"symbol":"e911Override","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":7,"symbol":"SDLOnEncodedSyncPData","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":13,"symbol":"data","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":14,"symbol":"URL","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":15,"symbol":"Timeout","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnHashChange.h","line":7,"symbol":"SDLOnHashChange","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnHashChange.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnHashChange.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnHashChange.h","line":13,"symbol":"hashID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnKeyboardInput.h","line":9,"symbol":"SDLOnKeyboardInput","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnKeyboardInput.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnKeyboardInput.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnKeyboardInput.h","line":15,"symbol":"event","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnKeyboardInput.h","line":16,"symbol":"data","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnLockScreenStatus.h","line":22,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnLockScreenStatus.h","line":23,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSyncPData.h","line":7,"symbol":"SDLOnSyncPData","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSyncPData.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSyncPData.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSyncPData.h","line":13,"symbol":"URL","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSyncPData.h","line":14,"symbol":"Timeout","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":10,"symbol":"SDLOnSystemRequest","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":16,"symbol":"requestType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":17,"symbol":"url","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":18,"symbol":"timeout","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":19,"symbol":"fileType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":20,"symbol":"offset","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":21,"symbol":"length","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTBTClientState.h","line":9,"symbol":"SDLOnTBTClientState","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTBTClientState.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTBTClientState.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTBTClientState.h","line":15,"symbol":"state","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTouchEvent.h","line":9,"symbol":"SDLOnTouchEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTouchEvent.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTouchEvent.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTouchEvent.h","line":15,"symbol":"type","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTouchEvent.h","line":16,"symbol":"event","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnVehicleData.h","line":143,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnVehicleData.h","line":144,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnVehicleData.h","line":145,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnVehicleData.h","line":146,"symbol":"clusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnVehicleData.h","line":147,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPerformInteraction.h","line":83,"symbol":"interactionLayout","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":10,"symbol":"SDLPermissionItem","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":16,"symbol":"rpcName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":17,"symbol":"hmiPermissions","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":18,"symbol":"parameterPermissions","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":7,"symbol":"SDLPowerModeQualificationStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":13,"symbol":"+POWER_MODE_UNDEFINED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":14,"symbol":"+POWER_MODE_EVALUATION_IN_PROGRESS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":15,"symbol":"+NOT_DEFINED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":16,"symbol":"+POWER_MODE_OK","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":7,"symbol":"SDLPowerModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":13,"symbol":"+KEY_OUT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":14,"symbol":"+KEY_RECENTLY_OUT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":15,"symbol":"+KEY_APPROVED_0","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":16,"symbol":"+POST_ACCESORY_0","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":17,"symbol":"+ACCESORY_1","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":18,"symbol":"+POST_IGNITION_1","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":19,"symbol":"+IGNITION_ON_2","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":20,"symbol":"+RUNNING_2","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":21,"symbol":"+CRANK_3","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":7,"symbol":"SDLPredefinedLayout","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":13,"symbol":"+DEFAULT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":14,"symbol":"+MEDIA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":15,"symbol":"+NON_MEDIA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":16,"symbol":"+ONSCREEN_PRESETS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":17,"symbol":"+NAV_FULLSCREEN_MAP","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":18,"symbol":"+NAV_LIST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":19,"symbol":"+NAV_KEYBOARD","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":20,"symbol":"+GRAPHIC_WITH_TEXT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":21,"symbol":"+TEXT_WITH_GRAPHIC","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":22,"symbol":"+TILES_ONLY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":23,"symbol":"+TEXTBUTTONS_ONLY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":24,"symbol":"+GRAPHIC_WITH_TILES","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":25,"symbol":"+TILES_WITH_GRAPHIC","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":26,"symbol":"+GRAPHIC_WITH_TEXT_AND_SOFTBUTTONS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":27,"symbol":"+TEXT_AND_SOFTBUTTONS_WITH_GRAPHIC","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":28,"symbol":"+GRAPHIC_WITH_TEXTBUTTONS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":29,"symbol":"+TEXTBUTTONS_WITH_GRAPHIC","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":30,"symbol":"+LARGE_GRAPHIC_WITH_SOFTBUTTONS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":31,"symbol":"+DOUBLE_GRAPHIC_WITH_SOFTBUTTONS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":32,"symbol":"+LARGE_GRAPHIC_ONLY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":7,"symbol":"SDLPrerecordedSpeech","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":13,"symbol":"+HELP_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":14,"symbol":"+INITIAL_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":15,"symbol":"+LISTEN_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":16,"symbol":"+POSITIVE_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":17,"symbol":"+NEGATIVE_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":8,"symbol":"SDLProtocolError","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":8,"symbol":"SDLProtocolError","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":9,"symbol":"SDLProtocolErrorNoSecurityManager","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":12,"symbol":"SDLProtocolSecurityErrorDomain","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":14,"symbol":"SDLProtocol","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":17,"symbol":"-sendStartSessionWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":18,"symbol":"-startServiceWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":19,"symbol":"-startSecureServiceWithType:completionHandler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":20,"symbol":"-sendEndSessionWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":21,"symbol":"-endServiceWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":22,"symbol":"-sendRPC:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":23,"symbol":"-sendRPC:encrypted:error:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":24,"symbol":"-sendRPCRequest:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":25,"symbol":"-sendRawData:withServiceType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":26,"symbol":"-sendEncryptedRawData:onService:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":29,"symbol":"-handleBytesFromTransport:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":7,"symbol":"SDLFrameType","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":8,"symbol":"SDLFrameType_Control","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":9,"symbol":"SDLFrameType_Single","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":10,"symbol":"SDLFrameType_First","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":11,"symbol":"SDLFrameType_Consecutive","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":7,"symbol":"SDLFrameType","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":14,"symbol":"SDLServiceType","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":14,"symbol":"SDLServiceType","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":15,"symbol":"SDLServiceType_Control","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":16,"symbol":"SDLServiceType_RPC","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":17,"symbol":"SDLServiceType_Audio","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":18,"symbol":"SDLServiceType_Video","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":19,"symbol":"SDLServiceType_BulkData","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":22,"symbol":"SDLFrameData","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":22,"symbol":"SDLFrameData","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":23,"symbol":"SDLFrameData_Heartbeat","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":24,"symbol":"SDLFrameData_StartSession","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":25,"symbol":"SDLFrameData_StartSessionACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":26,"symbol":"SDLFrameData_StartSessionNACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":27,"symbol":"SDLFrameData_EndSession","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":28,"symbol":"SDLFrameData_EndSessionACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":29,"symbol":"SDLFrameData_EndSessionNACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":30,"symbol":"SDLFrameData_ServiceDataACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":31,"symbol":"SDLFrameData_HeartbeatACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":33,"symbol":"SDLFrameData_SingleFrame","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":35,"symbol":"SDLFrameData_FirstFrame","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":37,"symbol":"SDLFrameData_ConsecutiveLastFrame","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":41,"symbol":"SDLProtocolHeader","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":42,"symbol":"_version","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":43,"symbol":"_size","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":46,"symbol":"version","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":47,"symbol":"size","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":48,"symbol":"compressed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":49,"symbol":"encrypted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":50,"symbol":"frameType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":51,"symbol":"serviceType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":52,"symbol":"frameData","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":53,"symbol":"sessionID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":54,"symbol":"bytesInPayload","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":56,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":57,"symbol":"-data","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":58,"symbol":"-parse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":59,"symbol":"-description","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":60,"symbol":"+headerForVersion:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":9,"symbol":"SDLProtocolListener","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":12,"symbol":"-handleProtocolStartSessionACK:sessionID:version:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":13,"symbol":"-handleProtocolStartSessionACK:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":14,"symbol":"-handleProtocolStartSessionNACK:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":15,"symbol":"-handleProtocolEndSessionACK:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":16,"symbol":"-handleProtocolEndSessionNACK:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":17,"symbol":"-handleHeartbeatForSession:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":18,"symbol":"-handleHeartbeatACK","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":19,"symbol":"-onProtocolMessageReceived:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":20,"symbol":"-onProtocolOpened","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":21,"symbol":"-onProtocolClosed","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":22,"symbol":"-onError:exception:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":8,"symbol":"SDLProtocolMessage","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":10,"symbol":"header","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":11,"symbol":"payload","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":12,"symbol":"data","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":14,"symbol":"+messageWithHeader:andPayload:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":16,"symbol":"-size","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":17,"symbol":"-description","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":18,"symbol":"-rpcDictionary","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":20,"symbol":"+determineVersion:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":18,"symbol":"SDLProxy","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":19,"symbol":"_version","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":20,"symbol":"_bulkSessionID","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":21,"symbol":"_isConnected","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":22,"symbol":"_alreadyDestructed","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":25,"symbol":"protocol","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":26,"symbol":"transport","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":27,"symbol":"proxyListeners","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":28,"symbol":"startSessionTimer","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":29,"symbol":"debugConsoleGroupName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":30,"symbol":"proxyVersion","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":31,"symbol":"streamingMediaManager","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":33,"symbol":"-initWithTransport:protocol:delegate:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":36,"symbol":"-dispose","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":38,"symbol":"-addDelegate:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":39,"symbol":"-removeDelegate:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":41,"symbol":"-sendRPC:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":42,"symbol":"-sendRPCRequest:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":44,"symbol":"-handleRPCDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":45,"symbol":"-handleRpcMessage:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":47,"symbol":"-handleProtocolMessage:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":49,"symbol":"-addSecurityManagers:forAppId:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":51,"symbol":"+enableSiphonDebug","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":52,"symbol":"+disableSiphonDebug","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyFactory.h","line":11,"symbol":"SDLProxyFactory","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyFactory.h","line":14,"symbol":"+buildSDLProxyWithListener:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyFactory.h","line":16,"symbol":"+buildSDLProxyWithListener:tcpIPAddress:tcpPort:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":67,"symbol":"SDLProxyListener","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":69,"symbol":"-onOnDriverDistraction:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":70,"symbol":"-onOnHMIStatus:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":71,"symbol":"-onProxyClosed","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":72,"symbol":"-onProxyOpened","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":76,"symbol":"-onAddCommandResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":77,"symbol":"-onAddSubMenuResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":78,"symbol":"-onAlertManeuverResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":79,"symbol":"-onAlertResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":80,"symbol":"-onChangeRegistrationResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":81,"symbol":"-onCreateInteractionChoiceSetResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":82,"symbol":"-onDeleteCommandResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":83,"symbol":"-onDeleteFileResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":84,"symbol":"-onDeleteInteractionChoiceSetResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":85,"symbol":"-onDeleteSubMenuResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":86,"symbol":"-onDiagnosticMessageResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":87,"symbol":"-onDialNumberResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":88,"symbol":"-onEncodedSyncPDataResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":89,"symbol":"-onEndAudioPassThruResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":90,"symbol":"-onError:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":91,"symbol":"-onGenericResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":92,"symbol":"-onGetDTCsResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":93,"symbol":"-onGetVehicleDataResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":94,"symbol":"-onListFilesResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":95,"symbol":"-onReceivedLockScreenIcon:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":96,"symbol":"-onOnAppInterfaceUnregistered:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":97,"symbol":"-onOnAudioPassThru:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":98,"symbol":"-onOnButtonEvent:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":99,"symbol":"-onOnButtonPress:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":100,"symbol":"-onOnCommand:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":101,"symbol":"-onOnEncodedSyncPData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":102,"symbol":"-onOnHashChange:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":103,"symbol":"-onOnLanguageChange:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":104,"symbol":"-onOnLockScreenNotification:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":105,"symbol":"-onOnPermissionsChange:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":106,"symbol":"-onOnSyncPData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":107,"symbol":"-onOnSystemRequest:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":108,"symbol":"-onOnTBTClientState:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":109,"symbol":"-onOnTouchEvent:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":110,"symbol":"-onOnVehicleData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":111,"symbol":"-onPerformAudioPassThruResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":112,"symbol":"-onPerformInteractionResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":113,"symbol":"-onPutFileResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":114,"symbol":"-onReadDIDResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":115,"symbol":"-onRegisterAppInterfaceResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":116,"symbol":"-onResetGlobalPropertiesResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":117,"symbol":"-onScrollableMessageResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":118,"symbol":"-onSendLocationResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":119,"symbol":"-onSetAppIconResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":120,"symbol":"-onSetDisplayLayoutResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":121,"symbol":"-onSetGlobalPropertiesResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":122,"symbol":"-onSetMediaClockTimerResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":123,"symbol":"-onShowConstantTBTResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":124,"symbol":"-onShowResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":125,"symbol":"-onSliderResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":126,"symbol":"-onSpeakResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":127,"symbol":"-onSubscribeButtonResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":128,"symbol":"-onSubscribeVehicleDataResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":129,"symbol":"-onSyncPDataResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":130,"symbol":"-onUpdateTurnListResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":131,"symbol":"-onUnregisterAppInterfaceResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":132,"symbol":"-onUnsubscribeButtonResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":133,"symbol":"-onUnsubscribeVehicleDataResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPutFileResponse.h","line":23,"symbol":"spaceAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":8,"symbol":"SDLRPCMessage","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":9,"symbol":"function","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":10,"symbol":"parameters","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":11,"symbol":"messageType","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":14,"symbol":"-initWithName:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":16,"symbol":"-getFunctionName","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":17,"symbol":"-setFunctionName:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":18,"symbol":"-getParameters:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":19,"symbol":"-setParameters:value:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":21,"symbol":"bulkData","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":22,"symbol":"name","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":23,"symbol":"messageType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h","line":6,"symbol":"SDLRPCMessageType","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h","line":6,"symbol":"SDLRPCMessageType","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h","line":7,"symbol":"SDLRPCMessageTypeRequest","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h","line":8,"symbol":"SDLRPCMessageTypeResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h","line":9,"symbol":"SDLRPCMessageTypeNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCNotification.h","line":7,"symbol":"SDLRPCNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCNotification.h","line":10,"symbol":"-initWithName:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCNotification.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequest.h","line":7,"symbol":"SDLRPCRequest","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequest.h","line":10,"symbol":"correlationID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":57,"symbol":"SDLRPCRequestFactory","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":61,"symbol":"+buildAddCommandWithID:menuName:parentID:position:vrCommands:iconValue:iconType:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":63,"symbol":"+buildAddCommandWithID:menuName:vrCommands:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":65,"symbol":"+buildAddCommandWithID:vrCommands:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":70,"symbol":"+buildAddSubMenuWithID:menuName:position:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":72,"symbol":"+buildAddSubMenuWithID:menuName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":77,"symbol":"+buildAlertWithTTS:alertText1:alertText2:alertText3:playTone:duration:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":79,"symbol":"+buildAlertWithTTS:alertText1:alertText2:playTone:duration:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":81,"symbol":"+buildAlertWithTTS:playTone:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":85,"symbol":"+buildAlertWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":87,"symbol":"+buildAlertWithTTSChunks:playTone:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":90,"symbol":"+buildAlertWithAlertText1:alertText2:alertText3:duration:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":92,"symbol":"+buildAlertWithAlertText1:alertText2:alertText3:duration:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":94,"symbol":"+buildAlertWithAlertText1:alertText2:duration:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":97,"symbol":"+buildAlertManeuverwithTTSchunks:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":99,"symbol":"+buildChangeRegistrationWithLanguage:hmiDisplayLanguage:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":101,"symbol":"+buildCreateInteractionChoiceSetWithID:choiceSet:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":103,"symbol":"+buildDeleteCommandWithID:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":105,"symbol":"+buildDeleteFileWithName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":107,"symbol":"+buildDialNumberWithNumber:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":109,"symbol":"+buildListFilesWithCorrelationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":111,"symbol":"+buildDeleteInteractionChoiceSetWithID:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":113,"symbol":"+buildDeleteSubMenuWithID:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":115,"symbol":"+buildEndAudioPassThruWithCorrelationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":117,"symbol":"+buildGetDTCsWithECUName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":119,"symbol":"+buildGetVehicleDataWithGPS:speed:rpm:fuelLevel:fuelLevelState:instantFuelConsumption:externalTemperature:vin:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":121,"symbol":"+buildPerformAudioPassThruWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:maxDuration:bitsPerSample:audioType:muteAudio:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":125,"symbol":"+buildPerformInteractionWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":128,"symbol":"+buildPerformInteractionWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":130,"symbol":"+buildPerformInteractionWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":132,"symbol":"+buildPerformInteractionWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":134,"symbol":"+buildPerformInteractionWithInitialPrompt:initialText:interactionChoiceSetID:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":137,"symbol":"+buildPutFileWithFileName:fileType:persistentFile:correlationId:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":138,"symbol":"+buildPutFileWithFileName:fileType:persisistentFile:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":140,"symbol":"+buildReadDIDWithECUName:didLocation:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":143,"symbol":"+buildRegisterAppInterfaceWithAppName:ttsName:vrSynonyms:isMediaApp:languageDesired:hmiDisplayLanguageDesired:appID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":145,"symbol":"+buildRegisterAppInterfaceWithAppName:isMediaApp:languageDesired:appID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":147,"symbol":"+buildRegisterAppInterfaceWithAppName:languageDesired:appID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":150,"symbol":"+buildResetGlobalPropertiesWithProperties:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":152,"symbol":"+buildSendLocationWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":154,"symbol":"+buildScrollableMessage:timeout:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":156,"symbol":"+buildSetAppIconWithFileName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":158,"symbol":"+buildSetDisplayLayout:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":162,"symbol":"+buildSetGlobalPropertiesWithHelpText:timeoutText:vrHelpTitle:vrHelp:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":164,"symbol":"+buildSetGlobalPropertiesWithHelpText:timeoutText:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":169,"symbol":"+buildSetMediaClockTimerWithHours:minutes:seconds:updateMode:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":171,"symbol":"+buildSetMediaClockTimerWithUpdateMode:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":176,"symbol":"+buildShowWithMainField1:mainField2:mainField3:mainField4:statusBar:mediaClock:mediaTrack:alignment:graphic:softButtons:customPresets:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":178,"symbol":"+buildShowWithMainField1:mainField2:statusBar:mediaClock:mediaTrack:alignment:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":180,"symbol":"+buildShowWithMainField1:mainField2:alignment:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":185,"symbol":"+buildSliderDynamicFooterWithNumTicks:position:sliderHeader:sliderFooter:timeout:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":187,"symbol":"+buildSliderStaticFooterWithNumTicks:position:sliderHeader:sliderFooter:timeout:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":191,"symbol":"+buildSpeakWithTTSChunks:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":194,"symbol":"+buildSpeakWithTTS:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":197,"symbol":"+buildSubscribeButtonWithName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":199,"symbol":"+buildSubscribeVehicleDataWithGPS:speed:rpm:fuelLevel:fuelLevelState:instantFuelConsumption:externalTemperature:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":201,"symbol":"+buildShowConstantTBTWithString:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":203,"symbol":"+buildUnregisterAppInterfaceWithCorrelationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":205,"symbol":"+buildUnsubscribeButtonWithName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":207,"symbol":"+buildUnsubscribeVehicleDataWithGPS:speed:rpm:fuelLevel:fuelLevelState:instantFuelConsumption:externalTemperature:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":209,"symbol":"+buildUpdateTurnListWithTurnList:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponse.h","line":9,"symbol":"SDLRPCResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponse.h","line":12,"symbol":"correlationID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponse.h","line":13,"symbol":"success","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponse.h","line":14,"symbol":"resultCode","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponse.h","line":15,"symbol":"info","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h","line":7,"symbol":"SDLRPCStruct","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h","line":8,"symbol":"store","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h","line":14,"symbol":"-serializeAsDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLReadDIDResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLReadDIDResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLReadDIDResponse.h","line":18,"symbol":"didResult","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":7,"symbol":"SDLRequestType","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":13,"symbol":"+HTTP","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":14,"symbol":"+FILE_RESUME","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":15,"symbol":"+AUTH_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":16,"symbol":"+AUTH_CHALLENGE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":17,"symbol":"+AUTH_ACK","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":18,"symbol":"+PROPRIETARY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":19,"symbol":"+QUERY_APPS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":20,"symbol":"+LAUNCH_APP","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":21,"symbol":"+LOCK_SCREEN_ICON_URL","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":22,"symbol":"+TRAFFIC_MESSAGE_CHANNEL","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":23,"symbol":"+DRIVER_PROFILE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":24,"symbol":"+VOICE_SEARCH","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":25,"symbol":"+NAVIGATION","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":26,"symbol":"+PHONE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":27,"symbol":"+CLIMATE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":28,"symbol":"+SETTINGS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":29,"symbol":"+VEHICLE_DIAGNOSTICS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":30,"symbol":"+EMERGENCY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":31,"symbol":"+MEDIA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":32,"symbol":"+FOTA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLResult.h","line":46,"symbol":"+CHAR_LIMIT_EXCEEDED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenParams.h","line":10,"symbol":"SDLScreenParams","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenParams.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenParams.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenParams.h","line":16,"symbol":"resolution","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenParams.h","line":17,"symbol":"touchEventAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":13,"symbol":"SDLSecurityType","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":15,"symbol":"-initializeWithAppId:completionHandler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":16,"symbol":"-stop","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":18,"symbol":"-runHandshakeWithClientData:error:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":20,"symbol":"-encryptData:withError:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":21,"symbol":"-decryptData:withError:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":23,"symbol":"+availableMakes","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocation.h","line":11,"symbol":"SDLSendLocation","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocation.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocation.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocationResponse.h","line":7,"symbol":"SDLSendLocationResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocationResponse.h","line":9,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocationResponse.h","line":10,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetAppIconResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetAppIconResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetDisplayLayoutResponse.h","line":22,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetDisplayLayoutResponse.h","line":24,"symbol":"displayCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetDisplayLayoutResponse.h","line":25,"symbol":"buttonCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetDisplayLayoutResponse.h","line":26,"symbol":"softButtonCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetDisplayLayoutResponse.h","line":27,"symbol":"presetBankCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetGlobalProperties.h","line":92,"symbol":"menuTitle","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetGlobalProperties.h","line":93,"symbol":"menuIcon","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetGlobalProperties.h","line":94,"symbol":"keyboardProperties","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":18,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":19,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":21,"symbol":"navigationText1","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":22,"symbol":"navigationText2","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":23,"symbol":"eta","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":24,"symbol":"timeToDestination","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":25,"symbol":"totalDistance","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":26,"symbol":"turnIcon","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":27,"symbol":"nextTurnIcon","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":28,"symbol":"distanceToManeuver","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":29,"symbol":"distanceToManeuverScale","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":30,"symbol":"maneuverComplete","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":31,"symbol":"softButtons","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBTResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBTResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":7,"symbol":"SDLSiphonServer","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":10,"symbol":"+enableSiphonDebug","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":11,"symbol":"+disableSiphonDebug","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":12,"symbol":"+_siphonRawTransportDataFromApp:msgBytesLength:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":13,"symbol":"+_siphonRawTransportDataFromSDL:msgBytesLength:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":14,"symbol":"+_siphonNSLogData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":15,"symbol":"+_siphonFormattedTraceData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":16,"symbol":"+_siphonIsActive","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":17,"symbol":"+init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":18,"symbol":"+dealloc","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":11,"symbol":"SDLSoftButton","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":17,"symbol":"type","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":18,"symbol":"text","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":19,"symbol":"image","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":20,"symbol":"isHighlighted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":21,"symbol":"softButtonID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":22,"symbol":"systemAction","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSpeechCapabilities.h","line":12,"symbol":"SDLSpeechCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSpeechCapabilities.h","line":38,"symbol":"+SAPI_PHONEMES","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSpeechCapabilities.h","line":40,"symbol":"+LHPLUS_PHONEMES","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSpeechCapabilities.h","line":42,"symbol":"+PRE_RECORDED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSpeechCapabilities.h","line":44,"symbol":"+SILENCE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":21,"symbol":"SDLStreamingVideoError","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":22,"symbol":"SDLStreamingVideoErrorHeadUnitNACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":23,"symbol":"SDLSTreamingVideoErrorInvalidOperatingSystemVersion","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":24,"symbol":"SDLStreamingVideoErrorInvalidOperatingSystemVersion","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":25,"symbol":"SDLStreamingVideoErrorConfigurationCompressionSessionCreationFailure","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":26,"symbol":"SDLStreamingVideoErrorConfigurationAllocationFailure","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":27,"symbol":"SDLStreamingVideoErrorConfigurationCompressionSessionSetPropertyFailure","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":21,"symbol":"SDLStreamingVideoError","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":30,"symbol":"SDLEncryptionFlag","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":31,"symbol":"SDLEncryptionFlagNone","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":32,"symbol":"SDLEncryptionFlagAuthenticateOnly","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":33,"symbol":"SDLEncryptionFlagAuthenticateAndEncrypt","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":30,"symbol":"SDLEncryptionFlag","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":36,"symbol":"SDLStreamingAudioError","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":37,"symbol":"SDLStreamingAudioErrorHeadUnitNACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":36,"symbol":"SDLStreamingAudioError","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":40,"symbol":"SDLErrorDomainStreamingMediaVideo","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":41,"symbol":"SDLErrorDomainStreamingMediaAudio","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":43,"symbol":"SDLDefaultScreenSize","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":45,"symbol":"SDLStreamingStartBlock","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":46,"symbol":"SDLStreamingEncryptionStartBlock","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":51,"symbol":"SDLStreamingMediaManager","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":53,"symbol":"videoSessionConnected","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":54,"symbol":"audioSessionConnected","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":56,"symbol":"videoSessionEncrypted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":57,"symbol":"audioSessionEncrypted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":97,"symbol":"-initWithProtocol:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":99,"symbol":"-initWithProtocol:displayCapabilities:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":140,"symbol":"-startAudioSessionWithTLS:startBlock:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleData.h","line":133,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleData.h","line":134,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleData.h","line":135,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleData.h","line":136,"symbol":"clusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleData.h","line":137,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h","line":124,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h","line":125,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h","line":126,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h","line":127,"symbol":"clusterModes","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h","line":128,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPData.h","line":7,"symbol":"SDLSyncPData","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPData.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPData.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPDataResponse.h","line":7,"symbol":"SDLSyncPDataResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPDataResponse.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPDataResponse.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":7,"symbol":"SDLTBTState","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":13,"symbol":"+ROUTE_UPDATE_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":14,"symbol":"+ROUTE_ACCEPTED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":15,"symbol":"+ROUTE_REFUSED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":16,"symbol":"+ROUTE_CANCELLED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":17,"symbol":"+ETA_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":18,"symbol":"+NEXT_TURN_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":19,"symbol":"+ROUTE_STATUS_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":20,"symbol":"+ROUTE_SUMMARY_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":21,"symbol":"+TRIP_STATUS_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":22,"symbol":"+ROUTE_UPDATE_REQUEST_TIMEOUT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTCPTransport.h","line":6,"symbol":"SDLTCPTransport","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTCPTransport.h","line":7,"symbol":"socket","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTCPTransport.h","line":10,"symbol":"hostName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTCPTransport.h","line":11,"symbol":"portNumber","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTTSChunkFactory.h","line":10,"symbol":"SDLTTSChunkFactory","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTTSChunkFactory.h","line":13,"symbol":"+buildTTSChunkForString:type:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTTSChunkFactory.h","line":14,"symbol":"+buildTTSChunksFromSimple:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":7,"symbol":"SDLTimerMode","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":13,"symbol":"+UP","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":14,"symbol":"+DOWN","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":15,"symbol":"+NONE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":10,"symbol":"SDLTireStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":16,"symbol":"pressureTelltale","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":17,"symbol":"leftFront","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":18,"symbol":"rightFront","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":19,"symbol":"leftRear","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":20,"symbol":"rightRear","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":21,"symbol":"innerLeftRear","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":22,"symbol":"innerRightRear","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchCoord.h","line":7,"symbol":"SDLTouchCoord","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchCoord.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchCoord.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchCoord.h","line":13,"symbol":"x","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchCoord.h","line":14,"symbol":"y","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEvent.h","line":7,"symbol":"SDLTouchEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEvent.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEvent.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":7,"symbol":"SDLTouchEventCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":13,"symbol":"pressAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":14,"symbol":"multiTouchAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":15,"symbol":"doublePressAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchManager.h","line":14,"symbol":"SDLTouchManager","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchManager.h","line":16,"symbol":"touchEventDelegate","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchManagerDelegate.h","line":15,"symbol":"SDLTouchManagerDelegate","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":7,"symbol":"SDLTouchType","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":13,"symbol":"+BEGIN","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":14,"symbol":"+MOVE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":15,"symbol":"+END","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTransportDelegate.h","line":4,"symbol":"SDLTransportDelegate","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTransportDelegate.h","line":6,"symbol":"-onTransportConnected","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTransportDelegate.h","line":7,"symbol":"-onTransportDisconnected","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTransportDelegate.h","line":8,"symbol":"-onDataReceived:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTurn.h","line":9,"symbol":"SDLTurn","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTurn.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTurn.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTurn.h","line":15,"symbol":"navigationText","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTurn.h","line":16,"symbol":"turnIcon","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":123,"symbol":"steeringWheelAngle","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":124,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":125,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":126,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":127,"symbol":"clusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":128,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h","line":123,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h","line":124,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h","line":125,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h","line":126,"symbol":"clusterModes","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h","line":127,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUpdateTurnList.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUpdateTurnList.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUpdateTurnListResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUpdateTurnListResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":9,"symbol":"SDLVRHelpItem","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":15,"symbol":"text","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":16,"symbol":"image","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":17,"symbol":"position","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVehicleDataResult.h","line":10,"symbol":"SDLVehicleDataResult","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVehicleDataResult.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVehicleDataResult.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVehicleDataResult.h","line":16,"symbol":"dataType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVehicleDataResult.h","line":17,"symbol":"resultCode","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SmartDeviceLink.h","line":7,"symbol":"SmartDeviceLinkVersionNumber","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SmartDeviceLink.h","line":10,"symbol":"SmartDeviceLinkVersionString","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"}],"source_directory":"/Users/joel/Projects/SDL/sdl_ios"} \ No newline at end of file
+{"warnings":[{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/NSNumber+NumberType.h","line":35,"symbol":"NSNumber(NumberType)","symbol_kind":"sourcekitten.source.lang.objc.decl.category","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":13,"symbol":"SDLAbstractProtocol","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":15,"symbol":"debugConsoleGroupName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":16,"symbol":"transport","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":17,"symbol":"protocolDelegateTable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":18,"symbol":"securityManager","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":19,"symbol":"appId","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":22,"symbol":"-sendStartSessionWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":23,"symbol":"-startServiceWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":24,"symbol":"-startSecureServiceWithType:completionHandler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":25,"symbol":"-sendEndSessionWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":26,"symbol":"-endServiceWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":27,"symbol":"-sendRPC:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":28,"symbol":"-sendRPC:encrypted:error:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":29,"symbol":"-sendRPCRequest:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":30,"symbol":"-sendRawData:withServiceType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":31,"symbol":"-sendEncryptedRawData:onService:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":33,"symbol":"-sendRawDataStream:withServiceType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":34,"symbol":"-sendHeartbeat","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":37,"symbol":"-handleBytesFromTransport:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractProtocol.h","line":38,"symbol":"-dispose","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":7,"symbol":"SDLAbstractTransport","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":9,"symbol":"delegate","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":10,"symbol":"debugConsoleGroupName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":12,"symbol":"-connect","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":13,"symbol":"-disconnect","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":14,"symbol":"-sendData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":15,"symbol":"-dispose","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAbstractTransport.h","line":16,"symbol":"-retryDelay","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAddCommandResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAddCommandResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAddSubMenuResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAddSubMenuResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":9,"symbol":"SDLAirbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":15,"symbol":"driverAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":16,"symbol":"driverSideAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":17,"symbol":"driverCurtainAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":18,"symbol":"passengerAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":19,"symbol":"passengerCurtainAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":20,"symbol":"driverKneeAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":21,"symbol":"passengerSideAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAirbagStatus.h","line":22,"symbol":"passengerKneeAirbagDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuver.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuver.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuver.h","line":16,"symbol":"ttsChunks","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuver.h","line":17,"symbol":"softButtons","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuverResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertManeuverResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertResponse.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertResponse.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAlertResponse.h","line":17,"symbol":"tryAgainTime","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":14,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":15,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":17,"symbol":"+NIGHT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":18,"symbol":"+TWILIGHT_1","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":19,"symbol":"+TWILIGHT_2","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":20,"symbol":"+TWILIGHT_3","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":21,"symbol":"+TWILIGHT_4","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":22,"symbol":"+DAY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":23,"symbol":"+UNKNOWN","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAmbientLightStatus.h","line":24,"symbol":"+INVALID","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAppHMIType.h","line":80,"symbol":"+BACKGROUND_PROCESS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAppInfo.h","line":6,"symbol":"SDLAppInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAppInfo.h","line":8,"symbol":"appDisplayName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAppInfo.h","line":9,"symbol":"appBundleID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAppInfo.h","line":10,"symbol":"appVersion","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLArtwork.h","line":13,"symbol":"SDLArtworkImageFormat","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLArtwork.h","line":13,"symbol":"SDLArtworkImageFormat","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLArtwork.h","line":14,"symbol":"SDLArtworkImageFormatPNG","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLArtwork.h","line":15,"symbol":"SDLArtworkImageFormatJPG","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLArtwork.h","line":20,"symbol":"SDLArtwork","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":9,"symbol":"SDLBeltStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":15,"symbol":"driverBeltDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":16,"symbol":"passengerBeltDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":17,"symbol":"passengerBuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":18,"symbol":"driverBuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":19,"symbol":"leftRow2BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":20,"symbol":"passengerChildDetected","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":21,"symbol":"rightRow2BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":22,"symbol":"middleRow2BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":23,"symbol":"middleRow3BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":24,"symbol":"leftRow3BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":25,"symbol":"rightRow3BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":26,"symbol":"leftRearInflatableBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":27,"symbol":"rightRearInflatableBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":28,"symbol":"middleRow1BeltDeployed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLBeltStatus.h","line":29,"symbol":"middleRow1BuckleBelted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLButtonName.h","line":148,"symbol":"+CUSTOM_BUTTON","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLButtonName.h","line":150,"symbol":"+SEARCH","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCarModeStatus.h","line":13,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCarModeStatus.h","line":15,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLChangeRegistrationResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLChangeRegistrationResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCharacterSet.h","line":31,"symbol":"+TYPE2SET","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCharacterSet.h","line":33,"symbol":"+TYPE5SET","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCharacterSet.h","line":35,"symbol":"+CID1SET","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCharacterSet.h","line":37,"symbol":"+CID2SET","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":11,"symbol":"SDLClusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":17,"symbol":"powerModeActive","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":18,"symbol":"powerModeQualificationStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":19,"symbol":"carModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLClusterModeStatus.h","line":20,"symbol":"powerModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConfiguration.h","line":16,"symbol":"SDLConfiguration","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":10,"symbol":"SDLConsoleController","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":11,"symbol":"messageList","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":12,"symbol":"atBottom","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":13,"symbol":"dateFormatter","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":16,"symbol":"messageList","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLConsoleController.h","line":18,"symbol":"-initWithTableView:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCreateInteractionChoiceSetResponse.h","line":16,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLCreateInteractionChoiceSetResponse.h","line":17,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":9,"symbol":"SDLDIDResult","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":15,"symbol":"resultCode","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":16,"symbol":"didLocation","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDIDResult.h","line":17,"symbol":"data","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":11,"symbol":"SDLDebugType","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":11,"symbol":"SDLDebugType","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":12,"symbol":"SDLDebugType_Debug","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":13,"symbol":"SDLDebugType_Transport_iAP","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":14,"symbol":"SDLDebugType_Transport_TCP","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":15,"symbol":"SDLDebugType_Protocol","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":16,"symbol":"SDLDebugType_RPC","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":17,"symbol":"SDLDebugType_APP","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":20,"symbol":"SDLDebugOutput","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":21,"symbol":"SDLDebugOutput_All","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":22,"symbol":"SDLDebugOutput_DeviceConsole","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":23,"symbol":"SDLDebugOutput_DebugToolConsole","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":24,"symbol":"SDLDebugOutput_File","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":20,"symbol":"SDLDebugOutput","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":28,"symbol":"SDLDebugTool","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":31,"symbol":"+enable","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":32,"symbol":"+disable","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":33,"symbol":"+addConsole:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":34,"symbol":"+addConsole:toGroup:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":35,"symbol":"+removeConsole:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":36,"symbol":"+removeConsole:fromGroup:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":37,"symbol":"+logInfo:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":38,"symbol":"+logFormat:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":39,"symbol":"+logInfo:withType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":40,"symbol":"+logInfo:withType:toOutput:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":41,"symbol":"+logInfo:andBinaryData:withType:toOutput:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":42,"symbol":"+logInfo:withType:toOutput:toGroup:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":44,"symbol":"+enableDebugToLogFile","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":45,"symbol":"+disableDebugToLogFile","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":46,"symbol":"+writeToLogFile:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugTool.h","line":48,"symbol":"+stringForDebugType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugToolConsole.h","line":7,"symbol":"SDLDebugToolConsole","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDebugToolConsole.h","line":10,"symbol":"-logInfo:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteCommandResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteCommandResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteFileResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteFileResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteFileResponse.h","line":18,"symbol":"spaceAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteInteractionChoiceSetResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteInteractionChoiceSetResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteSubMenuResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeleteSubMenuResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":7,"symbol":"SDLDeviceInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":13,"symbol":"hardware","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":14,"symbol":"firmwareRev","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":15,"symbol":"os","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":16,"symbol":"osVersion","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":17,"symbol":"carrier","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDeviceInfo.h","line":18,"symbol":"maxNumberRFCOMMPorts","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDiagnosticMessage.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDiagnosticMessage.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDiagnosticMessageResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDiagnosticMessageResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDiagnosticMessageResponse.h","line":16,"symbol":"messageDataResult","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDialNumber.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDialNumber.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDialNumberResponse.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDialNumberResponse.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":38,"symbol":"+TYPE2","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":40,"symbol":"+TYPE5","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":49,"symbol":"+GEN2_8_DMA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":51,"symbol":"+GEN2_6_DMA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":53,"symbol":"+MFD3","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":55,"symbol":"+MFD4","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":57,"symbol":"+MFD5","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLDisplayType.h","line":59,"symbol":"+GEN3_8_INCH","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallConfirmationStatus.h","line":14,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallConfirmationStatus.h","line":15,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":10,"symbol":"SDLECallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":16,"symbol":"eCallNotificationStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":17,"symbol":"auxECallNotificationStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLECallInfo.h","line":18,"symbol":"eCallConfirmationStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":11,"symbol":"SDLEmergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":17,"symbol":"emergencyEventType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":18,"symbol":"fuelCutoffStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":19,"symbol":"rolloverEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":20,"symbol":"maximumChangeVelocity","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEvent.h","line":21,"symbol":"multipleEvents","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEventType.h","line":15,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEmergencyEventType.h","line":16,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPData.h","line":7,"symbol":"SDLEncodedSyncPData","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPData.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPData.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPData.h","line":13,"symbol":"data","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPDataResponse.h","line":7,"symbol":"SDLEncodedSyncPDataResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPDataResponse.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEncodedSyncPDataResponse.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEndAudioPassThruResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEndAudioPassThruResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEnum.h","line":8,"symbol":"SDLEnum","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEnum.h","line":9,"symbol":"value","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEnum.h","line":12,"symbol":"-initWithValue:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEnum.h","line":14,"symbol":"-isEqualToEnum:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLEnum.h","line":16,"symbol":"value","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLFile.h","line":16,"symbol":"SDLFile","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLFile.h","line":49,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLFileManager.h","line":19,"symbol":"SDLFileName","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLFileManager.h","line":21,"symbol":"SDLFileManagerStartupCompletionHandler","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLFileManagerConstants.h","line":13,"symbol":"SDLFileManagerUploadCompletionHandler","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLFileManagerConstants.h","line":14,"symbol":"SDLFileManagerDeleteCompletionHandler","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLFileManagerConstants.h","line":15,"symbol":"SDLFileManagerListFilesCompletionHandler","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGenericResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGenericResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetDTCsResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetDTCsResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetDTCsResponse.h","line":18,"symbol":"ecuHeader","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetDTCsResponse.h","line":19,"symbol":"dtc","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleData.h","line":134,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleData.h","line":135,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleData.h","line":136,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleData.h","line":137,"symbol":"clusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleData.h","line":138,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleDataResponse.h","line":144,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleDataResponse.h","line":145,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleDataResponse.h","line":146,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleDataResponse.h","line":147,"symbol":"clusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGetVehicleDataResponse.h","line":148,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGlobalProperty.h","line":40,"symbol":"+VRHELPTITLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGlobalProperty.h","line":42,"symbol":"+VRHELPITEMS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGlobalProperty.h","line":44,"symbol":"+MENUNAME","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGlobalProperty.h","line":46,"symbol":"+MENUICON","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLGlobalProperty.h","line":48,"symbol":"+KEYBOARDPROPERTIES","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLHMICapabilities.h","line":7,"symbol":"SDLHMICapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLHMICapabilities.h","line":9,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLHMICapabilities.h","line":10,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLHeadLampStatus.h","line":32,"symbol":"ambientLightSensorStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPSessionDelegate.h","line":8,"symbol":"SDLIAPSessionDelegate","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPSessionDelegate.h","line":10,"symbol":"-onSessionInitializationCompleteForSession:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPSessionDelegate.h","line":11,"symbol":"-onSessionStreamsEnded:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPTransport.h","line":10,"symbol":"SDLIAPTransport","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPTransport.h","line":12,"symbol":"controlSession","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIAPTransport.h","line":13,"symbol":"session","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLIgnitionStableStatus.h","line":40,"symbol":"+MISSING_FROM_TRANSMITTER","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":10,"symbol":"SDLImageField","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":16,"symbol":"name","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":17,"symbol":"imageTypeSupported","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageField.h","line":18,"symbol":"imageResolution","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageFieldName.h","line":16,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageFieldName.h","line":17,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageResolution.h","line":7,"symbol":"SDLImageResolution","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageResolution.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageResolution.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageResolution.h","line":13,"symbol":"resolutionWidth","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLImageResolution.h","line":14,"symbol":"resolutionHeight","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":7,"symbol":"SDLJingle","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":10,"symbol":"+NEGATIVE_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":11,"symbol":"+POSITIVE_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":12,"symbol":"+LISTEN_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":13,"symbol":"+INITIAL_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLJingle.h","line":14,"symbol":"+HELP_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardEvent.h","line":15,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardEvent.h","line":16,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardLayout.h","line":15,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardLayout.h","line":16,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":11,"symbol":"SDLKeyboardProperties","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":14,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":17,"symbol":"language","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":18,"symbol":"keyboardLayout","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":19,"symbol":"keypressMode","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":20,"symbol":"limitedCharacterList","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeyboardProperties.h","line":21,"symbol":"autoCompleteText","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeypressMode.h","line":17,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLKeypressMode.h","line":18,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLanguage.h","line":33,"symbol":"+EN_US","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLayoutMode.h","line":15,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLayoutMode.h","line":16,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLifecycleConfiguration.h","line":21,"symbol":"SDLLogOutput","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLifecycleConfiguration.h","line":22,"symbol":"SDLLogOutputNone","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLifecycleConfiguration.h","line":23,"symbol":"SDLLogOutputConsole","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLifecycleConfiguration.h","line":24,"symbol":"SDLLogOutputFile","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLifecycleConfiguration.h","line":25,"symbol":"SDLLogOutputSiphon","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLifecycleConfiguration.h","line":21,"symbol":"SDLLogOutput","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLifecycleConfiguration.h","line":36,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLListFilesResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLListFilesResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLListFilesResponse.h","line":18,"symbol":"filenames","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLListFilesResponse.h","line":19,"symbol":"spaceAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLockScreenConfiguration.h","line":16,"symbol":"SDLLockScreenConfiguration","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLockScreenConfiguration.h","line":43,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLockScreenStatus.h","line":9,"symbol":"SDLLockScreenStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLockScreenStatus.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLockScreenStatus.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLLockScreenViewController.h","line":13,"symbol":"SDLLockScreenViewController","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLManager.h","line":24,"symbol":"SDLManagerReadyBlock","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLManager.h","line":27,"symbol":"SDLManager","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLManagerDelegate.h","line":16,"symbol":"SDLManagerDelegate","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMyKey.h","line":9,"symbol":"SDLMyKey","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMyKey.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMyKey.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMyKey.h","line":15,"symbol":"e911Override","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":17,"symbol":"SDLNotificationName","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":18,"symbol":"SDLNotificationUserInfoKey","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":41,"symbol":"SDLNotificationUserInfoObject","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":47,"symbol":"SDLTransportDidDisconnect","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":48,"symbol":"SDLTransportDidConnect","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":49,"symbol":"SDLDidReceiveError","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":50,"symbol":"SDLDidReceiveLockScreenIcon","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":51,"symbol":"SDLDidBecomeReady","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":57,"symbol":"SDLDidReceiveAddCommandResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":58,"symbol":"SDLDidReceiveAddSubMenuResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":59,"symbol":"SDLDidReceiveAlertResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":60,"symbol":"SDLDidReceiveAlertManeuverResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":61,"symbol":"SDLDidReceiveChangeRegistrationResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":62,"symbol":"SDLDidReceiveCreateInteractionChoiceSetResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":63,"symbol":"SDLDidReceiveDeleteCommandResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":64,"symbol":"SDLDidReceiveDeleteFileResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":65,"symbol":"SDLDidReceiveDeleteInteractionChoiceSetResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":66,"symbol":"SDLDidReceiveDeleteSubmenuResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":67,"symbol":"SDLDidReceiveDiagnosticMessageResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":68,"symbol":"SDLDidReceiveDialNumberResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":69,"symbol":"SDLDidReceiveEncodedSyncPDataResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":70,"symbol":"SDLDidReceiveEndAudioPassThruResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":71,"symbol":"SDLDidReceiveGenericResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":72,"symbol":"SDLDidReceiveGetDTCsResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":73,"symbol":"SDLDidReceiveGetVehicleDataResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":74,"symbol":"SDLDidReceiveListFilesResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":75,"symbol":"SDLDidReceivePerformAudioPassThruResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":76,"symbol":"SDLDidReceivePerformInteractionResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":77,"symbol":"SDLDidReceivePutFileResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":78,"symbol":"SDLDidReceiveReadDIDResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":79,"symbol":"SDLDidReceiveRegisterAppInterfaceResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":80,"symbol":"SDLDidReceiveResetGlobalPropertiesResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":81,"symbol":"SDLDidReceiveScrollableMessageResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":82,"symbol":"SDLDidReceiveSendLocationResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":83,"symbol":"SDLDidReceiveSetAppIconResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":84,"symbol":"SDLDidReceiveSetDisplayLayoutResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":85,"symbol":"SDLDidReceiveSetGlobalPropertiesResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":86,"symbol":"SDLDidReceiveSetMediaClockTimerResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":87,"symbol":"SDLDidReceiveShowConstantTBTResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":88,"symbol":"SDLDidReceiveShowResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":89,"symbol":"SDLDidReceiveSliderResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":90,"symbol":"SDLDidReceiveSpeakResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":91,"symbol":"SDLDidReceiveSubscribeButtonResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":92,"symbol":"SDLDidReceiveSubscribeVehicleDataResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":93,"symbol":"SDLDidReceiveSyncPDataResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":94,"symbol":"SDLDidReceiveUpdateTurnListResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":95,"symbol":"SDLDidReceiveUnregisterAppInterfaceResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":96,"symbol":"SDLDidReceiveUnsubscribeButtonResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":97,"symbol":"SDLDidReceiveUnsubscribeVehicleDataResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":103,"symbol":"SDLDidChangeDriverDistractionStateNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":104,"symbol":"SDLDidChangeHMIStatusNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":105,"symbol":"SDLDidReceiveAudioPassThruNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":106,"symbol":"SDLDidReceiveAppUnregisteredNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":107,"symbol":"SDLDidReceiveButtonEventNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":108,"symbol":"SDLDidReceiveButtonPressNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":109,"symbol":"SDLDidReceiveCommandNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":110,"symbol":"SDLDidReceiveEncodedDataNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":111,"symbol":"SDLDidReceiveKeyboardInputNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":112,"symbol":"SDLDidChangeLanguageNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":113,"symbol":"SDLDidChangeLockScreenStatusNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":114,"symbol":"SDLDidReceiveNewHashNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":115,"symbol":"SDLDidReceiveVehicleIconNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":116,"symbol":"SDLDidChangePermissionsNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":117,"symbol":"SDLDidReceiveSystemRequestNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":118,"symbol":"SDLDidChangeTurnByTurnStateNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":119,"symbol":"SDLDidReceiveTouchEventNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":120,"symbol":"SDLDidReceiveVehicleDataNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":122,"symbol":"SDLNotificationConstants","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":124,"symbol":"+allResponseNames","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLNotificationConstants.h","line":125,"symbol":"+allButtonEventNotifications","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":7,"symbol":"SDLOnEncodedSyncPData","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":13,"symbol":"data","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":14,"symbol":"URL","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnEncodedSyncPData.h","line":15,"symbol":"Timeout","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnHashChange.h","line":7,"symbol":"SDLOnHashChange","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnHashChange.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnHashChange.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnHashChange.h","line":13,"symbol":"hashID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnKeyboardInput.h","line":9,"symbol":"SDLOnKeyboardInput","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnKeyboardInput.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnKeyboardInput.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnKeyboardInput.h","line":15,"symbol":"event","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnKeyboardInput.h","line":16,"symbol":"data","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnLockScreenStatus.h","line":22,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnLockScreenStatus.h","line":23,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSyncPData.h","line":7,"symbol":"SDLOnSyncPData","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSyncPData.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSyncPData.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSyncPData.h","line":13,"symbol":"URL","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSyncPData.h","line":14,"symbol":"Timeout","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":10,"symbol":"SDLOnSystemRequest","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":16,"symbol":"requestType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":17,"symbol":"url","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":18,"symbol":"timeout","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":19,"symbol":"fileType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":20,"symbol":"offset","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnSystemRequest.h","line":21,"symbol":"length","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTBTClientState.h","line":9,"symbol":"SDLOnTBTClientState","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTBTClientState.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTBTClientState.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTBTClientState.h","line":15,"symbol":"state","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTouchEvent.h","line":9,"symbol":"SDLOnTouchEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTouchEvent.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTouchEvent.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTouchEvent.h","line":15,"symbol":"type","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnTouchEvent.h","line":16,"symbol":"event","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnVehicleData.h","line":143,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnVehicleData.h","line":144,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnVehicleData.h","line":145,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnVehicleData.h","line":146,"symbol":"clusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLOnVehicleData.h","line":147,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPerformInteraction.h","line":83,"symbol":"interactionLayout","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionConstants.h","line":16,"symbol":"SDLPermissionRPCName","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionConstants.h","line":17,"symbol":"SDLPermissionObserverIdentifier","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":10,"symbol":"SDLPermissionItem","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":16,"symbol":"rpcName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":17,"symbol":"hmiPermissions","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionItem.h","line":18,"symbol":"parameterPermissions","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPermissionManager.h","line":19,"symbol":"SDLPermissionManager","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":7,"symbol":"SDLPowerModeQualificationStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":13,"symbol":"+POWER_MODE_UNDEFINED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":14,"symbol":"+POWER_MODE_EVALUATION_IN_PROGRESS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":15,"symbol":"+NOT_DEFINED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeQualificationStatus.h","line":16,"symbol":"+POWER_MODE_OK","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":7,"symbol":"SDLPowerModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":13,"symbol":"+KEY_OUT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":14,"symbol":"+KEY_RECENTLY_OUT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":15,"symbol":"+KEY_APPROVED_0","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":16,"symbol":"+POST_ACCESORY_0","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":17,"symbol":"+ACCESORY_1","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":18,"symbol":"+POST_IGNITION_1","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":19,"symbol":"+IGNITION_ON_2","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":20,"symbol":"+RUNNING_2","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPowerModeStatus.h","line":21,"symbol":"+CRANK_3","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":7,"symbol":"SDLPredefinedLayout","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":13,"symbol":"+DEFAULT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":14,"symbol":"+MEDIA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":15,"symbol":"+NON_MEDIA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":16,"symbol":"+ONSCREEN_PRESETS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":17,"symbol":"+NAV_FULLSCREEN_MAP","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":18,"symbol":"+NAV_LIST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":19,"symbol":"+NAV_KEYBOARD","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":20,"symbol":"+GRAPHIC_WITH_TEXT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":21,"symbol":"+TEXT_WITH_GRAPHIC","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":22,"symbol":"+TILES_ONLY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":23,"symbol":"+TEXTBUTTONS_ONLY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":24,"symbol":"+GRAPHIC_WITH_TILES","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":25,"symbol":"+TILES_WITH_GRAPHIC","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":26,"symbol":"+GRAPHIC_WITH_TEXT_AND_SOFTBUTTONS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":27,"symbol":"+TEXT_AND_SOFTBUTTONS_WITH_GRAPHIC","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":28,"symbol":"+GRAPHIC_WITH_TEXTBUTTONS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":29,"symbol":"+TEXTBUTTONS_WITH_GRAPHIC","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":30,"symbol":"+LARGE_GRAPHIC_WITH_SOFTBUTTONS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":31,"symbol":"+DOUBLE_GRAPHIC_WITH_SOFTBUTTONS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPredefinedLayout.h","line":32,"symbol":"+LARGE_GRAPHIC_ONLY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":7,"symbol":"SDLPrerecordedSpeech","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":13,"symbol":"+HELP_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":14,"symbol":"+INITIAL_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":15,"symbol":"+LISTEN_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":16,"symbol":"+POSITIVE_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPrerecordedSpeech.h","line":17,"symbol":"+NEGATIVE_JINGLE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":8,"symbol":"SDLProtocolError","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":9,"symbol":"SDLProtocolErrorNoSecurityManager","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":8,"symbol":"SDLProtocolError","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":12,"symbol":"SDLProtocolSecurityErrorDomain","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":14,"symbol":"SDLProtocol","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":17,"symbol":"-sendStartSessionWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":18,"symbol":"-startServiceWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":19,"symbol":"-startSecureServiceWithType:completionHandler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":20,"symbol":"-sendEndSessionWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":21,"symbol":"-endServiceWithType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":22,"symbol":"-sendRPC:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":23,"symbol":"-sendRPC:encrypted:error:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":24,"symbol":"-sendRPCRequest:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":25,"symbol":"-sendRawData:withServiceType:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":26,"symbol":"-sendEncryptedRawData:onService:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocol.h","line":29,"symbol":"-handleBytesFromTransport:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":7,"symbol":"SDLFrameType","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":7,"symbol":"SDLFrameType","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":8,"symbol":"SDLFrameType_Control","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":9,"symbol":"SDLFrameType_Single","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":10,"symbol":"SDLFrameType_First","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":11,"symbol":"SDLFrameType_Consecutive","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":14,"symbol":"SDLServiceType","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":15,"symbol":"SDLServiceType_Control","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":16,"symbol":"SDLServiceType_RPC","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":17,"symbol":"SDLServiceType_Audio","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":18,"symbol":"SDLServiceType_Video","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":19,"symbol":"SDLServiceType_BulkData","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":14,"symbol":"SDLServiceType","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":22,"symbol":"SDLFrameData","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":22,"symbol":"SDLFrameData","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":23,"symbol":"SDLFrameData_Heartbeat","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":24,"symbol":"SDLFrameData_StartSession","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":25,"symbol":"SDLFrameData_StartSessionACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":26,"symbol":"SDLFrameData_StartSessionNACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":27,"symbol":"SDLFrameData_EndSession","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":28,"symbol":"SDLFrameData_EndSessionACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":29,"symbol":"SDLFrameData_EndSessionNACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":30,"symbol":"SDLFrameData_ServiceDataACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":31,"symbol":"SDLFrameData_HeartbeatACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":33,"symbol":"SDLFrameData_SingleFrame","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":35,"symbol":"SDLFrameData_FirstFrame","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":37,"symbol":"SDLFrameData_ConsecutiveLastFrame","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":41,"symbol":"SDLProtocolHeader","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":42,"symbol":"_version","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":43,"symbol":"_size","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":46,"symbol":"version","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":47,"symbol":"size","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":48,"symbol":"compressed","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":49,"symbol":"encrypted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":50,"symbol":"frameType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":51,"symbol":"serviceType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":52,"symbol":"frameData","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":53,"symbol":"sessionID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":54,"symbol":"bytesInPayload","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":56,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":57,"symbol":"-data","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":58,"symbol":"-parse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":59,"symbol":"-description","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolHeader.h","line":60,"symbol":"+headerForVersion:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":9,"symbol":"SDLProtocolListener","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":12,"symbol":"-handleProtocolStartSessionACK:sessionID:version:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":13,"symbol":"-handleProtocolStartSessionACK:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":14,"symbol":"-handleProtocolStartSessionNACK:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":15,"symbol":"-handleProtocolEndSessionACK:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":16,"symbol":"-handleProtocolEndSessionNACK:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":17,"symbol":"-handleHeartbeatForSession:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":18,"symbol":"-handleHeartbeatACK","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":19,"symbol":"-onProtocolMessageReceived:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":20,"symbol":"-onProtocolOpened","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":21,"symbol":"-onProtocolClosed","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolListener.h","line":22,"symbol":"-onError:exception:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":8,"symbol":"SDLProtocolMessage","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":10,"symbol":"header","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":11,"symbol":"payload","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":12,"symbol":"data","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":14,"symbol":"+messageWithHeader:andPayload:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":16,"symbol":"-size","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":17,"symbol":"-description","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":18,"symbol":"-rpcDictionary","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProtocolMessage.h","line":20,"symbol":"+determineVersion:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":18,"symbol":"SDLProxy","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":19,"symbol":"_version","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":20,"symbol":"_bulkSessionID","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":21,"symbol":"_isConnected","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":22,"symbol":"_alreadyDestructed","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":25,"symbol":"protocol","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":26,"symbol":"transport","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":27,"symbol":"proxyListeners","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":28,"symbol":"startSessionTimer","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":29,"symbol":"debugConsoleGroupName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":30,"symbol":"proxyVersion","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":31,"symbol":"streamingMediaManager","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":33,"symbol":"-initWithTransport:protocol:delegate:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":36,"symbol":"-dispose","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":38,"symbol":"-addDelegate:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":39,"symbol":"-removeDelegate:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":41,"symbol":"-sendRPC:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":42,"symbol":"-sendRPCRequest:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":44,"symbol":"-handleRPCDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":45,"symbol":"-handleRpcMessage:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":47,"symbol":"-handleProtocolMessage:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":49,"symbol":"-addSecurityManagers:forAppId:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":51,"symbol":"+enableSiphonDebug","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxy.h","line":52,"symbol":"+disableSiphonDebug","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyFactory.h","line":11,"symbol":"SDLProxyFactory","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyFactory.h","line":14,"symbol":"+buildSDLProxyWithListener:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyFactory.h","line":16,"symbol":"+buildSDLProxyWithListener:tcpIPAddress:tcpPort:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":68,"symbol":"SDLProxyListener","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":70,"symbol":"-onOnDriverDistraction:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":71,"symbol":"-onOnHMIStatus:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":72,"symbol":"-onProxyClosed","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":73,"symbol":"-onProxyOpened","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":77,"symbol":"-onAddCommandResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":78,"symbol":"-onAddSubMenuResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":79,"symbol":"-onAlertManeuverResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":80,"symbol":"-onAlertResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":81,"symbol":"-onChangeRegistrationResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":82,"symbol":"-onCreateInteractionChoiceSetResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":83,"symbol":"-onDeleteCommandResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":84,"symbol":"-onDeleteFileResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":85,"symbol":"-onDeleteInteractionChoiceSetResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":86,"symbol":"-onDeleteSubMenuResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":87,"symbol":"-onDiagnosticMessageResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":88,"symbol":"-onDialNumberResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":89,"symbol":"-onEncodedSyncPDataResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":90,"symbol":"-onEndAudioPassThruResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":91,"symbol":"-onError:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":92,"symbol":"-onGenericResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":93,"symbol":"-onGetDTCsResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":94,"symbol":"-onGetVehicleDataResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":95,"symbol":"-onListFilesResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":96,"symbol":"-onReceivedLockScreenIcon:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":97,"symbol":"-onOnAppInterfaceUnregistered:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":98,"symbol":"-onOnAudioPassThru:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":99,"symbol":"-onOnButtonEvent:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":100,"symbol":"-onOnButtonPress:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":101,"symbol":"-onOnCommand:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":102,"symbol":"-onOnEncodedSyncPData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":103,"symbol":"-onOnHashChange:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":104,"symbol":"-onOnKeyboardInput:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":105,"symbol":"-onOnLanguageChange:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":106,"symbol":"-onOnLockScreenNotification:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":107,"symbol":"-onOnPermissionsChange:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":108,"symbol":"-onOnSyncPData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":109,"symbol":"-onOnSystemRequest:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":110,"symbol":"-onOnTBTClientState:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":111,"symbol":"-onOnTouchEvent:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":112,"symbol":"-onOnVehicleData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":113,"symbol":"-onPerformAudioPassThruResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":114,"symbol":"-onPerformInteractionResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":115,"symbol":"-onPutFileResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":116,"symbol":"-onReadDIDResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":117,"symbol":"-onRegisterAppInterfaceResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":118,"symbol":"-onResetGlobalPropertiesResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":119,"symbol":"-onScrollableMessageResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":120,"symbol":"-onSendLocationResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":121,"symbol":"-onSetAppIconResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":122,"symbol":"-onSetDisplayLayoutResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":123,"symbol":"-onSetGlobalPropertiesResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":124,"symbol":"-onSetMediaClockTimerResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":125,"symbol":"-onShowConstantTBTResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":126,"symbol":"-onShowResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":127,"symbol":"-onSliderResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":128,"symbol":"-onSpeakResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":129,"symbol":"-onSubscribeButtonResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":130,"symbol":"-onSubscribeVehicleDataResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":131,"symbol":"-onSyncPDataResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":132,"symbol":"-onUpdateTurnListResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":133,"symbol":"-onUnregisterAppInterfaceResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":134,"symbol":"-onUnsubscribeButtonResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLProxyListener.h","line":135,"symbol":"-onUnsubscribeVehicleDataResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLPutFileResponse.h","line":23,"symbol":"spaceAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":8,"symbol":"SDLRPCMessage","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":9,"symbol":"function","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":10,"symbol":"parameters","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":11,"symbol":"messageType","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":14,"symbol":"-initWithName:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":15,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":16,"symbol":"-getFunctionName","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":17,"symbol":"-setFunctionName:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":18,"symbol":"-getParameters:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":19,"symbol":"-setParameters:value:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":21,"symbol":"bulkData","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":22,"symbol":"name","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h","line":23,"symbol":"messageType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h","line":6,"symbol":"SDLRPCMessageType","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h","line":7,"symbol":"SDLRPCMessageTypeRequest","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h","line":8,"symbol":"SDLRPCMessageTypeResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h","line":9,"symbol":"SDLRPCMessageTypeNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h","line":6,"symbol":"SDLRPCMessageType","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCNotification.h","line":7,"symbol":"SDLRPCNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCNotification.h","line":10,"symbol":"-initWithName:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCNotification.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCNotificationNotification.h","line":16,"symbol":"SDLRPCNotificationNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCNotificationNotification.h","line":18,"symbol":"notification","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCNotificationNotification.h","line":20,"symbol":"-initWithName:object:rpcNotification:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequest.h","line":7,"symbol":"SDLRPCRequest","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequest.h","line":10,"symbol":"correlationID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":62,"symbol":"SDLRPCRequestFactory","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":66,"symbol":"+buildAddCommandWithID:menuName:parentID:position:vrCommands:iconValue:iconType:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":69,"symbol":"+buildAddCommandWithID:menuName:vrCommands:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":71,"symbol":"+buildAddCommandWithID:vrCommands:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":73,"symbol":"+buildAddCommandWithID:menuName:parentID:position:vrCommands:iconValue:iconType:handler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":75,"symbol":"+buildAddCommandWithID:menuName:vrCommands:handler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":77,"symbol":"+buildAddCommandWithID:vrCommands:handler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":82,"symbol":"+buildAddSubMenuWithID:menuName:position:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":84,"symbol":"+buildAddSubMenuWithID:menuName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":89,"symbol":"+buildAlertWithTTS:alertText1:alertText2:alertText3:playTone:duration:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":91,"symbol":"+buildAlertWithTTS:alertText1:alertText2:playTone:duration:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":93,"symbol":"+buildAlertWithTTS:playTone:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":97,"symbol":"+buildAlertWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":99,"symbol":"+buildAlertWithTTSChunks:playTone:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":102,"symbol":"+buildAlertWithAlertText1:alertText2:alertText3:duration:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":104,"symbol":"+buildAlertWithAlertText1:alertText2:alertText3:duration:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":106,"symbol":"+buildAlertWithAlertText1:alertText2:duration:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":109,"symbol":"+buildAlertManeuverwithTTSchunks:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":111,"symbol":"+buildChangeRegistrationWithLanguage:hmiDisplayLanguage:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":113,"symbol":"+buildCreateInteractionChoiceSetWithID:choiceSet:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":115,"symbol":"+buildDeleteCommandWithID:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":117,"symbol":"+buildDeleteFileWithName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":119,"symbol":"+buildDialNumberWithNumber:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":121,"symbol":"+buildListFilesWithCorrelationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":123,"symbol":"+buildDeleteInteractionChoiceSetWithID:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":125,"symbol":"+buildDeleteSubMenuWithID:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":127,"symbol":"+buildEndAudioPassThruWithCorrelationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":129,"symbol":"+buildGetDTCsWithECUName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":131,"symbol":"+buildGetVehicleDataWithGPS:speed:rpm:fuelLevel:fuelLevelState:instantFuelConsumption:externalTemperature:vin:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":133,"symbol":"+buildPerformAudioPassThruWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:maxDuration:bitsPerSample:audioType:muteAudio:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":137,"symbol":"+buildPerformInteractionWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":140,"symbol":"+buildPerformInteractionWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":142,"symbol":"+buildPerformInteractionWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":144,"symbol":"+buildPerformInteractionWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":146,"symbol":"+buildPerformInteractionWithInitialPrompt:initialText:interactionChoiceSetID:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":149,"symbol":"+buildPutFileWithFileName:fileType:persistentFile:correlationId:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":150,"symbol":"+buildPutFileWithFileName:fileType:persisistentFile:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":152,"symbol":"+buildReadDIDWithECUName:didLocation:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":155,"symbol":"+buildRegisterAppInterfaceWithAppName:ttsName:vrSynonyms:isMediaApp:languageDesired:hmiDisplayLanguageDesired:appID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":157,"symbol":"+buildRegisterAppInterfaceWithAppName:isMediaApp:languageDesired:appID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":159,"symbol":"+buildRegisterAppInterfaceWithAppName:languageDesired:appID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":162,"symbol":"+buildResetGlobalPropertiesWithProperties:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":164,"symbol":"+buildSendLocationWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":166,"symbol":"+buildScrollableMessage:timeout:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":168,"symbol":"+buildSetAppIconWithFileName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":170,"symbol":"+buildSetDisplayLayout:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":174,"symbol":"+buildSetGlobalPropertiesWithHelpText:timeoutText:vrHelpTitle:vrHelp:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":176,"symbol":"+buildSetGlobalPropertiesWithHelpText:timeoutText:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":181,"symbol":"+buildSetMediaClockTimerWithHours:minutes:seconds:updateMode:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":183,"symbol":"+buildSetMediaClockTimerWithUpdateMode:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":188,"symbol":"+buildShowWithMainField1:mainField2:mainField3:mainField4:statusBar:mediaClock:mediaTrack:alignment:graphic:softButtons:customPresets:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":190,"symbol":"+buildShowWithMainField1:mainField2:statusBar:mediaClock:mediaTrack:alignment:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":192,"symbol":"+buildShowWithMainField1:mainField2:alignment:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":197,"symbol":"+buildSliderDynamicFooterWithNumTicks:position:sliderHeader:sliderFooter:timeout:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":199,"symbol":"+buildSliderStaticFooterWithNumTicks:position:sliderHeader:sliderFooter:timeout:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":202,"symbol":"+buildSoftButtonWithType:text:image:highlighted:buttonID:systemAction:handler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":205,"symbol":"+buildSpeakWithTTSChunks:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":208,"symbol":"+buildSpeakWithTTS:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":211,"symbol":"+buildSubscribeButtonWithName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":213,"symbol":"+buildSubscribeButtonWithName:handler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":215,"symbol":"+buildSubscribeVehicleDataWithGPS:speed:rpm:fuelLevel:fuelLevelState:instantFuelConsumption:externalTemperature:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":217,"symbol":"+buildShowConstantTBTWithString:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":219,"symbol":"+buildUnregisterAppInterfaceWithCorrelationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":221,"symbol":"+buildUnsubscribeButtonWithName:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":223,"symbol":"+buildUnsubscribeVehicleDataWithGPS:speed:rpm:fuelLevel:fuelLevelState:instantFuelConsumption:externalTemperature:prndl:tirePressure:odometer:beltStatus:bodyInformation:deviceStatus:driverBraking:wiperStatus:headLampStatus:engineTorque:accPedalPosition:steeringWheelAngle:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCRequestFactory.h","line":225,"symbol":"+buildUpdateTurnListWithTurnList:softButtons:correlationID:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponse.h","line":9,"symbol":"SDLRPCResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponse.h","line":12,"symbol":"correlationID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponse.h","line":13,"symbol":"success","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponse.h","line":14,"symbol":"resultCode","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponse.h","line":15,"symbol":"info","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponseNotification.h","line":16,"symbol":"SDLRPCResponseNotification","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponseNotification.h","line":18,"symbol":"response","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCResponseNotification.h","line":20,"symbol":"-initWithName:object:rpcResponse:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h","line":7,"symbol":"SDLRPCStruct","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h","line":8,"symbol":"store","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h","line":14,"symbol":"-serializeAsDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLReadDIDResponse.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLReadDIDResponse.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLReadDIDResponse.h","line":18,"symbol":"didResult","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestHandler.h","line":15,"symbol":"SDLRequestHandler","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":7,"symbol":"SDLRequestType","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":13,"symbol":"+HTTP","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":14,"symbol":"+FILE_RESUME","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":15,"symbol":"+AUTH_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":16,"symbol":"+AUTH_CHALLENGE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":17,"symbol":"+AUTH_ACK","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":18,"symbol":"+PROPRIETARY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":19,"symbol":"+QUERY_APPS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":20,"symbol":"+LAUNCH_APP","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":21,"symbol":"+LOCK_SCREEN_ICON_URL","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":22,"symbol":"+TRAFFIC_MESSAGE_CHANNEL","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":23,"symbol":"+DRIVER_PROFILE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":24,"symbol":"+VOICE_SEARCH","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":25,"symbol":"+NAVIGATION","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":26,"symbol":"+PHONE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":27,"symbol":"+CLIMATE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":28,"symbol":"+SETTINGS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":29,"symbol":"+VEHICLE_DIAGNOSTICS","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":30,"symbol":"+EMERGENCY","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":31,"symbol":"+MEDIA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRequestType.h","line":32,"symbol":"+FOTA","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLResult.h","line":46,"symbol":"+CHAR_LIMIT_EXCEEDED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenParams.h","line":10,"symbol":"SDLScreenParams","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenParams.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenParams.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenParams.h","line":16,"symbol":"resolution","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenParams.h","line":17,"symbol":"touchEventAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":13,"symbol":"SDLSecurityType","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":15,"symbol":"-initializeWithAppId:completionHandler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":16,"symbol":"-stop","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":18,"symbol":"-runHandshakeWithClientData:error:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":20,"symbol":"-encryptData:withError:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":21,"symbol":"-decryptData:withError:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSecurityType.h","line":23,"symbol":"+availableMakes","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocation.h","line":11,"symbol":"SDLSendLocation","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocation.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocation.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocationResponse.h","line":7,"symbol":"SDLSendLocationResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocationResponse.h","line":9,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSendLocationResponse.h","line":10,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetAppIconResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetAppIconResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetDisplayLayoutResponse.h","line":22,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetDisplayLayoutResponse.h","line":24,"symbol":"displayCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetDisplayLayoutResponse.h","line":25,"symbol":"buttonCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetDisplayLayoutResponse.h","line":26,"symbol":"softButtonCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetDisplayLayoutResponse.h","line":27,"symbol":"presetBankCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetGlobalProperties.h","line":92,"symbol":"menuTitle","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetGlobalProperties.h","line":93,"symbol":"menuIcon","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSetGlobalProperties.h","line":94,"symbol":"keyboardProperties","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":18,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":19,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":21,"symbol":"navigationText1","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":22,"symbol":"navigationText2","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":23,"symbol":"eta","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":24,"symbol":"timeToDestination","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":25,"symbol":"totalDistance","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":26,"symbol":"turnIcon","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":27,"symbol":"nextTurnIcon","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":28,"symbol":"distanceToManeuver","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":29,"symbol":"distanceToManeuverScale","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":30,"symbol":"maneuverComplete","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBT.h","line":31,"symbol":"softButtons","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBTResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLShowConstantTBTResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":7,"symbol":"SDLSiphonServer","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":10,"symbol":"+enableSiphonDebug","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":11,"symbol":"+disableSiphonDebug","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":12,"symbol":"+_siphonRawTransportDataFromApp:msgBytesLength:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":13,"symbol":"+_siphonRawTransportDataFromSDL:msgBytesLength:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":14,"symbol":"+_siphonNSLogData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":15,"symbol":"+_siphonFormattedTraceData:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":16,"symbol":"+_siphonIsActive","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":17,"symbol":"+init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSiphonServer.h","line":18,"symbol":"+dealloc","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":14,"symbol":"SDLSoftButton","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":17,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":18,"symbol":"-initWithHandler:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":19,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":21,"symbol":"handler","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":23,"symbol":"type","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":24,"symbol":"text","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":25,"symbol":"image","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":26,"symbol":"isHighlighted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":27,"symbol":"softButtonID","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSoftButton.h","line":28,"symbol":"systemAction","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSpeechCapabilities.h","line":12,"symbol":"SDLSpeechCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSpeechCapabilities.h","line":38,"symbol":"+SAPI_PHONEMES","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSpeechCapabilities.h","line":40,"symbol":"+LHPLUS_PHONEMES","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSpeechCapabilities.h","line":42,"symbol":"+PRE_RECORDED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSpeechCapabilities.h","line":44,"symbol":"+SILENCE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":21,"symbol":"SDLStreamingVideoError","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":21,"symbol":"SDLStreamingVideoError","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":22,"symbol":"SDLStreamingVideoErrorHeadUnitNACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":23,"symbol":"SDLSTreamingVideoErrorInvalidOperatingSystemVersion","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":24,"symbol":"SDLStreamingVideoErrorInvalidOperatingSystemVersion","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":25,"symbol":"SDLStreamingVideoErrorConfigurationCompressionSessionCreationFailure","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":26,"symbol":"SDLStreamingVideoErrorConfigurationAllocationFailure","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":27,"symbol":"SDLStreamingVideoErrorConfigurationCompressionSessionSetPropertyFailure","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":30,"symbol":"SDLEncryptionFlag","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":31,"symbol":"SDLEncryptionFlagNone","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":32,"symbol":"SDLEncryptionFlagAuthenticateOnly","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":33,"symbol":"SDLEncryptionFlagAuthenticateAndEncrypt","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":30,"symbol":"SDLEncryptionFlag","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":36,"symbol":"SDLStreamingAudioError","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":36,"symbol":"SDLStreamingAudioError","symbol_kind":"sourcekitten.source.lang.objc.decl.enum","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":37,"symbol":"SDLStreamingAudioErrorHeadUnitNACK","symbol_kind":"sourcekitten.source.lang.objc.decl.enumcase","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":40,"symbol":"SDLErrorDomainStreamingMediaVideo","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":41,"symbol":"SDLErrorDomainStreamingMediaAudio","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":43,"symbol":"SDLDefaultScreenSize","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":45,"symbol":"SDLStreamingStartBlock","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":46,"symbol":"SDLStreamingEncryptionStartBlock","symbol_kind":"sourcekitten.source.lang.objc.decl.typedef","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":51,"symbol":"SDLStreamingMediaManager","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":53,"symbol":"videoSessionConnected","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":54,"symbol":"audioSessionConnected","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":56,"symbol":"videoSessionEncrypted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":57,"symbol":"audioSessionEncrypted","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":97,"symbol":"-initWithProtocol:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":99,"symbol":"-initWithProtocol:displayCapabilities:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLStreamingMediaManager.h","line":140,"symbol":"-startAudioSessionWithTLS:startBlock:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleData.h","line":133,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleData.h","line":134,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleData.h","line":135,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleData.h","line":136,"symbol":"clusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleData.h","line":137,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h","line":124,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h","line":125,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h","line":126,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h","line":127,"symbol":"clusterModes","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSubscribeVehicleDataResponse.h","line":128,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPData.h","line":7,"symbol":"SDLSyncPData","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPData.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPData.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPDataResponse.h","line":7,"symbol":"SDLSyncPDataResponse","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPDataResponse.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSyncPDataResponse.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":7,"symbol":"SDLTBTState","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":13,"symbol":"+ROUTE_UPDATE_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":14,"symbol":"+ROUTE_ACCEPTED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":15,"symbol":"+ROUTE_REFUSED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":16,"symbol":"+ROUTE_CANCELLED","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":17,"symbol":"+ETA_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":18,"symbol":"+NEXT_TURN_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":19,"symbol":"+ROUTE_STATUS_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":20,"symbol":"+ROUTE_SUMMARY_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":21,"symbol":"+TRIP_STATUS_REQUEST","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTBTState.h","line":22,"symbol":"+ROUTE_UPDATE_REQUEST_TIMEOUT","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTCPTransport.h","line":6,"symbol":"SDLTCPTransport","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTCPTransport.h","line":7,"symbol":"socket","symbol_kind":"sourcekitten.source.lang.objc.decl.ivar","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTCPTransport.h","line":10,"symbol":"hostName","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTCPTransport.h","line":11,"symbol":"portNumber","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTTSChunkFactory.h","line":10,"symbol":"SDLTTSChunkFactory","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTTSChunkFactory.h","line":13,"symbol":"+buildTTSChunkForString:type:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTTSChunkFactory.h","line":14,"symbol":"+buildTTSChunksFromSimple:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":7,"symbol":"SDLTimerMode","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":13,"symbol":"+UP","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":14,"symbol":"+DOWN","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTimerMode.h","line":15,"symbol":"+NONE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":10,"symbol":"SDLTireStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":16,"symbol":"pressureTelltale","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":17,"symbol":"leftFront","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":18,"symbol":"rightFront","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":19,"symbol":"leftRear","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":20,"symbol":"rightRear","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":21,"symbol":"innerLeftRear","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTireStatus.h","line":22,"symbol":"innerRightRear","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchCoord.h","line":7,"symbol":"SDLTouchCoord","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchCoord.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchCoord.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchCoord.h","line":13,"symbol":"x","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchCoord.h","line":14,"symbol":"y","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEvent.h","line":7,"symbol":"SDLTouchEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEvent.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEvent.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":7,"symbol":"SDLTouchEventCapabilities","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":10,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":11,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":13,"symbol":"pressAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":14,"symbol":"multiTouchAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchEventCapabilities.h","line":15,"symbol":"doublePressAvailable","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchManager.h","line":14,"symbol":"SDLTouchManager","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchManager.h","line":16,"symbol":"touchEventDelegate","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchManagerDelegate.h","line":15,"symbol":"SDLTouchManagerDelegate","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":7,"symbol":"SDLTouchType","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":10,"symbol":"+valueOf:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":11,"symbol":"+values","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":13,"symbol":"+BEGIN","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":14,"symbol":"+MOVE","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTouchType.h","line":15,"symbol":"+END","symbol_kind":"sourcekitten.source.lang.objc.decl.method.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTransportDelegate.h","line":4,"symbol":"SDLTransportDelegate","symbol_kind":"sourcekitten.source.lang.objc.decl.protocol","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTransportDelegate.h","line":6,"symbol":"-onTransportConnected","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTransportDelegate.h","line":7,"symbol":"-onTransportDisconnected","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTransportDelegate.h","line":8,"symbol":"-onDataReceived:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTurn.h","line":9,"symbol":"SDLTurn","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTurn.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTurn.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTurn.h","line":15,"symbol":"navigationText","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLTurn.h","line":16,"symbol":"turnIcon","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":123,"symbol":"steeringWheelAngle","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":124,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":125,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":126,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":127,"symbol":"clusterModeStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleData.h","line":128,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h","line":123,"symbol":"eCallInfo","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h","line":124,"symbol":"airbagStatus","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h","line":125,"symbol":"emergencyEvent","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h","line":126,"symbol":"clusterModes","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.h","line":127,"symbol":"myKey","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUpdateTurnList.h","line":15,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUpdateTurnList.h","line":16,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUpdateTurnListResponse.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLUpdateTurnListResponse.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":9,"symbol":"SDLVRHelpItem","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":12,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":13,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":15,"symbol":"text","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":16,"symbol":"image","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVRHelpItem.h","line":17,"symbol":"position","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVehicleDataResult.h","line":10,"symbol":"SDLVehicleDataResult","symbol_kind":"sourcekitten.source.lang.objc.decl.class","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVehicleDataResult.h","line":13,"symbol":"-init","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVehicleDataResult.h","line":14,"symbol":"-initWithDictionary:","symbol_kind":"sourcekitten.source.lang.objc.decl.method.instance","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVehicleDataResult.h","line":16,"symbol":"dataType","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLVehicleDataResult.h","line":17,"symbol":"resultCode","symbol_kind":"sourcekitten.source.lang.objc.decl.property","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SmartDeviceLink.h","line":7,"symbol":"SmartDeviceLinkVersionNumber","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"},{"file":"/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SmartDeviceLink.h","line":10,"symbol":"SmartDeviceLinkVersionString","symbol_kind":"sourcekitten.source.lang.objc.decl.constant","warning":"undocumented"}],"source_directory":"/Users/joel/Projects/SDL/sdl_ios"} \ No newline at end of file